【发布时间】:2016-08-10 19:22:10
【问题描述】:
我正在使用 JavaParser 并关注其 Wiki。问题是即使我更改了方法的名称并向其添加了参数,文件也不会更新。换言之,不会保存更改。当我 System.out.println 更改了 CompilationUnit 时,它会打印更改,但这些更改根本不会影响源文件。
有像CompilationUnit.update() 这样的东西还是我错过了什么?
我在 Wiki 中使用的示例:
files_list = FilePicker.chooseAndGetJavaFiles();
if (files_list == null || files_list.isEmpty()) {
Errors.showError(Errors.COMMENT_GENERATOR_FILELIST_NULL_OR_EMPTY);
} else {
CompilationUnit cu = null;
FileInputStream in = new FileInputStream(files_list.get(0));
try {
cu = JavaParser.parse(in);
} catch (ParseException ex) {
Logger.getLogger(CommentGenerator.class.getName()).log(Level.SEVERE, null, ex);
} finally{
in.close();
}
new MethodChangerVisitor().visit(cu,null);
System.out.println(cu.toString());
}
}
private static class MethodChangerVisitor extends VoidVisitorAdapter{
@Override
public void visit(MethodDeclaration n, Object arg) {
// change the name of the method to upper case
n.setName(n.getName().toUpperCase());
// create the new parameter
Parameter newArg = ASTHelper.createParameter(ASTHelper.INT_TYPE, "value");
// add the parameter to the method
ASTHelper.addParameter(n, newArg);
}
}
编辑: 这是解决方案; 添加下线;
Files.write(new File("Modified.java").toPath(), cu.toString(), StandardCharsets.UTF_8);
更改行下也可以使用特殊字符(例如“ş,ö,ü ...)
cu = JavaParser.parse(files_list.get(0));
到
cu = JavaParser.parse(files_list.get(0),"UTF-8");
【问题讨论】:
-
您为什么希望 解析器 修改其数据源?它不应该,特别是因为源代码可能不是来自文件,而是来自其他数据源。并且解析器不知道如何修改任意 InputStream。
-
@RolandIllig 我不明白你在这里的陈述。如果您查看JavaParser 页面,它具有可修改的功能。另外如果不修改源代码,为什么还有setName(),setComment()之类的方法?
-
傻瓜,我现在明白了,但问题仍然存在,我该如何更改源文件?
-
@Nerzid:如果我没记错的话应该是
cu = JavaParser.parse(files_list.get(0), StandardCharsets.UTF_8);?您使用字符串“UTF-8”的示例在我这边不起作用,另一方面,常量可以...
标签: java abstract-syntax-tree visitor-pattern javaparser compilationunit