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