如何从活动的Eclipse编辑器中获取当前方法?

10

我目前正在开发一款用于帮助编码的Eclipse插件。基本上是一个字符串片段库。

在创建新的字符串片段时,我想给它一个ID,格式为ClassName.MethodName.X。

获取编辑器非常简单:

IWorkbenchPage page = PlatformUI.getWorkbench()
                        .getActiveWorkbenchWindow().getActivePage();
IEditorPart activeEditor = page.getActiveEditor();
if(activeEditor.getClass().getName().endsWith("CompilationUnitEditor")){
// do something
}

现在... 有没有办法使用Eclipse jdt API获取文本光标当前所在方法的名称?

编辑: 好的。 在Andrew的帮助下,我得到了以下内容:

IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
IEditorPart activeEditor = page.getActiveEditor();

if(activeEditor instanceof JavaEditor) {
    ICompilationUnit root = (ICompilationUnit) EditorUtility.getEditorInputJavaElement(activeEditor, false);
    try {
        ITextSelection sel = (ITextSelection) ((JavaEditor) activeEditor)
            .getSelectionProvider().getSelection();
        int offset = sel.getOffset();
        IJavaElement element = root.getElementAt(offset);
        if(element.getElementType() == IJavaElement.METHOD){
            return element.getElementName());
        }
    } catch (JavaModelException e) {
        e.printStackTrace();
    }
}

效果还不错。虽然使用受限的类是一种有点麻烦的解决方案。

2个回答

11

这里是不使用Eclipse内部API完成相同操作的方式:

IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
ITextEditor editor = (ITextEditor) page.getActiveEditor();
IJavaElement elem = JavaUI.getEditorInputJavaElement(editor.getEditorInput());
if (elem instanceof ICompilationUnit) {
    ITextSelection sel = (ITextSelection) editor.getSelectionProvider().getSelection();
    IJavaElement selected = ((ICompilationUnit) elem).getElementAt(sel.getOffset());
    if (selected != null && selected.getElementType() == IJavaElement.METHOD) {
         return (IMethod) selected;
    }
}
return null;

1
我认为你拼错了 unit(应该是 elem),而且 selected 没有声明为 IJavaElement。但它能正常工作。谢谢。 - Ivan Ferrer Villa

6

我不确定您是要求与当前插入符位置相关的方法,还是插入符位置所选取的方法。我会分别向您展示两种方法。

首先是周围的方法:

IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
IEditorPart activeEditor = page.getActiveEditor();
if(activeEditor instanceof JavaEditor) {
    IJavaElement elt = ((JavaEditor) activeEditor).getElementAt(((TextSelection) activeEditor.getSelection()).getOffset(), true);
    if (elt.getElementType == IJavaElement.METHOD) {
        return (IMethod) elt;
    }
}
return null;

重要的方法有getElementAtgetSelection
以下是如何找到当前文本插入符所选方法的方法:
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
IEditorPart activeEditor = page.getActiveEditor();
if(activeEditor instanceof JavaEditor) {
    ITypeRoot root = EditorUtility.getEditorInputJavaElement(this, false);
    TextSelection sel = ((TextSelection) activeEditor.getSelection());
    IJavaElement elt = root.codeSelect(sel.getOffset(), sel.getLength();
    if (elt.getElementType == IJavaElement.METHOD) {
        return (IMethod) elt;
    }
}
return null;

这里有一个有趣的方法,codeSelect可以在给定编译单元或类文件的上下文中解析当前选择的内容。
实际代码会有所不同,因为你需要在许多地方检查null,但你不需要进行任何其他的instanceof测试。

很遗憾,getElementAt()是一个受保护的抽象方法。我该如何使用它? - Michael
好的...我错过了那个。您可以在ITypeRoot上调用getElementAt。因此,EditorUtility.getEditorInputJavaElement(this, false).getElementAt(...)应该可以工作。 - Andrew Eisenberg
好的,我想出了一些东西。感谢你的提示 ;) - Michael
1
很遗憾,似乎没有办法在不使用内部API的情况下完成这个任务。 - Brian Duff
Eclipse中的内部API只是一种建议。如果不使用它们,你将无法完成任何工作。 - Andrew Eisenberg
@BrianDuff 至少在这种情况下可以不使用内部API。我已经添加了一种方法。 - Cwt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接