我正在使用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()
,请参见。