Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从活动的Eclipse编辑器中获取当前方法?_Java_Eclipse_Eclipse Plugin_Eclipse Jdt - Fatal编程技术网

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

Java 如何从活动的Eclipse编辑器中获取当前方法?,java,eclipse,eclipse-plugin,eclipse-jdt,Java,Eclipse,Eclipse Plugin,Eclipse Jdt,我目前正在开发一个Eclipse插件,它将帮助我编写代码。基本上是一个字符串片段库 当创建一个新的时,我想给它一个分类为ClassName.MethodName.X的ID 获取编辑器非常简单: IWorkbenchPage page = PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getActivePage(); IEditorPart activeEditor = page.getA

我目前正在开发一个Eclipse插件,它将帮助我编写代码。基本上是一个字符串片段库

当创建一个新的时,我想给它一个分类为ClassName.MethodName.X的ID

获取编辑器非常简单:

IWorkbenchPage page = PlatformUI.getWorkbench()
                        .getActiveWorkbenchWindow().getActivePage();
IEditorPart activeEditor = page.getActiveEditor();
if(activeEditor.getClass().getName().endsWith("CompilationUnitEditor")){
// do something
}
现在。。。有没有任何方法可以使用EclipseJDTAPI来获取文本游标当前所在的方法的名称

编辑: 好啊在安德鲁的帮助下,我得到了:

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

效果不错。尽管使用受限类是一种肮脏的解决方案。

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

第一,环绕法:

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;
重要的方法是
getElementAt
getSelection

下面是如何找到插入符号当前选择的方法:

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测试。

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

不幸的是,getElementAt()是一个受保护的抽象方法。我该怎么用呢?对…错过了。您可以在ITypeRoot上调用getElementAt。因此,EditorUtility.getEditorInputJavaElement(这个,false).getElementAt(…)应该可以正常工作。我想出了一些办法。谢谢你的提示;)遗憾的是,如果不使用内部API,似乎无法做到这一点。Eclipse中的内部API只是一个建议。如果不使用它们,您将无法完成任何事情。我认为您拼写错误了
单元
(beeing elem),并且所选的
没有声明(IJavaElement)。但它是有效的。谢谢