Как получить текущий метод из активного редактора Eclipse? - PullRequest
10 голосов
/ 12 марта 2012

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

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

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

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

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

Ответы [ 2 ]

11 голосов
/ 06 ноября 2012

Здесь то же самое делается без использования внутренних 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;
6 голосов
/ 13 марта 2012

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

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

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, который разрешает текущий выбор в контексте данной единицы компиляции или файла класса.

Фактический код будет другим, так как во многих местах вам нужно проверять нулевое значение, но вам не нужно выполнять какие-либо другие экземпляры тестов.

...