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

Mic*_*ael 10 java eclipse eclipse-plugin eclipse-jdt

我目前正在开发一个Eclipse插件,它可以帮助我编码.基本上是一个String片段库.

在创建一个新的时,我很乐意给它一个Class of Class Class.MethodName.X的ID.

获取编辑器非常简单:

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

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

编辑:好的.在安德鲁的帮助下,这就是我得到的:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

工作得很好.虽然使用受限制的类是一种肮脏的解决方案.

sev*_*rce 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;
Run Code Online (Sandbox Code Playgroud)


And*_*erg 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;
Run Code Online (Sandbox Code Playgroud)

重要的方法是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;
Run Code Online (Sandbox Code Playgroud)

这里有趣的方法是codeSelect解析给定编译单元或类文件的上下文中的当前选择.

实际代码将有所不同,因为您需要在许多地方检查null,但您不需要执行任何其他实例测试.