问题描述
我正在使用 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;
}
它适用于 main 源文件夹下的所有 java 文件,但是,我发现它在处理不在 maintdBinding.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 (将#修改为@)