Как получить текущий метод из активного редактора Eclipse?

В настоящее время я работаю над дополнением Eclipse, которое поможет мне кодировать. В основном библиотека фрагментов String.

При создании нового я хотел бы дать ему идентификатор классов ClassName.MethodName.X.

Получение редактора довольно просто:

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

Теперь... есть ли способ использовать API-интерфейсы Eclipse jdt для получения имени метода, в котором находится мой текстовый курсор?

Изменить: ОК. С помощью Андрея, вот что я получил:

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

Работает очень хорошо. Хотя это своего рода грязное решение для использования ограниченных классов.

Ответ 1

Не уверен, что вы запрашиваете метод, окружающий текущее местоположение каретки, или метод, выбранный местоположением каретки. Я покажу вам обоим.

Во-первых, окружающий метод:

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 во многих местах, но вам не нужно делать никаких других экземпляров тестов.

Ответ 2

Здесь то же самое делается без использования внутренних API-интерфейсов Eclipse:

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;