Как узнать, используется ли переменная-член в методе, использующем код в eclipse jdt? - PullRequest
0 голосов
/ 16 мая 2011

Мне нужно найти все методы в классе, которые используют конкретную переменную-член. (например, «Ссылки» в Eclipse, но я хочу реализовать с помощью кода ...) Я использую шаблон посетителя AST, который посещает FieldDeclaration, чтобы получить имя и тип всех переменных-членов. Я также использую шаблон посетителей, который посещает узлы MethodDeclaration, чтобы получить содержимое каждого метода, используя getBody (). Теперь у меня есть имя переменной поля, тип и детали метода члена. Я думал, что могу использовать поиск строки по содержимому каждого метода-члена, но для имени переменной «a» поиск может вернуть true для ключевых слов, таких как «класс» и других тоже !!! Есть ли способ найти использование определенной переменной, соответствующей fieldDeclaration ?? (например, Binding или что-то в этом роде?). Если да, то что такое AST Node или Class?

Вот код, который я использовал ...

 SimpleNameVisitor simpleNameVisitor=new SimpleNameVisitor();
 //SimpleNameVisitor is the visitor pattern for SimpleName
 simpleNameVisitor.process(mthd.getMethodBlock());
 //mthd is the object that stores method details
 for(SimpleName simpName:simpleNameVisitor.getIdentifiers()){
    if(varName.contentEquals(simpName.getFullyQualifiedName())){
        //varName is the field variable name
        System.out.println("MethodName: "+mthd.getName());
        return;
    }
  }

Вот код, который решил проблему (предложено wjans; изменено равно contentEquals)

VariableDeclarationFragment fragment = ... ;
IBinding binding = fragment.getName().resolveBinding();


public boolean visitNode(SimpleName simpleName) throws Exception {
if (binding.toString().contentEquals(simpleName.resolveBinding().toString()) {
    ....
}

}

Ответы [ 3 ]

3 голосов
/ 16 мая 2011

Вы можете сделать что-то вроде этого:

Сохраните ссылку на привязку вашего FieldDeclaration,

VariableDeclarationFragment fragment = ... ;
IBinding binding = fragment.getName().resolveBinding();

и используйте это для сравнения с привязками при посещении SimpleName внутри вашего MethodDeclaration

public boolean visitNode(SimpleName simpleName) throws Exception {
    if (binding.equals(simpleName.resolveBinding()) {
        ....
    }
}   
1 голос
/ 16 мая 2011

Чтобы реализовать что-то вроде поиска ссылок в коде, используйте JDT SearchEngine.

        SearchRequestor findMethod = new SearchRequestor() {
            @Override
            public void acceptSearchMatch(SearchMatch match) throws CoreException {
                // analyze search match.
            }
        };
        SearchEngine engine = new SearchEngine();
        IJavaSearchScope workspaceScope = SearchEngine
                .createWorkspaceScope();
        SearchPattern pattern = SearchPattern
                .createPattern(
                        "org.eclipse.e4.core.internal.contexts.EclipseContext.strategy",
                        IJavaSearchConstants.FIELD,
                        IJavaSearchConstants.REFERENCES,
                        SearchPattern.R_EXACT_MATCH);
        SearchParticipant[] participant = new SearchParticipant[] { SearchEngine
                .getDefaultSearchParticipant() };
        engine.search(pattern, participant, workspaceScope, findMethod,
                new NullProgressMonitor());

См. http://help.eclipse.org/helios/index.jsp?topic=/org.eclipse.jdt.doc.isv/guide/jdt_int_core.htm для получения дополнительной информации о поиске Java, модели Java и AST.

См. https://bugs.eclipse.org/bugs/attachment.cgi?id=192205 для примера, который использует поиск, а затем просматривает результаты, генерируя AST.

0 голосов
/ 07 мая 2014

Посетите все SimpleNames в теле каждого метода в вашем классе:

public boolean visit(SimpleName node) {

    IBinding binding = node.resolveBinding();

    if (binding instanceof IVariableBinding) {

        IVariableBinding variable = (IVariableBinding) binding;

        if (variable.isField())

            //do whatever you wanna do with the field
            System.out.println("field: " + node.toString());

    }

    return super.visit(node);
}
...