【问题标题】:How do I get the current method from the active Eclipse editor?如何从活动的 Eclipse 编辑器中获取当前方法?
【发布时间】:2012-03-12 13:09:17
【问题描述】:

我目前正在开发一个可以帮助我编码的 Eclipse 插件。基本上是一个 String sn-ps 库。

当创建一个新的时,我很乐意给它一个 ClassName.MethodName.X 的 ID。

获取编辑器非常简单:

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();
    }
}

效果很好。虽然使用受限类是一种肮脏的解决方案。

【问题讨论】:

    标签: java eclipse eclipse-plugin eclipse-jdt


    【解决方案1】:

    这里不使用内部 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;
    

    【讨论】:

    • 我认为您拼错了unit(beeing elem)并且selected 没有声明(IJavaElement)。但它有效。谢谢。
    【解决方案2】:

    不确定您是在询问当前插入符号位置周围的方法,还是插入符号位置正在选择的方法。我会告诉你两个。

    一、环绕法:

    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() 是一个受保护的抽象方法。我将如何使用它?
    • 对....错过了。您可以在 ITypeRoot 上调用 getElementAt。因此,EditorUtility.getEditorInputJavaElement(this, false).getElementAt(...) 应该可以工作。
    • 好吧。我想通了。感谢您的提示;)
    • 很遗憾,如果不使用内部 API,似乎无法做到这一点。
    • Eclipse 中的内部 API 只是一个建议。如果不使用它们,您将无法完成任何事情。
    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 2015-10-23
    • 2015-02-21
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多