package com.redhat.ceylon.eclipse.code.open; import static com.redhat.ceylon.eclipse.code.editor.Navigation.gotoDeclaration; import static com.redhat.ceylon.eclipse.util.EditorUtil.getCurrentEditor; import static com.redhat.ceylon.eclipse.util.EditorUtil.getSelection; import static com.redhat.ceylon.eclipse.util.Nodes.findNode; import static com.redhat.ceylon.eclipse.util.Nodes.getReferencedDeclaration; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.jface.text.ITextSelection; 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.eclipse.code.editor.CeylonEditor; import com.redhat.ceylon.eclipse.code.parse.CeylonParseController; public class OpenRefinedDeclarationHandler extends AbstractHandler { private Node getSelectedNode(ITextSelection textSel) { CeylonEditor editor = (CeylonEditor) getCurrentEditor(); CeylonParseController pc = editor.getParseController(); if (pc==null) { return null; } else { Tree.CompilationUnit ast = pc.getLastCompilationUnit(); if (ast == null) { return null; } else { return findNode(ast, textSel.getOffset()); } } } public boolean isEnabled() { IEditorPart editor = getCurrentEditor(); if (super.isEnabled() && editor instanceof CeylonEditor) { CeylonEditor ce = (CeylonEditor) editor; Node selectedNode = getSelectedNode(getSelection(ce)); Referenceable dec = getReferencedDeclaration(selectedNode); if (dec instanceof Declaration) { Declaration refinedDeclaration = ((Declaration) dec).getRefinedDeclaration(); return !dec.equals(refinedDeclaration); } else { return false; } } else { return false; } } @Override public Object execute(ExecutionEvent event) throws ExecutionException { IEditorPart editor = getCurrentEditor(); if (editor instanceof CeylonEditor) { CeylonEditor ce = (CeylonEditor) editor; Node selectedNode = getSelectedNode(getSelection(ce)); Referenceable dec = getReferencedDeclaration(selectedNode); if (dec instanceof Declaration) { Declaration refinedDeclaration = ((Declaration) dec).getRefinedDeclaration(); gotoDeclaration(refinedDeclaration); } } return null; } }