LexicalPreservingPrinter will remove comments when using `ASTTransforms.wrapIntoResource`
andrecsilva opened this issue · 2 comments
andrecsilva commented
Consider the following snippet:
String code =
"""
import java.nio.file.Files;
import java.io.File;
import java.io.BufferedWriter;
class A{
void f(File f){
// first comment
BufferedWriter writer = Files.newBufferedWriter(f.toPath());
// second comment
System.out.println(1);
// third comment
System.out.println(2);
}
}
""";
ParserConfiguration parserConfiguration = new ParserConfiguration();
parserConfiguration.setLanguageLevel(ParserConfiguration.LanguageLevel.BLEEDING_EDGE);
parserConfiguration.setSymbolResolver(new JavaSymbolSolver(new ReflectionTypeSolver()));
var parser = new JavaParser(parserConfiguration);
CompilationUnit cu = parser.parse(code).getResult().get();
LexicalPreservingPrinter.setup(cu);
var node = cu.findAll(VariableDeclarator.class).get(0);
var lvd = LocalVariableDeclaration.fromVariableDeclarator(node).get();
ASTTransforms.wrapIntoResource(lvd.getStatement().asExpressionStmt(), lvd.getVariableDeclarationExpr(), lvd.getScope());
System.out.println(cu);
System.out.println("------------------");
System.out.println(LexicalPreservingPrinter.print(cu));
This will output:
import java.nio.file.Files;
import java.io.File;
import java.io.BufferedWriter;
class A {
void f(File f) {
// first comment
try (BufferedWriter writer = Files.newBufferedWriter(f.toPath())) {
// second comment
System.out.println(1);
// third comment
System.out.println(2);
}
}
}
------------------
import java.nio.file.Files;
import java.io.File;
import java.io.BufferedWriter;
class A{
void f(File f){
try (BufferedWriter writer = Files.newBufferedWriter(f.toPath())) {
System.out.println(1);
System.out.println(2);
}
}
}
Notice how the comments disappears if we print it with the LexicalPreservingPrinter
, despite being there if we chose not to use it.
This affects all codemods that uses this transform, mainly those using the ResourceLeakFixer
transform:
codeql:java/input-resource-leak
, codeql:java/output-resource-leak
, codeql:java/database-resource-leak
, pixee:java/prevent-filewriter-leak-with-nio
, pixee:java/resource-leak
.
nahsra commented
👀
andrecsilva commented
Can't find a workaround for this, at least one that doesn't involve ditching LexicalPreservingPrinter. I've created an Issue for this in JavaParser's github after narrowing it down a bit more.
javaparser/javaparser#4376