Skip to content

Commit

Permalink
Propagate check flags in patch mode
Browse files Browse the repository at this point in the history
  • Loading branch information
Stephan202 committed Dec 30, 2024
1 parent 207e5df commit d7cd72f
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -80,13 +80,12 @@ public static ErrorProneAnalyzer createAnalyzer(
Suppliers.memoize(
() -> {
ScannerSupplier toUse =
ErrorPronePlugins.loadPlugins(scannerSupplier, context);
ErrorPronePlugins.loadPlugins(scannerSupplier, context)
.applyOverrides(epOptions);
ImmutableSet<String> namedCheckers =
epOptions.patchingOptions().namedCheckers();
if (!namedCheckers.isEmpty()) {
toUse = toUse.filter(bci -> namedCheckers.contains(bci.canonicalName()));
} else {
toUse = toUse.applyOverrides(epOptions);
}
return ErrorProneScannerTransformer.create(toUse.get());
}));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import com.google.errorprone.bugpatterns.BadShiftAmount;
import com.google.errorprone.bugpatterns.BugChecker;
import com.google.errorprone.bugpatterns.BugChecker.ClassTreeMatcher;
import com.google.errorprone.bugpatterns.BugChecker.VariableTreeMatcher;
import com.google.errorprone.bugpatterns.ChainingConstructorIgnoresParameter;
import com.google.errorprone.bugpatterns.Finally;
import com.google.errorprone.fixes.SuggestedFix;
Expand All @@ -42,21 +43,27 @@
import com.google.errorprone.util.ASTHelpers;
import com.sun.source.tree.ClassTree;
import com.sun.source.tree.MethodTree;
import com.sun.source.tree.VariableTree;
import com.sun.tools.javac.file.JavacFileManager;
import com.sun.tools.javac.util.Constants;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import javax.inject.Inject;
import javax.lang.model.SourceVersion;
import javax.tools.DiagnosticListener;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
Expand Down Expand Up @@ -410,6 +417,59 @@ public void withExcludedPaths() {
assertThat(result.succeeded).isFalse();
}

@BugPattern(summary = "Test bug pattern to test custom patch functionality", severity = ERROR)
public static final class AssignmentUpdater extends BugChecker implements VariableTreeMatcher {
private final String newValue;

@Inject
AssignmentUpdater(ErrorProneFlags flags) {
newValue = flags.get("AssignmentUpdater:NewValue").orElse("flag-not-set");
}

@Override
public Description matchVariable(VariableTree tree, VisitorState state) {
return describeMatch(
tree, SuggestedFix.replace(tree.getInitializer(), Constants.format(newValue)));
}
}

@Test
public void patchWithBugPatternCustomization() throws IOException {
// Patching modifies files on disk, so we must create an actual file that matches the
// `SimpleJavaFileObject` defined below.
Path location = tempDir.getRoot().toPath().resolve("StringConstantWrapper.java");
String source =
"""
class StringConstantWrapper {
String s = "old-value";
}
""";
Files.writeString(location, source);

CompilationResult result =
doCompile(
Collections.singleton(
new SimpleJavaFileObject(location.toUri(), SimpleJavaFileObject.Kind.SOURCE) {
@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
return source;
}
}),
Arrays.asList(
"-XepPatchChecks:AssignmentUpdater",
"-XepPatchLocation:IN_PLACE",
"-XepOpt:AssignmentUpdater:NewValue=new-value"),
Collections.singletonList(AssignmentUpdater.class));
assertThat(result.succeeded).isTrue();
assertThat(Files.readString(location))
.isEqualTo(
"""
class StringConstantWrapper {
String s = "new-value";
}
""");
}

private static class CompilationResult {
public final boolean succeeded;
public final String output;
Expand All @@ -427,6 +487,14 @@ private CompilationResult doCompile(
List<String> fileNames,
List<String> extraArgs,
List<Class<? extends BugChecker>> customCheckers) {
return doCompile(
forResources(getClass(), fileNames.toArray(new String[0])), extraArgs, customCheckers);
}

private CompilationResult doCompile(
Iterable<? extends JavaFileObject> files,
List<String> extraArgs,
List<Class<? extends BugChecker>> customCheckers) {
DiagnosticTestHelper diagnosticHelper = new DiagnosticTestHelper();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(outputStream, UTF_8), true);
Expand All @@ -441,12 +509,7 @@ private CompilationResult doCompile(
: new ErrorProneJavaCompiler(ScannerSupplier.fromBugCheckerClasses(customCheckers));
JavaCompiler.CompilationTask task =
errorProneJavaCompiler.getTask(
printWriter,
fileManager,
diagnosticHelper.collector,
args,
null,
forResources(getClass(), fileNames.toArray(new String[0])));
printWriter, fileManager, diagnosticHelper.collector, args, null, files);

return new CompilationResult(
task.call(), new String(outputStream.toByteArray(), UTF_8), diagnosticHelper);
Expand Down

0 comments on commit d7cd72f

Please sign in to comment.