package com.redhat.ceylon.eclipse.code.search;
import static com.redhat.ceylon.eclipse.ui.CeylonPlugin.PLUGIN_ID;
import java.util.Collections;
import java.util.Set;
import org.eclipse.core.resources.IProject;
import org.eclipse.jdt.core.search.IJavaSearchConstants;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IEditorPart;
import com.redhat.ceylon.model.typechecker.model.Declaration;
import com.redhat.ceylon.model.typechecker.model.Referenceable;
import com.redhat.ceylon.model.typechecker.model.TypeDeclaration;
import com.redhat.ceylon.model.typechecker.model.TypeParameter;
import com.redhat.ceylon.compiler.typechecker.tree.Node;
import com.redhat.ceylon.compiler.typechecker.tree.Tree;
import com.redhat.ceylon.ide.common.util.FindSubtypesVisitor;
public class FindSubtypesAction extends AbstractFindAction {
private static final class Query extends FindSearchQuery {
private Query(TypeDeclaration referencedDeclaration,
IProject project) {
super(referencedDeclaration, project);
}
@Override
protected Set<Node> getNodes(Tree.CompilationUnit cu,
Referenceable referencedDeclaration) {
FindSubtypesVisitor frv =
new FindSubtypesVisitor((TypeDeclaration) referencedDeclaration);
cu.visit(frv);
@SuppressWarnings("unchecked")
Set<Node> nodes = frv.getDeclarationNodeSet();
return Collections.<Node>unmodifiableSet(nodes);
}
@Override
int limitTo() {
return IJavaSearchConstants.IMPLEMENTORS;
}
@Override
protected String labelString() {
return "subtypes of";
}
}
public FindSubtypesAction() {
super("Find Subtypes");
setActionDefinitionId(PLUGIN_ID + ".action.findSubtypes");
}
public FindSubtypesAction(CeylonSearchResultPage page, ISelection selection) {
super("Find Subtypes", page, selection);
setActionDefinitionId(PLUGIN_ID + ".action.findSubtypes");
}
public FindSubtypesAction(IEditorPart editor) {
super("Find Subtypes", editor);
setActionDefinitionId(PLUGIN_ID + ".action.findSubtypes");
}
public FindSubtypesAction(IEditorPart editor, Declaration dec) {
super("Find Subtypes", editor, dec);
setActionDefinitionId(PLUGIN_ID + ".action.findSubtypes");
}
@Override
boolean isValidSelection() {
return declaration instanceof TypeDeclaration &&
declaration.getNameAsString()!=null &&
!(declaration instanceof TypeParameter);
}
@Override
public FindSearchQuery createSearchQuery() {
return new Query((TypeDeclaration) declaration, project);
}
}