我在解析方法调用时使用以下代码:
ITypeBinding typeBinding = node.getExpression().resolveTypeBinding();
if ( typeBinding != null) //type resolution found actual type
{
className = typeBinding.getName();
}
其中className是一个包含类型名称的字符串。是否可以在方法调用中区分用户定义的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";
所解析的Java项目的根文件夹的路径。
JDT的Java Model的概念是,每个IType
都包含在以IPackageFragment
为根的IPackageFragmentRoot
中。后者代表源文件夹或库(jar,class文件夹等)。
这意味着,如果您已解决AST(DOM),则可以询问代表方法接收者的ITypeBinding
:getJavaElement()
。结果实际上应该是IType
,如果您只说type.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT)
,它将告诉您其程序包片段的根目录。
查看包片段根目录,有几个选项可以弄清楚您所拥有的确切内容,例如isArchive()
。同样,getResolvedClasspathEntry()
可以告诉您,这是如何进入编译的。根据此信息,您可以在“您的”代码和“ API”之间划出任意界限。