Use a constant empty `SupportedEnvironments` instance.

Most instances are empty.

PiperOrigin-RevId: 541925977
Change-Id: I677e7ba76427fc477b743e04f6483f3f15072a20
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
index f5c9afe..6bbac2b 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
@@ -431,9 +431,10 @@
       Map<Label, RemovedEnvironmentCulprit> removedEnvironmentCulprits = new LinkedHashMap<>();
       constraintSemantics.checkConstraints(ruleContext, supportedEnvironments, refinedEnvironments,
           removedEnvironmentCulprits);
-      add(SupportedEnvironmentsProvider.class,
-          new SupportedEnvironments(supportedEnvironments, refinedEnvironments.build(),
-              removedEnvironmentCulprits));
+      add(
+          SupportedEnvironmentsProvider.class,
+          SupportedEnvironments.create(
+              supportedEnvironments, refinedEnvironments.build(), removedEnvironmentCulprits));
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/constraints/Environment.java b/src/main/java/com/google/devtools/build/lib/analysis/constraints/Environment.java
index 05d7c51..285ce81 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/constraints/Environment.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/constraints/Environment.java
@@ -52,11 +52,12 @@
     EnvironmentCollection env =
         new EnvironmentCollection.Builder().put(group.getEnvironmentLabels(), label).build();
     return new RuleConfiguredTargetBuilder(ruleContext)
-        .addProvider(SupportedEnvironmentsProvider.class,
-            new SupportedEnvironments(env, env, ImmutableMap.of()))
+        .addProvider(
+            SupportedEnvironmentsProvider.class,
+            SupportedEnvironments.create(env, env, ImmutableMap.of()))
         .addProvider(RunfilesProvider.class, RunfilesProvider.EMPTY)
-        .add(FileProvider.class, FileProvider.EMPTY)
-        .add(FilesToRunProvider.class, FilesToRunProvider.EMPTY)
+        .addProvider(FileProvider.class, FileProvider.EMPTY)
+        .addProvider(FilesToRunProvider.class, FilesToRunProvider.EMPTY)
         .build();
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/constraints/EnvironmentCollection.java b/src/main/java/com/google/devtools/build/lib/analysis/constraints/EnvironmentCollection.java
index bcec594..ab97864 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/constraints/EnvironmentCollection.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/constraints/EnvironmentCollection.java
@@ -87,6 +87,10 @@
     return builder.build();
   }
 
+  boolean isEmpty() {
+    return map.isEmpty();
+  }
+
   /** An empty collection. */
   @SerializationConstant
   static final EnvironmentCollection EMPTY = new EnvironmentCollection(ImmutableMultimap.of());
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/constraints/IncompatibleTargetChecker.java b/src/main/java/com/google/devtools/build/lib/analysis/constraints/IncompatibleTargetChecker.java
index eb5e49e..622c5a9 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/constraints/IncompatibleTargetChecker.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/constraints/IncompatibleTargetChecker.java
@@ -16,7 +16,6 @@
 import static com.google.common.collect.ImmutableList.toImmutableList;
 
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.ConfiguredTargetValue;
 import com.google.devtools.build.lib.analysis.DependencyKind;
@@ -285,9 +284,7 @@
             .add(RunfilesProvider.simple(Runfiles.EMPTY))
             .add(FileProvider.EMPTY)
             .add(FilesToRunProvider.EMPTY)
-            .add(
-                new SupportedEnvironments(
-                    EnvironmentCollection.EMPTY, EnvironmentCollection.EMPTY, ImmutableMap.of()));
+            .add(SupportedEnvironments.EMPTY);
     if (configuration.hasFragment(TestConfiguration.class)) {
       // Create a dummy TestProvider instance so that other parts of the code base stay happy. Even
       // though this test will never execute, some code still expects the provider.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/constraints/SupportedEnvironments.java b/src/main/java/com/google/devtools/build/lib/analysis/constraints/SupportedEnvironments.java
index 3b1bbda..79a5a8d 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/constraints/SupportedEnvironments.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/constraints/SupportedEnvironments.java
@@ -19,18 +19,36 @@
 import java.util.Map;
 
 /** Standard {@link SupportedEnvironmentsProvider} implementation. */
-public class SupportedEnvironments implements SupportedEnvironmentsProvider {
+public final class SupportedEnvironments implements SupportedEnvironmentsProvider {
+
+  static final SupportedEnvironments EMPTY =
+      new SupportedEnvironments(
+          EnvironmentCollection.EMPTY, EnvironmentCollection.EMPTY, ImmutableMap.of());
+
+  public static SupportedEnvironments create(
+      EnvironmentCollection staticEnvironments,
+      EnvironmentCollection refinedEnvironments,
+      Map<Label, RemovedEnvironmentCulprit> removedEnvironmentCulprits) {
+    if (staticEnvironments.isEmpty()
+        && refinedEnvironments.isEmpty()
+        && removedEnvironmentCulprits.isEmpty()) {
+      return EMPTY;
+    }
+    return new SupportedEnvironments(
+        staticEnvironments, refinedEnvironments, ImmutableMap.copyOf(removedEnvironmentCulprits));
+  }
+
   private final EnvironmentCollection staticEnvironments;
   private final EnvironmentCollection refinedEnvironments;
   private final ImmutableMap<Label, RemovedEnvironmentCulprit> removedEnvironmentCulprits;
 
-  public SupportedEnvironments(
+  private SupportedEnvironments(
       EnvironmentCollection staticEnvironments,
       EnvironmentCollection refinedEnvironments,
-      Map<Label, RemovedEnvironmentCulprit> removedEnvironmentCulprits) {
+      ImmutableMap<Label, RemovedEnvironmentCulprit> removedEnvironmentCulprits) {
     this.staticEnvironments = staticEnvironments;
     this.refinedEnvironments = refinedEnvironments;
-    this.removedEnvironmentCulprits = ImmutableMap.copyOf(removedEnvironmentCulprits);
+    this.removedEnvironmentCulprits = removedEnvironmentCulprits;
   }
 
   @Override