gpt4 book ai didi

java - Eclipse TextEditorAction 如何知道当前文件位于哪个项目中?

转载 作者:太空宇宙 更新时间:2023-11-04 13:03:37 25 4
gpt4 key购买 nike

我正在为一个有点复杂的 Eclipse 插件开发继承代码库,该插件用于以自定义规范语言查看和编辑文件。

是什么语言并不重要,但它在功能上与 CORBA IDL 和 XML XSD 相似。在一个模块中,我可以“导入”另一个模块,并将要使用的前缀与对这些导入组件的引用相关联,以防止名称冲突。

该插件定义了一个“OpenDeclarationAction”,它的工作方式应该与 JDT 中的类似操作完全相同。当对组件的引用执行时,它将调出定义该组件的模块,并将光标放在组件的定义上。

我注意到该插件有一个错误,如果工作区中有两个不同的项目有两个同名文件,在这种自定义语言中,当我执行“OpenDeclarationAction”时,它只会打开索引工作区时首先找到的模块,而不是首选与原始模块位于同一项目中的模块。

当我查看组件的内部索引时,我发现它不知道每个模块和组件来自哪个项目,所以我认为解决这个问题很容易,因为当操作执行时,我可以将当​​前项目与索引中条目的项目进行比较,只有在匹配时才使用它。

但是,我意识到,在从自定义“org.eclipse.ui.editors.text.TextEditor”子类实例化的自定义 TextEditorAction 中,虽然我使用的“索引搜索”功能可以接受“项目”参数,但我无法从 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 总是将我发送到与引用相同的项目中的类。

我该如何设置才能实现我想要的功能?

最佳答案

ITextEditor.getEditorInput()可能包含 IEditorInput 的后代,其具有 IFileURI信息。鉴于这些,您可以通过调用解析 URI 的 IFile.getProject() 来派生 IProject。

关于java - Eclipse TextEditorAction 如何知道当前文件位于哪个项目中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34702070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com