如何在 Eclipse JDT 中保留注释
How to preserve comments in Eclipse JDT
我正在使用 Eclipse JDT 修改 java 源代码。这分三个步骤进行:
- 首先,我创建了一个 org.eclipse.jdt.core.dom.CompilationUnit 的实例,并使用 ASTVisitor
调用它的 accept() 方法
- 然后我操纵 CompilationUnit。我删除 ASTNodes 并将其添加到树中(此处未显示)
- 然后我将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 中。目标是让重写生成可以 applied
到(原始!)文档的最小 TextEdit
s。
如果无法在访问者内部使用 ASTRewrite
,您甚至可以尝试在 "recording" 模式下使用 ASTRewrite
,请参阅 org.eclipse.jdt.core.dom.CompilationUnit.recordModifications()
。
我正在使用 Eclipse JDT 修改 java 源代码。这分三个步骤进行:
- 首先,我创建了一个 org.eclipse.jdt.core.dom.CompilationUnit 的实例,并使用 ASTVisitor 调用它的 accept() 方法
- 然后我操纵 CompilationUnit。我删除 ASTNodes 并将其添加到树中(此处未显示)
- 然后我将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 中。目标是让重写生成可以 applied
到(原始!)文档的最小 TextEdit
s。
如果无法在访问者内部使用 ASTRewrite
,您甚至可以尝试在 "recording" 模式下使用 ASTRewrite
,请参阅 org.eclipse.jdt.core.dom.CompilationUnit.recordModifications()
。