Support extracting Refaster Test Data

This commit is contained in:
Rick Ossendrijver
2022-10-06 18:16:39 +02:00
parent dada0f23f1
commit e2b79dac47
5 changed files with 87 additions and 12 deletions

View File

@@ -3,22 +3,22 @@ package tech.picnic.errorprone.plugin;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.google.common.collect.ImmutableList;
import com.google.errorprone.BugPattern;
import com.google.errorprone.VisitorState;
import com.google.errorprone.util.ASTHelpers;
import com.sun.source.tree.ClassTree;
import com.sun.source.tree.VariableTree;
import com.sun.source.util.TaskEvent;
import com.sun.source.util.TaskEvent.Kind;
import com.sun.source.util.TaskListener;
import com.sun.tools.javac.api.JavacTrees;
import com.sun.tools.javac.main.JavaCompiler;
import com.sun.tools.javac.util.Context;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import tech.picnic.errorprone.plugin.objects.BugPatternData;
import tech.picnic.errorprone.plugin.objects.BugPatternTestData;
import tech.picnic.errorprone.plugin.objects.RefasterTemplateTestData;
/** XXX: Write this. */
final class DocgenTaskListener implements TaskListener {
@@ -42,28 +42,32 @@ final class DocgenTaskListener implements TaskListener {
@Override
@SuppressWarnings("SystemOut")
public void finished(TaskEvent taskEvent) {
if (taskEvent.getKind() != Kind.ANALYZE || JavaCompiler.instance(context).errorCount() > 0) {
return;
}
ClassTree tree = JavacTrees.instance(context).getTree(taskEvent.getTypeElement());
if (tree == null || (!isBugPattern(tree) && !isBugPatternTest(tree))) {
if (tree == null
|| taskEvent.getSourceFile() == null
// XXX: Extract to method: `shouldGenerateDocs` or something like that. Return an enum that
// shows which type, or could be `NONE`.
|| (!isBugPattern(tree)
&& !isBugPatternTest(tree)
&& !taskEvent.getSourceFile().getName().contains("TestOutput")
&& !taskEvent.getSourceFile().getName().contains("TestInput"))) {
return;
}
if (isBugPatternTest(tree)) {
BugPatternTestData testData =
new BugPatternTestsExtractor().extractData(tree, taskEvent, state);
System.out.println(testData);
writeToFile(testData, "bug-pattern-test-data.jsonl");
} else if(isBugPattern(tree)) {
} else if (isBugPattern(tree)) {
BugPatternData data = new BugPatternExtractor().extractData(tree, taskEvent, state);
System.out.println("Analysing: " + taskEvent.getTypeElement().getSimpleName());
writeToFile(data, "bug-pattern-data.jsonl");
} else {
ImmutableList<RefasterTemplateTestData> refasterTemplateTestData =
new RefasterTestExtractor().extractData(tree, taskEvent, state);
System.out.println("~~~~~~~~~!!!!~~~~~~~NOW ANALYSING: " + tree.getSimpleName().toString());
refasterTemplateTestData.forEach(d -> writeToFile(d, "refaster-test-data.jsonl"));
}
}

View File

@@ -0,0 +1,32 @@
package tech.picnic.errorprone.plugin;
import static com.google.common.collect.ImmutableList.toImmutableList;
import com.google.common.collect.ImmutableList;
import com.google.errorprone.VisitorState;
import com.sun.source.tree.ClassTree;
import com.sun.source.tree.MethodTree;
import com.sun.source.util.TaskEvent;
import tech.picnic.errorprone.plugin.objects.RefasterTemplateTestData;
public class RefasterTestExtractor
implements DocExtractor<ImmutableList<RefasterTemplateTestData>> {
@Override
public ImmutableList<RefasterTemplateTestData> extractData(
ClassTree tree, TaskEvent taskEvent, VisitorState state) {
String templateCollectionName = tree.getSimpleName().toString().replace("Test", "");
return tree.getMembers().stream()
.filter(MethodTree.class::isInstance)
.map(MethodTree.class::cast)
.filter(m -> m.getName().toString().startsWith("test"))
.map(
m ->
RefasterTemplateTestData.create(
templateCollectionName,
m.getName().toString().replace("test", ""),
m.toString()))
.collect(toImmutableList());
}
}

View File

@@ -0,0 +1,22 @@
package tech.picnic.errorprone.plugin.objects;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.auto.value.AutoValue;
@AutoValue
public abstract class RefasterTemplateTestData {
public static RefasterTemplateTestData create(
String templateCollection, String templateName, String templateTestContent) {
return new AutoValue_RefasterTemplateTestData(
templateCollection, templateName, templateTestContent);
}
@JsonProperty
abstract String templateCollection();
@JsonProperty
abstract String templateName();
@JsonProperty
abstract String templateTestContent();
}

View File

@@ -247,6 +247,7 @@
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<id>add-test-source</id>

View File

@@ -21,6 +21,7 @@ import com.google.common.collect.Sets;
import com.google.errorprone.BugCheckerRefactoringTestHelper;
import com.google.errorprone.BugPattern;
import com.google.errorprone.ErrorProneFlags;
import com.google.errorprone.FileObjects;
import com.google.errorprone.SubContext;
import com.google.errorprone.VisitorState;
import com.google.errorprone.bugpatterns.BugChecker;
@@ -38,6 +39,7 @@ import com.sun.source.util.TreeScanner;
import com.sun.tools.javac.tree.EndPosTable;
import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
import com.sun.tools.javac.util.Position;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -45,6 +47,7 @@ import java.util.Optional;
import java.util.Set;
import java.util.regex.Pattern;
import javax.annotation.Nullable;
import javax.tools.JavaFileObject;
import tech.picnic.errorprone.refaster.runner.CodeTransformers;
import tech.picnic.errorprone.refaster.runner.Refaster;
@@ -124,10 +127,23 @@ public final class RefasterTemplateCollection extends BugChecker
public static void validate(Class<?> clazz) {
String className = clazz.getSimpleName();
JavaFileObject inputFile =
FileObjects.forResource(clazz, "input/" + className + "TestInput.java");
JavaFileObject outputFile =
FileObjects.forResource(clazz, "output/" + className + "TestOutput.java");
String inputContent, outputContent;
try {
inputContent = inputFile.getCharContent(true).toString();
outputContent = outputFile.getCharContent(true).toString();
} catch (IOException e) {
throw new RuntimeException(e);
}
BugCheckerRefactoringTestHelper.newInstance(RefasterTemplateCollection.class, clazz)
.setArgs(ImmutableList.of("-XepOpt:" + TEMPLATE_COLLECTION_FLAG + '=' + className))
.addInput(className + "TestInput.java")
.addOutput(className + "TestOutput.java")
.addInputLines(inputFile.getName(), inputContent.replace(".input", ""))
.addOutputLines(outputFile.getName(), outputContent.replace(".output", ""))
.doTest(TEXT_MATCH);
}