From 34452751ef85906534603c6ffae8176c11c0a45c Mon Sep 17 00:00:00 2001 From: Eric Chang Date: Tue, 26 Jul 2022 11:54:32 -0700 Subject: [PATCH] Add an onPluginEnd method to BindingGraphPlugin. Fixes #3483. RELNOTES=Add onPluginEnd to BindingGraphPlugin. Fixes #3483 PiperOrigin-RevId: 463393288 --- .../codegen/DelegateComponentProcessor.java | 3 +++ .../CompositeBindingGraphPlugin.java | 5 +++++ .../ExternalBindingGraphPlugins.java | 4 ++++ .../ValidationBindingGraphPlugins.java | 4 ++++ java/dagger/spi/BindingGraphPlugin.java | 7 +++++++ java/dagger/spi/model/BindingGraphPlugin.java | 7 +++++++ javatests/dagger/spi/FailingPlugin.java | 19 +++++++++++++++++++ javatests/dagger/spi/SpiPluginTest.java | 17 +++++++++++++++++ 8 files changed, 66 insertions(+) diff --git a/java/dagger/internal/codegen/DelegateComponentProcessor.java b/java/dagger/internal/codegen/DelegateComponentProcessor.java index c0388ed4d63..f87093fa0f3 100644 --- a/java/dagger/internal/codegen/DelegateComponentProcessor.java +++ b/java/dagger/internal/codegen/DelegateComponentProcessor.java @@ -80,6 +80,9 @@ public void postRound(XProcessingEnv env, XRoundEnv roundEnv) { } catch (SourceFileGenerationException e) { e.printMessageTo(env.getMessager()); } + } else { + validationBindingGraphPlugins.endPlugins(); + externalBindingGraphPlugins.endPlugins(); } clearableCaches.forEach(ClearableCache::clearCache); } diff --git a/java/dagger/internal/codegen/bindinggraphvalidation/CompositeBindingGraphPlugin.java b/java/dagger/internal/codegen/bindinggraphvalidation/CompositeBindingGraphPlugin.java index 4da1b3d21c2..cb1668a7a3e 100644 --- a/java/dagger/internal/codegen/bindinggraphvalidation/CompositeBindingGraphPlugin.java +++ b/java/dagger/internal/codegen/bindinggraphvalidation/CompositeBindingGraphPlugin.java @@ -80,6 +80,11 @@ public void init(DaggerProcessingEnv processingEnv, Map options) plugins.forEach(plugin -> plugin.init(processingEnv, options)); } + @Override + public void onPluginEnd() { + plugins.forEach(BindingGraphPlugin::onPluginEnd); + } + @Override public Set supportedOptions() { return plugins.stream() diff --git a/java/dagger/internal/codegen/validation/ExternalBindingGraphPlugins.java b/java/dagger/internal/codegen/validation/ExternalBindingGraphPlugins.java index 960cfdb1732..98a3bcd9799 100644 --- a/java/dagger/internal/codegen/validation/ExternalBindingGraphPlugins.java +++ b/java/dagger/internal/codegen/validation/ExternalBindingGraphPlugins.java @@ -99,4 +99,8 @@ boolean visit(dagger.spi.model.BindingGraph spiGraph) { } return isClean; } + + public void endPlugins() { + plugins.forEach(BindingGraphPlugin::onPluginEnd); + } } diff --git a/java/dagger/internal/codegen/validation/ValidationBindingGraphPlugins.java b/java/dagger/internal/codegen/validation/ValidationBindingGraphPlugins.java index 5a7454ae1d9..6b746bb611e 100644 --- a/java/dagger/internal/codegen/validation/ValidationBindingGraphPlugins.java +++ b/java/dagger/internal/codegen/validation/ValidationBindingGraphPlugins.java @@ -95,4 +95,8 @@ boolean visit(BindingGraph graph) { } return isClean; } + + public void endPlugins() { + plugins.forEach(BindingGraphPlugin::onPluginEnd); + } } diff --git a/java/dagger/spi/BindingGraphPlugin.java b/java/dagger/spi/BindingGraphPlugin.java index 02a051bd17d..ae3fc1615e7 100644 --- a/java/dagger/spi/BindingGraphPlugin.java +++ b/java/dagger/spi/BindingGraphPlugin.java @@ -91,4 +91,11 @@ default Set supportedOptions() { default String pluginName() { return getClass().getCanonicalName(); } + + /** + * Perform any extra work after the plugin finished all its visiting. This will be called once per + * instance of this plugin, after all graphs were {@linkplain #visitGraph(BindingGraph, + * DiagnosticReporter) visited} + */ + default void onPluginEnd() {} } diff --git a/java/dagger/spi/model/BindingGraphPlugin.java b/java/dagger/spi/model/BindingGraphPlugin.java index b236f9b16a2..8edb70256da 100644 --- a/java/dagger/spi/model/BindingGraphPlugin.java +++ b/java/dagger/spi/model/BindingGraphPlugin.java @@ -58,4 +58,11 @@ default Set supportedOptions() { default String pluginName() { return getClass().getCanonicalName(); } + + /** + * Perform any extra work after the plugin finished all its visiting. This will be called once per + * instance of this plugin, after all graphs were {@linkplain #visitGraph(BindingGraph, + * DiagnosticReporter) visited} + */ + default void onPluginEnd() {} } diff --git a/javatests/dagger/spi/FailingPlugin.java b/javatests/dagger/spi/FailingPlugin.java index 2d13e217641..1f30009d387 100644 --- a/javatests/dagger/spi/FailingPlugin.java +++ b/javatests/dagger/spi/FailingPlugin.java @@ -21,12 +21,17 @@ import com.google.auto.service.AutoService; import com.google.common.collect.ImmutableSet; import dagger.model.BindingGraph; +import java.io.IOException; +import java.io.UncheckedIOException; import java.util.Map; import java.util.Set; +import javax.annotation.processing.Filer; +import javax.tools.StandardLocation; @AutoService(BindingGraphPlugin.class) public final class FailingPlugin implements BindingGraphPlugin { private Map options; + private Filer filer; @Override public Set supportedOptions() { @@ -37,6 +42,11 @@ public Set supportedOptions() { "error_on_subcomponents"); } + @Override + public void initFiler(Filer filer) { + this.filer = filer; + } + @Override public void initOptions(Map options) { this.options = options; @@ -89,4 +99,13 @@ public void visitGraph(BindingGraph bindingGraph, DiagnosticReporter diagnosticR public String pluginName() { return "FailingPlugin"; } + + @Override + public void onPluginEnd() { + try { + filer.createResource(StandardLocation.SOURCE_OUTPUT, "", "onPluginEndTest.txt"); + } catch (IOException e) { + throw new UncheckedIOException("Failed to create txt file", e); + } + } } diff --git a/javatests/dagger/spi/SpiPluginTest.java b/javatests/dagger/spi/SpiPluginTest.java index 1df8cd1b0f6..3d8e586d6b1 100644 --- a/javatests/dagger/spi/SpiPluginTest.java +++ b/javatests/dagger/spi/SpiPluginTest.java @@ -25,6 +25,7 @@ import com.google.testing.compile.JavaFileObjects; import dagger.internal.codegen.ComponentProcessor; import javax.tools.JavaFileObject; +import javax.tools.StandardLocation; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -483,6 +484,22 @@ public void shortestPathToBindingExistsThroughSubcomponentBuilder() { .onLineContaining("interface TestComponent"); } + @Test + public void onPluginEnd() { + JavaFileObject component = + JavaFileObjects.forSourceLines( + "test.TestComponent", + "package test;", + "", + "import dagger.Component;", + "", + "@Component", + "interface TestComponent {}"); + Compilation compilation = javac().withProcessors(new ComponentProcessor()).compile(component); + assertThat(compilation) + .generatedFile(StandardLocation.SOURCE_OUTPUT, "", "onPluginEndTest.txt"); + } + // This works around an issue in the opensource compile testing where only one diagnostic is // recorded per line. When multiple validation items resolve to the same entry point, we can // only see the first. This helper class makes it easier to compile all of the files in the test