Как различить guish пользовательский класс и класс API, используя Eclipse JDT ITypeBinding - PullRequest
0 голосов
/ 16 февраля 2020

Я использую следующий код при разборе вызова метода:

ITypeBinding typeBinding = node.getExpression().resolveTypeBinding();
if ( typeBinding != null) //type resolution found actual type
    {
        className = typeBinding.getName();
    }

, где className - это строка, содержащая имя типа. Есть ли способ различать guish между пользовательскими Java именами классов и именами классов API или именами внешних / включаемых классов библиотек в вызове метода?

Например, при условии полного вызова String.valueOf(c);, я хочу определить String как не определенное пользователем имя класса с вызовом метода valueOf.

Для следующего фрагмента кода: MyCalculator calc = new MyCalculator(); calc.add(1,2);

Дано При вызове calc.add(1,2) я хочу определить MyCalculator как определенное пользователем имя класса с вызовом метода add

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

 private static CompilationUnit parse(String unit) {
    ASTParser parser = ASTParser.newParser(AST.JLS8);
    parser.setResolveBindings(true);
    parser.setKind(ASTParser.K_COMPILATION_UNIT);
    parser.setBindingsRecovery(true);

    File f = new File(currentFilePath);        
    String unitName = f.getName();
    parser.setUnitName(unitName);

    String[] sources = {Constants.SOURCES}; 
    String[] classpath = {Constants.CLASSPATH};

    parser.setEnvironment(classpath, sources, new String[] { "UTF-8"}, true);
    parser.setSource(unit.toCharArray());

    return (CompilationUnit) parser.createAST(null); 
}

, где Constants.SOURCES - это public static String SOURCES = "F:\\BluetoothChat"; путь к папке root анализируемого проекта Java.

1 Ответ

1 голос
/ 18 февраля 2020

JDT Java Модель имеет представление о том, что каждый IType содержится в IPackageFragment, который коренится в IPackageFragmentRoot. Последний представляет либо исходную папку, либо библиотеку (jar, папка классов и т. Д. c.).

Это означает, что если вы разрешили AST (DOM), вы можете задать ITypeBinding, представляющий метод получатель: getJavaElement(). Результат должен быть IType, который скажет вам фрагмент пакета root, если вы просто скажете type.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT).

Если посмотреть на фрагмент пакета root, есть несколько вариантов, чтобы выяснить это, что именно у вас есть, например, isArchive(). Также getResolvedClasspathEntry() может рассказать вам, как эта вещь попала в компиляцию. Основываясь на этой информации, вы можете провести любую линию между вашим кодом и API-интерфейсом.

...