我正在使用Eclipse JDT修改Java源代码。这分为三个步骤:


首先,我创建一个org.eclipse.jdt.core.dom.CompilationUnit的实例,并使用ASTVisitor调用它的accept()方法。
然后,我操作CompilationUnit。我将ASTNode删除并添加到树中(此处未显示)
然后,将compilationUnit.toString()写回到文件中。


创建编译单元:

ASTParser parser = ASTParser.newParser(AST.JLS11);
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setSource(readSourceCode("FooBar.java"));
parser.setStatementsRecovery(false);
Hashtable<String, String> options = JavaCore.getDefaultOptions();
options.put("org.eclipse.jdt.core.compiler.doc.comment.support", "enabled");
parser.setCompilerOptions(options);
CompilationUnit compUnit = (CompilationUnit) parser.createAST(null);
compUnit.accept(new FooBarVisitor());


将更改的compUnit写入文件:

writer = new BufferedWriter(new FileWriter(newFilePath));
Map options = DefaultCodeFormatterConstants.getEclipseDefaultSettings();
CodeFormatter formatter = ToolFactory.createCodeFormatter(options);
String sourceCode = result.getCompilationUnit().toString();
int formatType = CodeFormatter.K_COMPILATION_UNIT | CodeFormatter.F_INCLUDE_COMMENTS | CodeFormatter.K_UNKNOWN;
TextEdit edit = formatter.format(formatType, sourceCode, 0, sourceCode.length(), 0, System.getProperty("line.separator"));
Document document = new Document(sourceCode);
edit.apply(document);
writer.write(document.get());
writer.close();


包含多个注释的示例文件:

package foo.bar;
/**
 * Multiline
 * Javadoc
 */
public class FooBar {
    // inline comment
    private String foo = "bar";
    public String getFoo() {
        /*
         * Multiline
         * comment
         */
        return foo;
    }
}


对应的输出:

package foo.bar;
/**
 * Multiline Javadoc
 */
public class FooBar {
    private String foo = "bar";
    public String getFoo() {
        return foo;
    }
}


存在两个问题:首先,多行javadoc仅压缩为一行。其次,其他两个评论被完全删除。

我怎样才能解决这个问题?

最佳答案

我相信您在执行compilationUnit.toString()时会开始丢失信息。稍后,当您格式化文本时,您最终将失去所有现有的格式。

相反,我建议学习如何使用ASTRewrite,它允许您将更改逐步应用到现有AST中。目标是让重写生成最小的TextEdit,这些最小的applied可以是(原始!)文档的ASTRewrite

如果不能在访问者内部使用ASTRewrite,则甚至可以尝试在“录制”模式下使用org.eclipse.jdt.core.dom.CompilationUnit.recordModifications(),请参见。

09-08 03:51