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.compiler.typechecker.tree.Node;
import com.redhat.ceylon.compiler.typechecker.tree.Tree;
import com.redhat.ceylon.ide.common.util.FindReferencesVisitor;
import com.redhat.ceylon.ide.common.util.FindRefinementsVisitor;
public class FindRefinementsAction extends AbstractFindAction {
private static final class Query extends FindSearchQuery {
private Query(Declaration referencedDeclaration, IProject project) {
super(referencedDeclaration, project);
}
@Override
protected Set<Node> getNodes(Tree.CompilationUnit cu,
Referenceable referencedDeclaration) {
//TODO: very ugly!!
Declaration declaration = (Declaration)
new FindReferencesVisitor(referencedDeclaration)
.getDeclaration();
FindRefinementsVisitor frv = new FindRefinementsVisitor(declaration);
cu.visit(frv);
Set<Tree.StatementOrArgument> nodes = frv.getDeclarationNodeSet();
return Collections.<Node>unmodifiableSet(nodes);
}
@Override
int limitTo() {
//TODO: is this really correct?
return IJavaSearchConstants.IGNORE_DECLARING_TYPE |
IJavaSearchConstants.DECLARATIONS;
}
@Override
protected String labelString() {
return "refinements of";
}
}
public FindRefinementsAction() {
super("Find Refinements");
setActionDefinitionId(PLUGIN_ID + ".action.findRefinements");
}
public FindRefinementsAction(CeylonSearchResultPage page, ISelection selection) {
super("Find Refinements", page, selection);
setActionDefinitionId(PLUGIN_ID + ".action.findRefinements");
}
public FindRefinementsAction(IEditorPart editor) {
super("Find Refinements", editor);
setActionDefinitionId(PLUGIN_ID + ".action.findRefinements");
}
public FindRefinementsAction(IEditorPart editor, Declaration dec) {
super("Find Refinements", editor, dec);
setActionDefinitionId(PLUGIN_ID + ".action.findRefinements");
}
@Override
boolean isValidSelection() {
if (declaration==null ||
declaration.getNameAsString()==null) {
return false;
}
else {
declaration =
new FindReferencesVisitor(declaration)
.getDeclaration();
return declaration instanceof Declaration;
}
}
@Override
public FindSearchQuery createSearchQuery() {
return new Query((Declaration) declaration, project);
}
}