如何在 Eclipse JDT 中保留注释

How to preserve comments in Eclipse JDT

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

创建编译单元:

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 中。目标是让重写生成可以 applied 到(原始!)文档的最小 TextEdits。

如果无法在访问者内部使用 ASTRewrite,您甚至可以尝试在 "recording" 模式下使用 ASTRewrite,请参阅 org.eclipse.jdt.core.dom.CompilationUnit.recordModifications()