【问题标题】:JavaParser doesn't update source fileJavaParser 不更新源文件
【发布时间】: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


【解决方案1】:

既然你已经有了字符串表示,那么这个呢:

Files.write(new File("Modified.java").toPath(), cu.toString(), StandardCharsets.UTF_8);

【讨论】:

  • 谢谢!这实际上可行,但这里还有一个问题,CompilationUnit 无法识别 UTF-8 字符。(例如,像 ö、ş.. 之类的字符变成 �)。
  • 我也解决了特殊字符问题。如果有人有同样的问题,你必须将编码参数传递给JavaParser,如下CompilationUnit cu = JavaParser.parser(file, "UTF-8");再次感谢@RolandIllig
  • 我假设您的源文件是用 UTF-8 编码的,因为这是当今最常见的编码。显然我错了,所以尝试使用StandardEncodings.ISO_8859_1 保存文件,这适用于标准 Windows 编码(代码页 1252)。
  • 这很奇怪。当您使用将文件解释为 ISO 8859-1 的阅读器读取实际上是 UTF-8 的文件时,字符 ö 应显示为 ö 而不是替换字符。
  • 其实你对 utf-8 是正确的。问题与 CompilationUnit 在不使用 utf-8 编码的情况下获取源文件有关。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多