BuildEventWithConfiguration: represent configurations as BuildEvent

From a BEP point of view, the only interface of a configuration we care
about is its BuildEvent structure. Represent it as such, so that we
can move this class to the rest of the buildeventstream module. This
is a prerequisite for ActionOwners refering to configurations in the
BEP.

Change-Id: I6d1c1bf2951aac91607e83cad664553cd6620df8
PiperOrigin-RevId: 161510049
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java b/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java
index fc14025..7e50b36 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java
@@ -21,13 +21,14 @@
 import com.google.devtools.build.lib.actions.EventReportingArtifacts;
 import com.google.devtools.build.lib.analysis.TopLevelArtifactHelper.ArtifactsInOutputGroup;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
-import com.google.devtools.build.lib.analysis.config.BuildEventWithConfiguration;
 import com.google.devtools.build.lib.buildeventstream.ArtifactGroupNamer;
+import com.google.devtools.build.lib.buildeventstream.BuildEvent;
 import com.google.devtools.build.lib.buildeventstream.BuildEventConverters;
 import com.google.devtools.build.lib.buildeventstream.BuildEventId;
 import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos;
 import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.File;
 import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.OutputGroup;
+import com.google.devtools.build.lib.buildeventstream.BuildEventWithConfiguration;
 import com.google.devtools.build.lib.buildeventstream.BuildEventWithOrderConstraint;
 import com.google.devtools.build.lib.buildeventstream.GenericBuildEvent;
 import com.google.devtools.build.lib.causes.Cause;
@@ -207,12 +208,12 @@
   }
 
   @Override
-  public Collection<BuildConfiguration> getConfigurations() {
+  public Collection<BuildEvent> getConfigurations() {
     BuildConfiguration configuration = target.getConfiguration();
     if (configuration != null) {
       return ImmutableList.of(target.getConfiguration());
     } else {
-      return ImmutableList.<BuildConfiguration>of();
+      return ImmutableList.<BuildEvent>of();
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TargetConfiguredEvent.java b/src/main/java/com/google/devtools/build/lib/analysis/TargetConfiguredEvent.java
index 2473991..56ddc4d 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TargetConfiguredEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TargetConfiguredEvent.java
@@ -15,11 +15,13 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
-import com.google.devtools.build.lib.analysis.config.BuildEventWithConfiguration;
+import com.google.devtools.build.lib.buildeventstream.BuildEvent;
 import com.google.devtools.build.lib.buildeventstream.BuildEventConverters;
 import com.google.devtools.build.lib.buildeventstream.BuildEventId;
 import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos;
+import com.google.devtools.build.lib.buildeventstream.BuildEventWithConfiguration;
 import com.google.devtools.build.lib.buildeventstream.GenericBuildEvent;
+import com.google.devtools.build.lib.buildeventstream.NullConfiguration;
 import com.google.devtools.build.lib.cmdline.Label;
 import java.util.Collection;
 
@@ -34,8 +36,16 @@
   }
 
   @Override
-  public Collection<BuildConfiguration> getConfigurations() {
-    return configurations;
+  public Collection<BuildEvent> getConfigurations() {
+    ImmutableList.Builder<BuildEvent> builder = new ImmutableList.Builder<>();
+    for (BuildConfiguration config : configurations) {
+      if (config != null) {
+        builder.add(config);
+      } else {
+        builder.add(new NullConfiguration());
+      }
+    }
+    return builder.build();
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/VisibilityErrorEvent.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/VisibilityErrorEvent.java
index 5842a8e..afe4e34 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/VisibilityErrorEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/VisibilityErrorEvent.java
@@ -16,10 +16,11 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
-import com.google.devtools.build.lib.analysis.config.BuildEventWithConfiguration;
+import com.google.devtools.build.lib.buildeventstream.BuildEvent;
 import com.google.devtools.build.lib.buildeventstream.BuildEventConverters;
 import com.google.devtools.build.lib.buildeventstream.BuildEventId;
 import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos;
+import com.google.devtools.build.lib.buildeventstream.BuildEventWithConfiguration;
 import com.google.devtools.build.lib.buildeventstream.GenericBuildEvent;
 import com.google.devtools.build.lib.cmdline.Label;
 import java.util.Collection;
@@ -55,7 +56,7 @@
   }
 
   @Override
-  public Collection<BuildConfiguration> getConfigurations() {
-    return ImmutableList.of(configuration);
+  public Collection<BuildEvent> getConfigurations() {
+    return ImmutableList.<BuildEvent>of(configuration);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildEventWithConfiguration.java b/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEventWithConfiguration.java
similarity index 62%
rename from src/main/java/com/google/devtools/build/lib/analysis/config/BuildEventWithConfiguration.java
rename to src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEventWithConfiguration.java
index a4742c0..4cd2b46 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildEventWithConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEventWithConfiguration.java
@@ -12,16 +12,16 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.devtools.build.lib.analysis.config;
+package com.google.devtools.build.lib.buildeventstream;
 
-import com.google.devtools.build.lib.buildeventstream.BuildEvent;
 import java.util.Collection;
 
-/** Interface for {@link BuildEvent}s that reference {@link BuildConfigration}s */
+/** Interface for {@link BuildEvent}s that reference build configurations */
 public interface BuildEventWithConfiguration extends BuildEvent {
   /**
-   * The {@link BuildConfiguration}s the event mentions, and hence should be introduced in the
-   * stream before this event.
+   * The configurations the event mentions, and hence should be introduced in the stream before this
+   * event; they are abstracted as {@link BuildEvent}, as for the build event stream the only thing
+   * we care is how they get presenteded in the protocol.
    */
-  Collection<BuildConfiguration> getConfigurations();
+  Collection<BuildEvent> getConfigurations();
 }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BuildEventStreamer.java b/src/main/java/com/google/devtools/build/lib/runtime/BuildEventStreamer.java
index 1d4e55b..fa2b152 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BuildEventStreamer.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BuildEventStreamer.java
@@ -32,8 +32,6 @@
 import com.google.devtools.build.lib.analysis.BuildInfoEvent;
 import com.google.devtools.build.lib.analysis.NoBuildEvent;
 import com.google.devtools.build.lib.analysis.NoBuildRequestFinishedEvent;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
-import com.google.devtools.build.lib.analysis.config.BuildEventWithConfiguration;
 import com.google.devtools.build.lib.buildeventstream.AbortedEvent;
 import com.google.devtools.build.lib.buildeventstream.AnnounceBuildEventTransportsEvent;
 import com.google.devtools.build.lib.buildeventstream.ArtifactGroupNamer;
@@ -43,6 +41,7 @@
 import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildEventId.NamedSetOfFilesId;
 import com.google.devtools.build.lib.buildeventstream.BuildEventTransport;
 import com.google.devtools.build.lib.buildeventstream.BuildEventTransportClosedEvent;
+import com.google.devtools.build.lib.buildeventstream.BuildEventWithConfiguration;
 import com.google.devtools.build.lib.buildeventstream.BuildEventWithOrderConstraint;
 import com.google.devtools.build.lib.buildeventstream.LastBuildEvent;
 import com.google.devtools.build.lib.buildeventstream.NullConfiguration;
@@ -351,7 +350,7 @@
     maybeReportArtifactSet(new NestedSetView<Artifact>(set));
   }
 
-  private void maybeReportConfiguration(BuildConfiguration configuration) {
+  private void maybeReportConfiguration(BuildEvent configuration) {
     BuildEvent event = configuration;
     if (configuration == null) {
       event = new NullConfiguration();
@@ -392,8 +391,7 @@
     }
 
     if (event instanceof BuildEventWithConfiguration) {
-      for (BuildConfiguration configuration :
-          ((BuildEventWithConfiguration) event).getConfigurations()) {
+      for (BuildEvent configuration : ((BuildEventWithConfiguration) event).getConfigurations()) {
         maybeReportConfiguration(configuration);
       }
     }
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerTest.java b/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerTest.java
index cda02a7..83c0891 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerTest.java
@@ -30,7 +30,6 @@
 import com.google.devtools.build.lib.actions.Root;
 import com.google.devtools.build.lib.analysis.BlazeDirectories;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
-import com.google.devtools.build.lib.analysis.config.BuildEventWithConfiguration;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.FragmentOptions;
 import com.google.devtools.build.lib.buildeventstream.AnnounceBuildEventTransportsEvent;
@@ -42,6 +41,7 @@
 import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildEventId.NamedSetOfFilesId;
 import com.google.devtools.build.lib.buildeventstream.BuildEventTransport;
 import com.google.devtools.build.lib.buildeventstream.BuildEventTransportClosedEvent;
+import com.google.devtools.build.lib.buildeventstream.BuildEventWithConfiguration;
 import com.google.devtools.build.lib.buildeventstream.BuildEventWithOrderConstraint;
 import com.google.devtools.build.lib.buildeventstream.GenericBuildEvent;
 import com.google.devtools.build.lib.buildeventstream.PathConverter;
@@ -206,18 +206,16 @@
   private static class GenericConfigurationEvent implements BuildEventWithConfiguration {
     private final BuildEventId id;
     private final Collection<BuildEventId> children;
-    private final Collection<BuildConfiguration> configurations;
+    private final Collection<BuildEvent> configurations;
 
     GenericConfigurationEvent(
-        BuildEventId id,
-        Collection<BuildEventId> children,
-        Collection<BuildConfiguration> configurations) {
+        BuildEventId id, Collection<BuildEventId> children, Collection<BuildEvent> configurations) {
       this.id = id;
       this.children = children;
       this.configurations = configurations;
     }
 
-    GenericConfigurationEvent(BuildEventId id, BuildConfiguration configuration) {
+    GenericConfigurationEvent(BuildEventId id, BuildEvent configuration) {
       this(id, ImmutableSet.<BuildEventId>of(), ImmutableSet.of(configuration));
     }
 
@@ -232,7 +230,7 @@
     }
 
     @Override
-    public Collection<BuildConfiguration> getConfigurations() {
+    public Collection<BuildEvent> getConfigurations() {
       return configurations;
     }