如何使用Eclipse JDT ITypeBinding区分用户定义的类和API类

问题描述 投票:0回答:1

我在解析方法调用时使用以下代码:

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

其中className是一个包含类型名称的字符串。是否可以在方法调用中区分用户定义的Java类名称和API类名称或外部/包含的库类名称?

例如,给定一个完整的调用String.valueOf(c);,我想通过方法调用StringvalueOf检测为非用户定义的类名。

对于以下代码段:MyCalculator calc = new MyCalculator(); calc.add(1,2);

鉴于调用calc.add(1,2),我想通过方法调用MyCalculatoradd检测为用户定义的类名

我包括一个代码片段,显示了我如何设置解析。也许有人可以指出设置中的任何错误。

 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.SOURCESpublic static String SOURCES = "F:\\BluetoothChat";所解析的Java项目的根文件夹的路径。

eclipse parsing eclipse-jdt method-invocation
1个回答
1
投票

JDT的Java Model的概念是,每个IType都包含在以IPackageFragment为根的IPackageFragmentRoot中。后者代表源文件夹或库(jar,class文件夹等)。

这意味着,如果您已解决AST(DOM),则可以询问代表方法接收者的ITypeBindinggetJavaElement()。结果实际上应该是IType,如果您只说type.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT),它将告诉您其程序包片段的根目录。

查看包片段根目录,有几个选项可以弄清楚您所拥有的确切内容,例如isArchive()。同样,getResolvedClasspathEntry()可以告诉您,这是如何进入编译的。根据此信息,您可以在“您的”代码和“ API”之间划出任意界限。

© www.soinside.com 2019 - 2024. All rights reserved.