我正在为一个有点复杂的Eclipse插件开发一个继承的代码库,该插件用于以自定义规范语言查看和编辑文件。
语言是什么并不重要,但它与CORBA IDL和XML XSD具有功能相似性。在一个模块中,我可以“导入”另一个模块,并将要使用的前缀与对这些导入组件的引用相关联,以防止名称冲突。
该插件定义了一个“OpenDeclarationAction”,它应该与JDT中的类似动作完全相同。在对组件的引用上执行时,它将调出定义该组件的模块,并将光标放在组件的定义上。
我注意到插件有一个bug,如果工作区中有两个不同的项目,有两个同名的文件,在这个自定义语言中,当我执行“OpenDeclarationAction”时,它只会打开那个模块。首先在索引工作空间时找到,而不是优先选择与原始模块相同的项目中的模块。
当我查看组件的内部索引时,我看到它不是每个模块和组件来自哪个项目,所以我认为修复这很容易,因为当动作执行时,我可以将当前项目与索引中条目的项目,只有在匹配时才使用它。
然而,我意识到在我的自定义TextEditorAction中,它是从我的自定义“org.eclipse.ui.editors.text.TextEditor”子类实例化的,虽然我使用的“索引搜索”功能可以接受“ project“参数,我无法从TextEditorAction内部找到知道当前项目是什么。
例如,这里是我的“TextEditor”子类的摘录,我创建了TextEditorAction子类(OpenDeclarationAction):
@Override
protected void createActions() {
super.createActions();
IAction action = null;
ResourceBundle bundle = ResourceBundle.getBundle(YangEditorMessages.getBundleName());
action = new TextOperationAction(bundle, "ContentFormat_", this, ISourceViewer.FORMAT); //$NON-NLS-1$
action.setActionDefinitionId(IYangEditorActionDefinitionIds.FORMAT);
setAction("FormatDocument", action); //$NON-NLS-1$
action = getAction(ITextEditorActionConstants.CONTENT_ASSIST_CONTEXT_INFORMATION);
action = new OpenDeclarationAction(bundle, "OpenDeclaration_", this); //$NON-NLS-1$
action.setActionDefinitionId(IYangEditorActionDefinitionIds.OPEN_DECLARATION);
setAction("OpenDeclaration", action); //$NON-NLS-1$
markAsStateDependentAction("OpenDeclaration", true); //$NON-NLS-1$
markAsSelectionDependentAction("OpenDeclaration", true); //$NON-NLS-1$
这是我的一些OpenDeclarationAction类:
public class OpenDeclarationAction extends TextEditorAction {
public OpenDeclarationAction(ResourceBundle bundle, String prefix, ITextEditor editor) {
super(bundle, prefix, editor);
}
@Override
public void run() {
YangEditor editor = (YangEditor) getTextEditor();
try {
ISelection selection = editor.getSelectionProvider().getSelection();
Module module = YangParserUtil.parseYangFile(editor.getDocument().get().toCharArray());
ASTNode node = module.getNodeAtPosition(((ITextSelection) selection).getOffset());
我已经探索了发送到OpenDeclarationAction类的所有参数,包括它们的所有“get”方法,以查看是否存在可能导致当前项目的任何调用链。这似乎是一个死路一条。如果项目可用,我想在某处必须有一些“反向”数据结构,它将从我拥有的其他一些数据中为我提供项目。
我知道这样的事情是可能的,因为我在两个不同的项目中使用相同的Java类来尝试相同的情况。 Eclipse总是把我发送到与引用相同的项目中的类。
我可以做些什么来设置它以便这样做我想要的?
答案 0 :(得分:0)
ITextEditor.getEditorInput()可能包含IEditorInput
的后代,其中包含IFile或URI个信息。鉴于这些,您可以通过调用解析URI的IFile.getProject()
来派生IProject。