解析 java 文件不在主源文件夹中时绑定为空

问题描述

我正在使用 Eclipse JDT Parser 通过以下访问者方法解析和解析 TypeDeclaration:

  @Override
  public boolean visit(TypeDeclaration td) {
    Type type = td.isInterface() ? NodeType.INTERFACE_DECLaraTION : NodeType.CLASS_DECLaraTION;
    ITypeBinding tdBinding = td.resolveBinding();
    // isFromSource
    String qname = tdBinding.getQualifiedname();

    ElementNode node =
        new ElementNode(
            GraphUtil.nid(),Language.JAVA,type,td.toString(),td.getName().toString(),qname);
    node.setRange(computerange(td));
    graph.addVertex(node);
    defPool.put(qname,node);

    if (td.isPackageMemberTypeDeclaration()) {
      graph.addEdge(root,node,new Edge(GraphUtil.eid(),EdgeType.CHILD));
    }

    parseMembers(td,tdBinding,node);

    return true;
  }

它适用于 ma​​in文件夹下的所有 java 文件,但是,我发现它在处理不在 ma​​intdBinding.getQualifiedname(); 中报告 NullPointerException /strong> 但noGPlay 文件夹。

这是运行日志:

[INFO ] 2021-03-29 17:10:28,807 method:org.slf4j.helpers.AbstractLogger.handle_1ArgsCall(AbstractLogger.java:386)
Start Parsing /Users/symbolk/coding/data/repos/LeafPic/app/src/main/java/org/horaapps/leafpic/progress/ErrorCause.java
[INFO ] 2021-03-29 17:10:28,824 method:org.slf4j.helpers.AbstractLogger.handle_1ArgsCall(AbstractLogger.java:386)
Start Parsing /Users/symbolk/coding/data/repos/LeafPic/app/src/main/java/org/horaapps/leafpic/data/StorageHelper.java
[INFO ] 2021-03-29 17:10:28,843 method:org.slf4j.helpers.AbstractLogger.handle_1ArgsCall(AbstractLogger.java:386)
Start Parsing /Users/symbolk/coding/data/repos/LeafPic/app/src/main/java/org/horaapps/leafpic/activities/MainActivity.java
[INFO ] 2021-03-29 17:10:28,848 method:org.slf4j.helpers.AbstractLogger.handle_1ArgsCall(AbstractLogger.java:386)
Start Parsing /Users/symbolk/coding/data/repos/LeafPic/app/src/noGPlay/java/org/horaapps/leafpic/activities/DonateActivity.java
Exception in thread "main" java.lang.NullPointerException
    at edu.pku.code2graph.gen.jdt.MemberVisitor.visit(MemberVisitor.java:45)
    at org.eclipse.jdt.core.dom.TypeDeclaration.accept0(TypeDeclaration.java:509)
    at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:3012)
    at org.eclipse.jdt.core.dom.ASTNode.acceptChildren(ASTNode.java:3083)
    at org.eclipse.jdt.core.dom.compilationunit.accept0(compilationunit.java:258)
    at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:3012)
    at edu.pku.code2graph.gen.jdt.JdtGenerator$1.acceptAST(JdtGenerator.java:77)
    at org.eclipse.jdt.core.dom.compilationunitResolver.resolve(compilationunitResolver.java:1065)
    at org.eclipse.jdt.core.dom.compilationunitResolver.resolve(compilationunitResolver.java:661)
    at org.eclipse.jdt.core.dom.ASTParser.createASTs(ASTParser.java:1001)
    at edu.pku.code2graph.gen.jdt.JdtGenerator.generate(JdtGenerator.java:67)
    at edu.pku.code2graph.gen.Generator$Configurator.files(Generator.java:35)
    at edu.pku.code2graph.gen.Generators.generateFromFiles(Generators.java:85)
    at edu.pku.code2graph.diff.cochange.ChangeLint.offline(ChangeLint.java:142)
    at edu.pku.code2graph.diff.cochange.ChangeLint.main(ChangeLint.java:59)

这是我配置 ASTParser 的方式,我确定 sourcepathEntries 包含文件所在的文件夹 (/Users/symbolk/coding/data/repos/LeafPic/app/src/noGPlay/java/org/horaapps/leafpic/activities):

    String[] encodings = new String[srcFolderPaths.length];
    Arrays.fill(encodings,"UTF-8");

    ASTParser parser = ASTParser.newParser(AST.JLS14);
    Map<String,String> options = JavaCore.getoptions();
    options.put(JavaCore.COMPILER_COMPLIANCE,JavaCore.VERSION_1_8);
    options.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM,JavaCore.VERSION_1_8);
    options.put(JavaCore.COMPILER_SOURCE,JavaCore.VERSION_1_8);
    options.put(JavaCore.COMPILER_DOC_COMMENT_SUPPORT,JavaCore.ENABLED);
    JavaCore.setComplianceOptions(JavaCore.VERSION_1_8,options);
    parser.setCompilerOptions(options);

    //        parser.setProject(WorkspaceUtilities.javaProject);
    parser.setKind(ASTParser.K_COMPILATION_UNIT);
    parser.setEnvironment(new String[] {JRE_PATH},srcFolderPaths,encodings,true);
    parser.setResolveBindings(true);
    parser.setBindingsRecovery(true);

//    AbstractJdtVisitor visitor = new ExpressionVisitor();
    AbstractJdtVisitor visitor = new MemberVisitor();
    // create nodes and nesting edges while visiting the ASTs
    encodings = new String[srcPaths.length];
    Arrays.fill(encodings,"UTF-8");

    parser.createASTs(
        srcPaths,new String[] {},new FileASTRequestor() {
          @Override
          public void acceptAST(String sourceFilePath,compilationunit cu) {
            // use relative path to project root
            visitor.setFilePath(sourceFilePath);
            visitor.setCu(cu);
            cu.accept(visitor);
          }
        },null);

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)