Я использую следующий код при разборе вызова метода:
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.