mirror of
https://github.com/jlengrand/error-prone-support.git
synced 2026-03-10 08:11:25 +00:00
This is a squash commit of the following previous commits:
--- Introduce `BugPatternTestExtractor` with tests --- Simplify tests --- Further simplify testing setup --- Kill another mutant and drop unused imports --- This actually kills the mutant --- Suggestions --- Suggestions --- Suggestions --- Fix JDK 11 compatibility --- PSM-1717 Pass `ClassLoader` to `ServiceLoader` --- Introduce documentation generation This is a squash commit of the following previous commits: --- Introduce `documentation-support` module to extract website data from source code By adding a compilation `TaskListener` that extracts data from the Bug pattern and Refaster rule collection (test) classes and writing to JSON output files in the target directory. This extraction happens as part of the Maven build using the `docgen` profile. --- Improve website styling Co-authored-by: japborst <japborst@gmail.com> Co-authored-by: Gijs de Jong <berichtaangijs@gmail.com> --- Generate Markdown files from existing content for the website --- Upgrade dependencies to the latest versions --- Compile and install project jars before docgen --- Run validation in build and exclude self-url --- Reintroduce `htmlproofer`, improve templates, cleanup setup and dependencies --- Delete directory if it exists --- Add SCSS for GitHub button and fix bug pattern sample rendering --- Fix bug pattern GitHub link --- Small styling tweaks (incl. for dark theme) --- Use single mvn command --- Move mustache templates --- Hardcode anchors for headings --- Add supression to bugpatterns --- Remove self ignore for html-proofer --- Add refaster supressions and use callouts --- Use v0.4.1-SNAPSHOT --- Revert "Use single mvn command" This reverts commit 594471d1ed23a1c19d7fe88d925d1b7f828716cd. --- Extract Refaster samples from source code instead of AST --- Skip verification, for now --- Add notes on disabling bugpatterns --- Set default layout and image --- Fix mobile navigation --- Revert "Set default layout and image" This reverts commit 67a4aa7b5b4d14c0f2b783f345f53affe6ef3ec5. --- Add supression for refaster rules --- Post-rebase fixes --- Fix the tests --- Doh --- Version bump --- Exclude ThirdPartyLibraryTest from Bug Pattern test output --- Remove only last occurence of 'Test' in Bug Pattern tests doc generation --- Move `MapRulesTest` resources --- Add exclusion for docgen of `SourceCodeTest` --- Bump version --- Extra fixes after rebase --- Delete custom nav footer and `assets/images/favicon.ico` --- Post rebase fixes with version bump to `0.8.1-SNAPSHOT` --- Use new BugPatternTest extraction method --- Fit Refaster extractors into new documentation support setup --- Drop Docgen Maven profile --- Move new rule collection --- Improve extractor matching and update README --- Move `SuggestedFixRules` test files --- Fix Refaster exclusion regexes --- Disable external link checking until the `website` branch is up-to-date with `master` again --- Post-rebase fix --- Not sure why `-Dverification.skip` fails while `-Dverification.warn` doesn't; won't investigate right now --- Check external links again --- Upgrade dependencies --- WIP: towards dropping Mustache --- WIP: Java doc generator --- WIP: switch over --- WIP: Cleanup --- Polish
This commit is contained in:
14
.github/workflows/deploy-website.yml
vendored
14
.github/workflows/deploy-website.yml
vendored
@@ -48,16 +48,22 @@ jobs:
|
||||
bundler-cache: true
|
||||
- name: Configure Github Pages
|
||||
uses: actions/configure-pages@1f0c5cde4bc74cd7e1254d0cb4de8d49e9068c7d # v4.0.0
|
||||
- name: Set up JDK
|
||||
uses: actions/setup-java@387ac29b308b003ca37ba93a6cab5eb57c8f5f93 # v4.0.0
|
||||
with:
|
||||
java-version: 17.0.8
|
||||
distribution: temurin
|
||||
cache: maven
|
||||
- name: Compile project and extract data
|
||||
run: mvn -T1C clean install -DskipTests -Dverification.skip -Pdocgen
|
||||
- name: Generate documentation
|
||||
run: ./generate-docs.sh
|
||||
run: mvn exec:java@generate-docs -pl documentation-support
|
||||
- name: Build website with Jekyll
|
||||
working-directory: ./website
|
||||
run: bundle exec jekyll build
|
||||
- name: Validate HTML output
|
||||
working-directory: ./website
|
||||
# XXX: Drop `--disable_external true` once we fully adopted the
|
||||
# "Refaster rules" terminology on our website and in the code.
|
||||
run: bundle exec htmlproofer --disable_external true --check-external-hash false ./_site
|
||||
run: bundle exec htmlproofer --no-check-external-hash ./_site
|
||||
- name: Upload website as artifact
|
||||
uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3.0.1
|
||||
with:
|
||||
|
||||
@@ -37,10 +37,18 @@
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-annotations</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-core</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.dataformat</groupId>
|
||||
<artifactId>jackson-dataformat-yaml</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.datatype</groupId>
|
||||
<artifactId>jackson-datatype-guava</artifactId>
|
||||
@@ -67,6 +75,10 @@
|
||||
<groupId>com.google.guava</groupId>
|
||||
<artifactId>guava</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.github.java-diff-utils</groupId>
|
||||
<artifactId>java-diff-utils</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.assertj</groupId>
|
||||
<artifactId>assertj-core</artifactId>
|
||||
@@ -95,4 +107,29 @@
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<pluginManagement>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>generate-docs</id>
|
||||
<goals>
|
||||
<goal>java</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<mainClass>tech.picnic.errorprone.documentation.JekyllCollectionGenerator</mainClass>
|
||||
<arguments>
|
||||
<argument>${maven.multiModuleProjectDirectory}</argument>
|
||||
</arguments>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</pluginManagement>
|
||||
</build>
|
||||
</project>
|
||||
|
||||
@@ -93,6 +93,9 @@ public final class BugPatternExtractor implements Extractor<BugPatternDocumentat
|
||||
return (T) value;
|
||||
}
|
||||
|
||||
// XXX: Here and below: Test (serialization round trips. And given that the only "production"
|
||||
// reader of the serialized data is also defined in this package, perhaps we don't need to
|
||||
// validate the serialized format.
|
||||
@AutoValue
|
||||
@JsonDeserialize(as = AutoValue_BugPatternExtractor_BugPatternDocumentation.class)
|
||||
abstract static class BugPatternDocumentation {
|
||||
|
||||
@@ -77,7 +77,7 @@ public final class BugPatternTestExtractor implements Extractor<TestCases> {
|
||||
"com.google.errorprone.CompilationTestHelper",
|
||||
"com.google.errorprone.BugCheckerRefactoringTestHelper")
|
||||
.named("newInstance")
|
||||
.withParameters(Class.class.getCanonicalName(), Class.class.getCanonicalName());
|
||||
.withParameters("java.lang.Class", "java.lang.Class");
|
||||
private static final Matcher<ExpressionTree> IDENTIFICATION_SOURCE_LINES =
|
||||
instanceMethod()
|
||||
.onDescendantOf("com.google.errorprone.CompilationTestHelper")
|
||||
@@ -207,6 +207,9 @@ public final class BugPatternTestExtractor implements Extractor<TestCases> {
|
||||
}
|
||||
}
|
||||
|
||||
// XXX: Here and below: Test (serialization round trips. And given that the only "production"
|
||||
// reader of the serialized data is also defined in this package, perhaps we don't need to
|
||||
// validate the serialized format.
|
||||
@AutoValue
|
||||
@JsonDeserialize(as = AutoValue_BugPatternTestExtractor_TestCases.class)
|
||||
abstract static class TestCases {
|
||||
|
||||
@@ -0,0 +1,325 @@
|
||||
package tech.picnic.errorprone.documentation;
|
||||
|
||||
import static com.google.common.collect.ImmutableList.toImmutableList;
|
||||
import static com.google.common.collect.ImmutableListMultimap.flatteningToImmutableListMultimap;
|
||||
import static com.google.common.collect.ImmutableMap.toImmutableMap;
|
||||
import static com.google.common.collect.ImmutableTable.toImmutableTable;
|
||||
import static com.google.errorprone.BugPattern.SeverityLevel.SUGGESTION;
|
||||
import static java.util.Objects.requireNonNull;
|
||||
import static java.util.stream.Collectors.joining;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
|
||||
import com.fasterxml.jackson.annotation.PropertyAccessor;
|
||||
import com.fasterxml.jackson.core.JsonGenerator;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
|
||||
import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;
|
||||
import com.fasterxml.jackson.datatype.guava.GuavaModule;
|
||||
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
|
||||
import com.github.difflib.DiffUtils;
|
||||
import com.github.difflib.UnifiedDiffUtils;
|
||||
import com.github.difflib.patch.Patch;
|
||||
import com.google.auto.value.AutoValue;
|
||||
import com.google.common.base.Splitter;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableListMultimap;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.ImmutableTable;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.google.errorprone.BugPattern.SeverityLevel;
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.FileSystems;
|
||||
import java.nio.file.FileVisitResult;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.PathMatcher;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.SimpleFileVisitor;
|
||||
import java.nio.file.attribute.BasicFileAttributes;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import org.jspecify.annotations.Nullable;
|
||||
import tech.picnic.errorprone.documentation.BugPatternExtractor.BugPatternDocumentation;
|
||||
import tech.picnic.errorprone.documentation.BugPatternTestExtractor.IdentificationTestEntry;
|
||||
import tech.picnic.errorprone.documentation.BugPatternTestExtractor.ReplacementTestEntry;
|
||||
import tech.picnic.errorprone.documentation.BugPatternTestExtractor.TestCase;
|
||||
import tech.picnic.errorprone.documentation.BugPatternTestExtractor.TestCases;
|
||||
import tech.picnic.errorprone.documentation.BugPatternTestExtractor.TestEntry;
|
||||
import tech.picnic.errorprone.documentation.models.RefasterTemplateCollectionTestData;
|
||||
import tech.picnic.errorprone.documentation.models.RefasterTemplateTestData;
|
||||
|
||||
// XXX: Rename this class. Then also update the reference in `website/.gitignore`.
|
||||
public final class JekyllCollectionGenerator {
|
||||
// XXX: Dedup with DocumentationGeneratorTaskListener.
|
||||
private static final ObjectMapper OBJECT_MAPPER =
|
||||
new ObjectMapper()
|
||||
.setVisibility(PropertyAccessor.FIELD, Visibility.ANY)
|
||||
.registerModules(new GuavaModule(), new ParameterNamesModule());
|
||||
// XXX: Find a bette name. Also, externalize this.
|
||||
private static final PathMatcher PATH_MATCHER =
|
||||
FileSystems.getDefault().getPathMatcher("glob:**/target/docs/*.json");
|
||||
|
||||
// XXX: Review class setup.
|
||||
private JekyllCollectionGenerator() {}
|
||||
|
||||
public static void main(String[] args) throws IOException {
|
||||
// XXX: Add validation.
|
||||
Path root = Paths.get(args[0]).toAbsolutePath();
|
||||
|
||||
// Find all JSON files matching one of the expected file formats.
|
||||
// Deserialized and collect accordingly.
|
||||
// Construct the relevant Jekyll collection files.
|
||||
// Output them to the website's source directory.
|
||||
|
||||
DataCollector dataCollector = new DataCollector();
|
||||
|
||||
Files.walkFileTree(root, dataCollector);
|
||||
dataCollector.foo(root);
|
||||
|
||||
try (BufferedWriter writer =
|
||||
Files.newBufferedWriter(root.resolve("website").resolve("index.md"))) {
|
||||
writer.write("---");
|
||||
writer.newLine();
|
||||
writer.write("layout: default");
|
||||
writer.newLine();
|
||||
writer.write("title: Home");
|
||||
writer.newLine();
|
||||
writer.write("---");
|
||||
writer.newLine();
|
||||
writer.write(Files.readString(root.resolve("README.md")).replace("=\"website/", "=\""));
|
||||
}
|
||||
}
|
||||
|
||||
// XXX: Name.
|
||||
private static final class DataCollector extends SimpleFileVisitor<Path> {
|
||||
// XXX: Rename the data types?
|
||||
private final List<BugPatternDocumentation> bugPatterns = new ArrayList<>();
|
||||
private final List<TestCases> bugPatternTests = new ArrayList<>();
|
||||
private final List<RefasterTemplateCollectionTestData> refasterTemplateCollectionTests =
|
||||
new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
|
||||
if (!PATH_MATCHER.matches(file)) {
|
||||
return FileVisitResult.CONTINUE;
|
||||
}
|
||||
|
||||
// XXX: If we use a consistent ID separator, then this can become a switch statement. Now we
|
||||
// depend on evaluation order.
|
||||
// XXX: Alternatively, use polymorphism and let Jackson figure it out.
|
||||
String fileName = file.getFileName().toString();
|
||||
if (fileName.startsWith("bugpattern-test")) {
|
||||
bugPatternTests.add(OBJECT_MAPPER.readValue(file.toFile(), TestCases.class));
|
||||
} else if (fileName.startsWith("bugpattern")) {
|
||||
bugPatterns.add(OBJECT_MAPPER.readValue(file.toFile(), BugPatternDocumentation.class));
|
||||
} else if (fileName.startsWith("refaster-test")) {
|
||||
refasterTemplateCollectionTests.add(
|
||||
OBJECT_MAPPER.readValue(file.toFile(), RefasterTemplateCollectionTestData.class));
|
||||
} else {
|
||||
// XXX: Handle differently?
|
||||
throw new IllegalStateException("Unexpected file: " + fileName);
|
||||
}
|
||||
|
||||
return FileVisitResult.CONTINUE;
|
||||
}
|
||||
|
||||
void foo(Path root) throws IOException {
|
||||
ImmutableList<JekyllBugPatternDescription> checks = getJekyllBugPatternDescriptions();
|
||||
ImmutableList<JekyllRefasterRuleCollectionDescription> rules =
|
||||
getJekyllRefasterRuleCollectionDescription();
|
||||
|
||||
// XXX: Move/extract/rename.
|
||||
ObjectMapper mapper =
|
||||
YAMLMapper.builder()
|
||||
.visibility(PropertyAccessor.FIELD, Visibility.ANY)
|
||||
.disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET)
|
||||
.enable(YAMLGenerator.Feature.MINIMIZE_QUOTES)
|
||||
.enable(YAMLGenerator.Feature.USE_PLATFORM_LINE_BREAKS)
|
||||
.build();
|
||||
|
||||
for (JekyllBugPatternDescription check : checks) {
|
||||
Path directory = root.resolve("website").resolve("_bugpatterns");
|
||||
Files.createDirectories(directory);
|
||||
try (BufferedWriter writer =
|
||||
Files.newBufferedWriter(directory.resolve(check.name() + ".md"))) {
|
||||
mapper.writeValue(writer, check);
|
||||
writer.write("---");
|
||||
writer.newLine();
|
||||
}
|
||||
}
|
||||
|
||||
// XXX: Dedup this logic and the code above.
|
||||
for (JekyllRefasterRuleCollectionDescription rule : rules) {
|
||||
Path directory = root.resolve("website").resolve("_refasterrules");
|
||||
Files.createDirectories(directory);
|
||||
try (BufferedWriter writer =
|
||||
Files.newBufferedWriter(directory.resolve(rule.name() + ".md"))) {
|
||||
mapper.writeValue(writer, rule);
|
||||
writer.write("---");
|
||||
writer.newLine();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private ImmutableList<JekyllBugPatternDescription> getJekyllBugPatternDescriptions() {
|
||||
ImmutableListMultimap<String, TestEntry> bugPatternTestCases =
|
||||
bugPatternTests.stream()
|
||||
.flatMap(testCases -> testCases.testCases().stream())
|
||||
.collect(
|
||||
flatteningToImmutableListMultimap(
|
||||
TestCase::classUnderTest, t -> t.entries().stream()));
|
||||
|
||||
return bugPatterns.stream()
|
||||
.map(
|
||||
b ->
|
||||
new AutoValue_JekyllCollectionGenerator_JekyllBugPatternDescription(
|
||||
b.name(),
|
||||
b.name(),
|
||||
b.summary(),
|
||||
b.severityLevel(),
|
||||
b.tags(),
|
||||
// XXX: Derive `Path` from filesytem.
|
||||
Path.of(b.source()).toString(),
|
||||
bugPatternTestCases.get(b.fullyQualifiedName()).stream()
|
||||
.filter(t -> t.type() == TestEntry.TestType.IDENTIFICATION)
|
||||
.map(t -> ((IdentificationTestEntry) t).code())
|
||||
.collect(toImmutableList()),
|
||||
bugPatternTestCases.get(b.fullyQualifiedName()).stream()
|
||||
.filter(t -> t.type() == TestEntry.TestType.REPLACEMENT)
|
||||
.map(t -> generateDiff((ReplacementTestEntry) t))
|
||||
.collect(toImmutableList())))
|
||||
.collect(toImmutableList());
|
||||
}
|
||||
|
||||
private ImmutableList<JekyllRefasterRuleCollectionDescription>
|
||||
getJekyllRefasterRuleCollectionDescription() {
|
||||
ImmutableTable<String, Boolean, List<RefasterTemplateTestData>> refasterTests =
|
||||
refasterTemplateCollectionTests.stream()
|
||||
.collect(
|
||||
toImmutableTable(
|
||||
RefasterTemplateCollectionTestData::templateCollection,
|
||||
RefasterTemplateCollectionTestData::isInput,
|
||||
RefasterTemplateCollectionTestData::templateTests));
|
||||
|
||||
return refasterTests.rowMap().entrySet().stream()
|
||||
.map(
|
||||
c ->
|
||||
new AutoValue_JekyllCollectionGenerator_JekyllRefasterRuleCollectionDescription(
|
||||
c.getKey(),
|
||||
c.getKey(),
|
||||
// XXX: Derive severity from input.
|
||||
SUGGESTION,
|
||||
// XXX: Derive tags from input (or drop this feature).
|
||||
ImmutableList.of("Simplification"),
|
||||
// XXX: Derive source location from input.
|
||||
String.format(
|
||||
"error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/%s.java",
|
||||
c.getKey()),
|
||||
getRules(c.getValue().get(true), c.getValue().get(false))))
|
||||
.collect(toImmutableList());
|
||||
}
|
||||
|
||||
private static ImmutableList<JekyllRefasterRuleCollectionDescription.Rule> getRules(
|
||||
@Nullable List<RefasterTemplateTestData> inputTests,
|
||||
@Nullable List<RefasterTemplateTestData> outputTests) {
|
||||
ImmutableMap<String, String> inputs = indexRefasterTestData(inputTests);
|
||||
ImmutableMap<String, String> outputs = indexRefasterTestData(outputTests);
|
||||
|
||||
return Sets.intersection(inputs.keySet(), outputs.keySet()).stream()
|
||||
.map(
|
||||
name ->
|
||||
new AutoValue_JekyllCollectionGenerator_JekyllRefasterRuleCollectionDescription_Rule(
|
||||
name,
|
||||
// XXX: Derive severity from input.
|
||||
SUGGESTION,
|
||||
// XXX: Derive tags from input (or drop this feature).
|
||||
ImmutableList.of("Simplification"),
|
||||
generateDiff(
|
||||
requireNonNull(inputs.get(name), "Input"),
|
||||
requireNonNull(outputs.get(name), "Output"))))
|
||||
.collect(toImmutableList());
|
||||
}
|
||||
|
||||
private static ImmutableMap<String, String> indexRefasterTestData(
|
||||
@Nullable List<RefasterTemplateTestData> data) {
|
||||
return data == null
|
||||
? ImmutableMap.of()
|
||||
: data.stream()
|
||||
.collect(
|
||||
toImmutableMap(
|
||||
RefasterTemplateTestData::templateName,
|
||||
RefasterTemplateTestData::templateTestContent));
|
||||
}
|
||||
|
||||
private static String generateDiff(ReplacementTestEntry testEntry) {
|
||||
return generateDiff(testEntry.input(), testEntry.output());
|
||||
}
|
||||
|
||||
private static String generateDiff(String before, String after) {
|
||||
// XXX: Extract splitter.
|
||||
List<String> originalLines = Splitter.on(System.lineSeparator()).splitToList(before);
|
||||
List<String> replacementLines = Splitter.on(System.lineSeparator()).splitToList(after);
|
||||
|
||||
Patch<String> diff = DiffUtils.diff(originalLines, replacementLines);
|
||||
|
||||
return UnifiedDiffUtils.generateUnifiedDiff(
|
||||
"", "", originalLines, diff, Integer.MAX_VALUE / 2)
|
||||
.stream()
|
||||
.skip(3)
|
||||
.collect(joining(System.lineSeparator()));
|
||||
}
|
||||
}
|
||||
|
||||
@AutoValue
|
||||
abstract static class JekyllBugPatternDescription {
|
||||
// XXX: Make this a derived property?
|
||||
abstract String title();
|
||||
|
||||
abstract String name();
|
||||
|
||||
abstract String summary();
|
||||
|
||||
abstract SeverityLevel severity();
|
||||
|
||||
abstract ImmutableList<String> tags();
|
||||
|
||||
// XXX: The documentation could link to the original test code. Perhaps even with the correct
|
||||
// line numbers.
|
||||
abstract String source();
|
||||
|
||||
// XXX: The `identification` and `replacement` fields have odd names.
|
||||
abstract ImmutableList<String> identification();
|
||||
|
||||
abstract ImmutableList<String> replacement();
|
||||
}
|
||||
|
||||
@AutoValue
|
||||
abstract static class JekyllRefasterRuleCollectionDescription {
|
||||
// XXX: Make this a derived property?
|
||||
abstract String title();
|
||||
|
||||
abstract String name();
|
||||
|
||||
abstract SeverityLevel severity();
|
||||
|
||||
abstract ImmutableList<String> tags();
|
||||
|
||||
// XXX: The documentation could link to the original test code. Perhaps even with the correct
|
||||
// line numbers. If we do this, we should do the same for individual rules.
|
||||
abstract String source();
|
||||
|
||||
abstract ImmutableList<Rule> rules();
|
||||
|
||||
@AutoValue
|
||||
abstract static class Rule {
|
||||
abstract String name();
|
||||
|
||||
abstract SeverityLevel severity();
|
||||
|
||||
abstract ImmutableList<String> tags();
|
||||
|
||||
abstract String diff();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
package tech.picnic.errorprone.documentation;
|
||||
|
||||
import static com.google.common.collect.ImmutableList.toImmutableList;
|
||||
|
||||
import com.google.auto.service.AutoService;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.errorprone.VisitorState;
|
||||
import com.google.errorprone.annotations.Immutable;
|
||||
import com.sun.source.tree.ClassTree;
|
||||
import com.sun.source.tree.MethodTree;
|
||||
import java.util.Optional;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import tech.picnic.errorprone.documentation.models.RefasterTemplateCollectionTestData;
|
||||
import tech.picnic.errorprone.documentation.models.RefasterTemplateTestData;
|
||||
|
||||
@Immutable
|
||||
@AutoService(Extractor.class)
|
||||
@SuppressWarnings("rawtypes" /* See https://github.com/google/auto/issues/870. */)
|
||||
public final class RefasterTestInputExtractor
|
||||
implements Extractor<RefasterTemplateCollectionTestData> {
|
||||
private static final Pattern TEST_CLASS_NAME_PATTERN = Pattern.compile("(.*)Test");
|
||||
|
||||
@Override
|
||||
public String identifier() {
|
||||
return "refaster-test-input";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<RefasterTemplateCollectionTestData> tryExtract(
|
||||
ClassTree tree, VisitorState state) {
|
||||
// XXX: The `String.valueOf` call is a hack to avoid an NPE in the absence of an explicit
|
||||
// package declaration.
|
||||
if (!String.valueOf(state.getPath().getCompilationUnit().getPackageName()).contains("input")) {
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
Optional<String> className = getClassUnderTest(tree);
|
||||
if (className.isEmpty()) {
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
ImmutableList<RefasterTemplateTestData> templateTests =
|
||||
tree.getMembers().stream()
|
||||
.filter(MethodTree.class::isInstance)
|
||||
.map(MethodTree.class::cast)
|
||||
.filter(m -> m.getName().toString().startsWith("test"))
|
||||
.map(
|
||||
m ->
|
||||
RefasterTemplateTestData.create(
|
||||
m.getName().toString().replace("test", ""), getSourceCode(m, state)))
|
||||
.collect(toImmutableList());
|
||||
|
||||
return Optional.of(
|
||||
RefasterTemplateCollectionTestData.create(
|
||||
className.orElseThrow(), /* isInput= */ true, templateTests));
|
||||
}
|
||||
|
||||
private static Optional<String> getClassUnderTest(ClassTree tree) {
|
||||
return Optional.of(TEST_CLASS_NAME_PATTERN.matcher(tree.getSimpleName().toString()))
|
||||
.filter(Matcher::matches)
|
||||
.map(m -> m.group(1));
|
||||
}
|
||||
|
||||
// XXX: Duplicated from `SourceCode`. Can we do better?
|
||||
private static String getSourceCode(MethodTree tree, VisitorState state) {
|
||||
String src = state.getSourceForNode(tree);
|
||||
return src != null ? src : tree.toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
package tech.picnic.errorprone.documentation;
|
||||
|
||||
import static com.google.common.collect.ImmutableList.toImmutableList;
|
||||
|
||||
import com.google.auto.service.AutoService;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.errorprone.VisitorState;
|
||||
import com.google.errorprone.annotations.Immutable;
|
||||
import com.sun.source.tree.ClassTree;
|
||||
import com.sun.source.tree.MethodTree;
|
||||
import java.util.Optional;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import tech.picnic.errorprone.documentation.models.RefasterTemplateCollectionTestData;
|
||||
import tech.picnic.errorprone.documentation.models.RefasterTemplateTestData;
|
||||
|
||||
@Immutable
|
||||
@AutoService(Extractor.class)
|
||||
@SuppressWarnings("rawtypes" /* See https://github.com/google/auto/issues/870. */)
|
||||
public final class RefasterTestOutputExtractor
|
||||
implements Extractor<RefasterTemplateCollectionTestData> {
|
||||
private static final Pattern TEST_CLASS_NAME_PATTERN = Pattern.compile("(.*)Test");
|
||||
|
||||
@Override
|
||||
public String identifier() {
|
||||
return "refaster-test-output";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<RefasterTemplateCollectionTestData> tryExtract(
|
||||
ClassTree tree, VisitorState state) {
|
||||
// XXX: The `String.valueOf` call is a hack to avoid an NPE in the absence of an explicit
|
||||
// package declaration.
|
||||
if (!String.valueOf(state.getPath().getCompilationUnit().getPackageName()).contains("output")) {
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
Optional<String> className = getClassUnderTest(tree);
|
||||
if (className.isEmpty()) {
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
ImmutableList<RefasterTemplateTestData> templateTests =
|
||||
tree.getMembers().stream()
|
||||
.filter(MethodTree.class::isInstance)
|
||||
.map(MethodTree.class::cast)
|
||||
.filter(m -> m.getName().toString().startsWith("test"))
|
||||
.map(
|
||||
m ->
|
||||
RefasterTemplateTestData.create(
|
||||
m.getName().toString().replace("test", ""), getSourceCode(m, state)))
|
||||
.collect(toImmutableList());
|
||||
|
||||
return Optional.of(
|
||||
RefasterTemplateCollectionTestData.create(
|
||||
className.orElseThrow(), /* isInput= */ false, templateTests));
|
||||
}
|
||||
|
||||
private static Optional<String> getClassUnderTest(ClassTree tree) {
|
||||
return Optional.of(TEST_CLASS_NAME_PATTERN.matcher(tree.getSimpleName().toString()))
|
||||
.filter(Matcher::matches)
|
||||
.map(m -> m.group(1));
|
||||
}
|
||||
|
||||
// XXX: Duplicated from `SourceCode`. Can we do better?
|
||||
private static String getSourceCode(MethodTree tree, VisitorState state) {
|
||||
String src = state.getSourceForNode(tree);
|
||||
return src != null ? src : tree.toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package tech.picnic.errorprone.documentation.models;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||
import com.google.auto.value.AutoValue;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
|
||||
/**
|
||||
* Object containing all data related to a Refaster template collection. This is solely used for
|
||||
* serialization.
|
||||
*/
|
||||
// XXX: This class is not yet used.
|
||||
@AutoValue
|
||||
@JsonDeserialize(as = AutoValue_RefasterTemplateCollectionData.class)
|
||||
public abstract class RefasterTemplateCollectionData {
|
||||
static RefasterTemplateCollectionData create(
|
||||
String name, String description, String link, ImmutableList<RefasterTemplateData> templates) {
|
||||
return new AutoValue_RefasterTemplateCollectionData(name, description, link, templates);
|
||||
}
|
||||
|
||||
abstract String name();
|
||||
|
||||
abstract String description();
|
||||
|
||||
abstract String link();
|
||||
|
||||
abstract ImmutableList<RefasterTemplateData> templates();
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package tech.picnic.errorprone.documentation.models;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||
import com.google.auto.value.AutoValue;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
|
||||
// XXX: Make properties package-private if type is moved to shared package.
|
||||
@AutoValue
|
||||
@JsonDeserialize(as = AutoValue_RefasterTemplateCollectionTestData.class)
|
||||
public abstract class RefasterTemplateCollectionTestData {
|
||||
public static RefasterTemplateCollectionTestData create(
|
||||
String templateCollection,
|
||||
boolean isInput,
|
||||
ImmutableList<RefasterTemplateTestData> templatesTests) {
|
||||
return new AutoValue_RefasterTemplateCollectionTestData(
|
||||
templateCollection, isInput, templatesTests);
|
||||
}
|
||||
|
||||
public abstract String templateCollection();
|
||||
|
||||
// XXX: This annotation prevents serialization of fields `isInput` *and* `input`. Review.
|
||||
@JsonProperty("isInput")
|
||||
public abstract boolean isInput();
|
||||
|
||||
public abstract ImmutableList<RefasterTemplateTestData> templateTests();
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package tech.picnic.errorprone.documentation.models;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||
import com.google.auto.value.AutoValue;
|
||||
import com.google.errorprone.BugPattern.SeverityLevel;
|
||||
|
||||
// XXX: This class is not yet used.
|
||||
@AutoValue
|
||||
@JsonDeserialize(as = AutoValue_RefasterTemplateData.class)
|
||||
public abstract class RefasterTemplateData {
|
||||
static RefasterTemplateData create(
|
||||
String name, String description, String link, SeverityLevel severityLevel) {
|
||||
return new AutoValue_RefasterTemplateData(name, description, link, severityLevel);
|
||||
}
|
||||
|
||||
abstract String name();
|
||||
|
||||
abstract String description();
|
||||
|
||||
abstract String link();
|
||||
|
||||
abstract SeverityLevel severityLevel();
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package tech.picnic.errorprone.documentation.models;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||
import com.google.auto.value.AutoValue;
|
||||
|
||||
// XXX: Make properties package-private if type is moved to shared package.
|
||||
@AutoValue
|
||||
@JsonDeserialize(as = AutoValue_RefasterTemplateTestData.class)
|
||||
public abstract class RefasterTemplateTestData {
|
||||
public static RefasterTemplateTestData create(String templateName, String templateTestContent) {
|
||||
return new AutoValue_RefasterTemplateTestData(templateName, templateTestContent);
|
||||
}
|
||||
|
||||
public abstract String templateName();
|
||||
|
||||
public abstract String templateTestContent();
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package tech.picnic.errorprone.documentation;
|
||||
|
||||
import java.io.IOException;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
final class JekyllCollectionGeneratorTest {
|
||||
|
||||
@Test
|
||||
void foo() throws IOException {
|
||||
JekyllCollectionGenerator.main(
|
||||
new String[] {"/home/sschroevers/workspace/picnic/error-prone-support"});
|
||||
}
|
||||
}
|
||||
@@ -286,4 +286,34 @@
|
||||
</plugins>
|
||||
</pluginManagement>
|
||||
</build>
|
||||
|
||||
<!-- XXX: Drop this hack; then also drop any references to `docgen`. -->
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>docgen</id>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>build-helper-maven-plugin</artifactId>
|
||||
<version>3.3.0</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>add-test-source</id>
|
||||
<goals>
|
||||
<goal>add-test-source</goal>
|
||||
</goals>
|
||||
<phase>generate-test-sources</phase>
|
||||
<configuration>
|
||||
<sources>
|
||||
<source>src/test/resources</source>
|
||||
</sources>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
</project>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.data.Offset.offset;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.data.Offset.offset;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.data.Offset.offset;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.data.Offset.offset;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.data.Offset.offset;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.data.Offset.offset;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.data.Offset.offset;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.data.Offset.offset;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
||||
import static org.assertj.core.api.Assertions.assertThatIOException;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static com.google.common.collect.ImmutableSet.toImmutableSet;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import java.math.BigDecimal;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.errorprone.BugCheckerRefactoringTestHelper;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import java.io.IOException;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static java.util.Comparator.naturalOrder;
|
||||
import static java.util.Comparator.reverseOrder;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.collect.Streams;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static java.util.function.Predicate.not;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static com.google.common.collect.ImmutableListMultimap.flatteningToImmutableListMultimap;
|
||||
import static com.google.common.collect.ImmutableListMultimap.toImmutableListMultimap;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static com.google.common.collect.ImmutableList.toImmutableList;
|
||||
import static java.util.Comparator.naturalOrder;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static com.google.common.collect.ImmutableMap.toImmutableMap;
|
||||
import static java.util.function.Function.identity;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static com.google.common.collect.ImmutableMultiset.toImmutableMultiset;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static com.google.common.collect.ImmutableSetMultimap.flatteningToImmutableSetMultimap;
|
||||
import static com.google.common.collect.ImmutableSetMultimap.toImmutableSetMultimap;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static com.google.common.collect.ImmutableSet.toImmutableSet;
|
||||
import static java.util.function.Predicate.not;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static com.google.common.collect.ImmutableSortedMap.toImmutableSortedMap;
|
||||
import static java.util.Comparator.naturalOrder;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static com.google.common.collect.ImmutableSortedMultiset.toImmutableSortedMultiset;
|
||||
import static java.util.Comparator.naturalOrder;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static com.google.common.collect.ImmutableSortedSet.toImmutableSortedSet;
|
||||
import static java.util.Comparator.naturalOrder;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.collect.Streams;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import org.junit.jupiter.params.provider.Arguments;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.collect.Streams;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.collect.Maps;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static java.util.Objects.requireNonNullElse;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.times;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.collect.ImmutableSetMultimap;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import com.google.common.base.MoreObjects;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.collect.Streams;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import com.google.common.base.Predicates;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.primitives.Booleans;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static com.google.common.collect.ImmutableList.toImmutableList;
|
||||
import static com.google.common.collect.MoreCollectors.toOptional;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import io.reactivex.BackpressureStrategy;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static com.google.common.collect.ImmutableList.toImmutableList;
|
||||
import static com.google.common.collect.ImmutableMap.toImmutableMap;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
import static java.util.stream.Collectors.joining;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import com.google.errorprone.fixes.SuggestedFix;
|
||||
import com.sun.source.tree.ExpressionTree;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
import static org.testng.Assert.assertEqualsNoOrder;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import java.time.Clock;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.input;
|
||||
|
||||
import static org.springframework.http.HttpMethod.GET;
|
||||
import static org.springframework.http.HttpMethod.HEAD;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.data.Offset.offset;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.data.Offset.offset;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.data.Offset.offset;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.data.Offset.offset;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.data.Offset.offset;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.data.Offset.offset;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.data.Offset.offset;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.data.Offset.offset;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
||||
import static org.assertj.core.api.Assertions.assertThatIOException;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import static com.google.common.collect.ImmutableSet.toImmutableSet;
|
||||
import static com.google.common.collect.Sets.toImmutableEnumSet;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import java.math.BigDecimal;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.errorprone.BugCheckerRefactoringTestHelper;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import java.io.IOException;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import static java.util.Comparator.naturalOrder;
|
||||
import static java.util.Comparator.reverseOrder;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.collect.Streams;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import static java.util.function.Predicate.not;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
@@ -1,4 +1,4 @@
|
||||
package tech.picnic.errorprone.refasterrules;
|
||||
package tech.picnic.errorprone.refasterrules.output;
|
||||
|
||||
import static com.google.common.collect.ImmutableListMultimap.flatteningToImmutableListMultimap;
|
||||
import static com.google.common.collect.ImmutableListMultimap.toImmutableListMultimap;
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user