Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

List all subclasses with fully qualified names

Tags:

java

eclipse

I would like to get a list of all subclasses of a given class with their fully qualified names. I wanted to copy it from Eclipse and paste into a text file like this:

 some.package.Class1
 some.package.Class2
 some.other.package.Class3
 ...

I've tried:

  • doing Search | Java | Type, Limit to implementors. But this one for some strange reasons doesn't list subclasses of subclasses, only direct descendants.
  • opening Hierarchy view for the class which prints all the subclasses in a tree component, but this view doesn't allow me to select all the rows and copy their names.

Any other tricks? There are hundreds of classes, so I wanted to avoid doing it manually.

like image 834
Grzegorz Oledzki Avatar asked Sep 15 '09 09:09

Grzegorz Oledzki


2 Answers

The method in the Hierarchy view which does build the hierarchy tree is in the org.eclipse.jdt.internal.ui.typehierarchy.TypeHierarchyLifeCycle:

private ITypeHierarchy createTypeHierarchy(IJavaElement element, IProgressMonitor pm) throws JavaModelException {
    if (element.getElementType() == IJavaElement.TYPE) {
        IType type= (IType) element;
        if (fIsSuperTypesOnly) {
            return type.newSupertypeHierarchy(pm);
        } else {
            return type.newTypeHierarchy(pm);
        }
    } else {

Which uses org.eclipse.jdt.internal.core.SourceType class

/**
 * @see IType
 */
public ITypeHierarchy newTypeHierarchy(IJavaProject project, IProgressMonitor monitor) throws JavaModelException {
    return newTypeHierarchy(project, DefaultWorkingCopyOwner.PRIMARY, monitor);
}

So if you can get a IJavaElement, you can check those classes to emulate the same result.

It uses a org.eclipse.jdt.internal.core.CreateTypeHierarchyOperation

like image 152
VonC Avatar answered Sep 25 '22 20:09

VonC


Update: my original answer wouldn't work as there is no context to the structured selection.

This answer shows how to contribute the action to the context menu and retrieve the structured selection. You can modify that type's execute method to process the Hierarchy (as VonC suggests, +1) and obtain all the sub-types and set the content to the clipboard as follows:

public Object execute(ExecutionEvent event) throws ExecutionException {
    IWorkbenchPart activePart = HandlerUtil.getActivePart(event);
    try {
        IStructuredSelection selection = SelectionConverter
                .getStructuredSelection(activePart);

        IJavaElement[] elements = SelectionConverter.getElements(selection);

        if (elements != null && elements.length > 0) {
            if (elements[0] != null && elements[0] instanceof IType) {
                IType type = (IType)elements[0];

                ITypeHierarchy hierarchy =
                    type.newTypeHierarchy(new NullProgressMonitor());

                IType[] subTypes = hierarchy.getAllSubtypes(type);

                StringBuffer buf = new StringBuffer();
                for (IType iType : subTypes) {
                    buf.append(iType.getFullyQualifiedName()).append("\n");
                }

                Shell shell = HandlerUtil.getActiveShell(event);

                Clipboard clipboard = new Clipboard(shell.getDisplay());

                clipboard.setContents(
                    new Object[]{buf.toString()}, 
                    new Transfer[]{TextTransfer.getInstance()});
            }
        }
    } catch (JavaModelException e) {
        logException(e);
    }
    return null;
}
like image 26
Rich Seller Avatar answered Sep 24 '22 20:09

Rich Seller