aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build
diff options
context:
space:
mode:
authorGravatar gregce <gregce@google.com>2018-01-18 12:46:04 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-01-18 12:48:05 -0800
commit7fa23eaf4617431875acbb63052f7349546343ba (patch)
tree6b77ab236733751b62c29d92069e4eab0a6dc216 /src/main/java/com/google/devtools/build
parent56567bbb56ab2f0d1423121abea4af2373acc8aa (diff)
Remove ConfigurationTransitionProxy.NONE and BaseRuleClasses.DYNAMIC_TRANSITION_MAP.
This leaves DATA as the last remaining legacy transition. PiperOrigin-RevId: 182422552
Diffstat (limited to 'src/main/java/com/google/devtools/build')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java20
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/BuildView.java12
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java41
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/DynamicTransitionMapper.java40
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java17
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/transitions/ComposingSplitTransition.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/transitions/ConfigurationTransitionProxy.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/transitions/NoTransition.java30
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/Attribute.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/ConfigurationFragmentPolicy.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/core/CoreRules.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java6
14 files changed, 79 insertions, 128 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java b/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java
index 8fff84a91d..269e2451ab 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java
@@ -28,15 +28,10 @@ import static com.google.devtools.build.lib.syntax.Type.STRING_LIST;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
-import com.google.devtools.build.lib.analysis.config.DynamicTransitionMapper;
import com.google.devtools.build.lib.analysis.config.HostTransition;
import com.google.devtools.build.lib.analysis.config.RunUnder;
-import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransitionProxy;
-import com.google.devtools.build.lib.analysis.config.transitions.PatchTransition;
-import com.google.devtools.build.lib.analysis.config.transitions.Transition;
import com.google.devtools.build.lib.analysis.constraints.EnvironmentRule;
import com.google.devtools.build.lib.analysis.test.TestConfiguration;
import com.google.devtools.build.lib.cmdline.Label;
@@ -392,19 +387,4 @@ public class BaseRuleClasses {
.build();
}
}
-
- /**
- * Declares the implementations for {@link ConfigurationTransitionProxy} enums.
- *
- * <p>We can't put this in {@link Attribute} because that's in the {@code lib.packages} package,
- * which has no access to configuration classes.
- *
- * <p>New transitions should extend {@link PatchTransition}, which avoids the need for this map.
- */
- public static final ImmutableMap<Transition, Transition> DYNAMIC_TRANSITIONS_MAP =
- ImmutableMap.of(
- ConfigurationTransitionProxy.NONE, DynamicTransitionMapper.SELF
- // ConfigurationTransitionProxy.DATA is skipped because it's C++-specific.
- // The C++ rule definitions handle its mapping.
- );
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
index 95ea7030d8..5097f42160 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
@@ -45,7 +45,7 @@ import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
import com.google.devtools.build.lib.analysis.config.ConfigurationResolver;
import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
-import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransitionProxy;
+import com.google.devtools.build.lib.analysis.config.transitions.NoTransition;
import com.google.devtools.build.lib.analysis.config.transitions.PatchTransition;
import com.google.devtools.build.lib.analysis.config.transitions.Transition;
import com.google.devtools.build.lib.analysis.constraints.TopLevelConstraintSemantics;
@@ -957,7 +957,7 @@ public class BuildView {
Iterable<BuildOptions> buildOptions) {
Preconditions.checkArgument(ct.getConfiguration().fragmentClasses().equals(fragments));
Dependency asDep = Dependency.withTransitionAndAspects(ct.getLabel(),
- ConfigurationTransitionProxy.NONE, AspectCollection.EMPTY);
+ NoTransition.INSTANCE, AspectCollection.EMPTY);
ImmutableList.Builder<BuildConfiguration> builder = ImmutableList.builder();
for (BuildOptions options : buildOptions) {
builder.add(Iterables.getOnlyElement(
@@ -1036,19 +1036,19 @@ public class BuildView {
.getTarget(handler, label)
.getAssociatedRule();
} catch (NoSuchPackageException | NoSuchTargetException e) {
- return ConfigurationTransitionProxy.NONE;
+ return NoTransition.INSTANCE;
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new AssertionError("Configuration of " + label + " interrupted");
}
if (rule == null) {
- return ConfigurationTransitionProxy.NONE;
+ return NoTransition.INSTANCE;
}
RuleTransitionFactory factory = rule
.getRuleClassObject()
.getTransitionFactory();
if (factory == null) {
- return ConfigurationTransitionProxy.NONE;
+ return NoTransition.INSTANCE;
}
// dynamicTransitionMapper is only needed because of ConfigurationTransitionProxy.DATA:
@@ -1056,7 +1056,7 @@ public class BuildView {
// C++-specific patch transition that implements it.
PatchTransition transition = (PatchTransition)
ruleClassProvider.getDynamicTransitionMapper().map(factory.buildTransitionFor(rule));
- return (transition == null) ? ConfigurationTransitionProxy.NONE : transition;
+ return (transition == null) ? NoTransition.INSTANCE : transition;
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index a02d4105fd..c8cee3cf98 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -48,6 +48,7 @@ import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
import com.google.devtools.build.lib.analysis.config.FragmentCollection;
import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransitionProxy;
+import com.google.devtools.build.lib.analysis.config.transitions.NoTransition;
import com.google.devtools.build.lib.analysis.config.transitions.PatchTransition;
import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
import com.google.devtools.build.lib.analysis.config.transitions.Transition;
@@ -416,8 +417,8 @@ public final class RuleContext extends TargetContext
@Nullable
public <T extends Fragment> T getFragment(Class<T> fragment) {
- // NONE means target configuration.
- return getFragment(fragment, ConfigurationTransitionProxy.NONE);
+ // No transition means target configuration.
+ return getFragment(fragment, NoTransition.INSTANCE);
}
@Nullable
@@ -447,8 +448,8 @@ public final class RuleContext extends TargetContext
}
public <T extends Fragment> boolean isLegalFragment(Class<T> fragment) {
- // NONE means target configuration.
- return isLegalFragment(fragment, ConfigurationTransitionProxy.NONE);
+ // No transition means target configuration.
+ return isLegalFragment(fragment, NoTransition.INSTANCE);
}
protected BuildConfiguration getConfiguration(Transition transition) {
@@ -1072,8 +1073,7 @@ public final class RuleContext extends TargetContext
+ " is not configured for the host configuration");
}
} else if (mode == Mode.TARGET) {
- if (!(transition instanceof PatchTransition)
- && transition != ConfigurationTransitionProxy.NONE) {
+ if (!(transition instanceof PatchTransition) && transition != NoTransition.INSTANCE) {
throw new IllegalStateException(getRule().getLocation() + ": "
+ getRuleClassNameForLogging() + " attribute " + attributeName
+ " is not configured for the target configuration");
@@ -1095,35 +1095,6 @@ public final class RuleContext extends TargetContext
}
/**
- * Returns the Mode for which the attribute is configured.
- * This is intended for Skylark, where the Mode is implicitly chosen.
- */
- public Mode getAttributeMode(String attributeName) {
- Attribute attributeDefinition = attributes().getAttributeDefinition(attributeName);
- if (attributeDefinition == null) {
- throw new IllegalStateException(getRule().getLocation() + ": " + getRuleClassNameForLogging()
- + " attribute " + attributeName + " is not defined");
- }
- if (attributeDefinition.getType().getLabelClass() != LabelClass.DEPENDENCY) {
- throw new IllegalStateException(getRuleClassNameForLogging() + " attribute " + attributeName
- + " is not a label type attribute");
- }
- if (attributeDefinition.getConfigurationTransition().isHostTransition()) {
- return Mode.HOST;
- } else if (attributeDefinition.getConfigurationTransition()
- == ConfigurationTransitionProxy.NONE) {
- return Mode.TARGET;
- } else if (attributeDefinition.getConfigurationTransition()
- == ConfigurationTransitionProxy.DATA) {
- return Mode.DATA;
- } else if (attributeDefinition.hasSplitConfigurationTransition()) {
- return Mode.SPLIT;
- }
- throw new IllegalStateException(getRule().getLocation() + ": "
- + getRuleClassNameForLogging() + " attribute " + attributeName + " is not configured");
- }
-
- /**
* For the specified attribute "attributeName" (which must be of type
* list(label)), resolve all the labels into ConfiguredTargets (for the
* configuration appropriate to the attribute) and return their build
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java
index 3bce74d771..c60f6a5aa7 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java
@@ -26,7 +26,7 @@ import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
import com.google.devtools.build.lib.analysis.Dependency;
import com.google.devtools.build.lib.analysis.TargetAndConfiguration;
-import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransitionProxy;
+import com.google.devtools.build.lib.analysis.config.transitions.NoTransition;
import com.google.devtools.build.lib.analysis.config.transitions.PatchTransition;
import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
import com.google.devtools.build.lib.analysis.config.transitions.Transition;
@@ -186,7 +186,7 @@ public final class ConfigurationResolver {
Transition transition = dep.getTransition();
if (sameFragments) {
- if (transition == ConfigurationTransitionProxy.NONE) {
+ if (transition == NoTransition.INSTANCE) {
// The dep uses the same exact configuration.
putOnlyEntry(
resolvedDeps,
@@ -415,9 +415,7 @@ public final class ConfigurationResolver {
Iterable<Class<? extends BuildConfiguration.Fragment>> requiredFragments,
RuleClassProvider ruleClassProvider, boolean trimResults) {
List<BuildOptions> result;
- if (transition == ConfigurationTransitionProxy.NONE) {
- result = ImmutableList.<BuildOptions>of(fromOptions);
- } else if (transition instanceof PatchTransition) {
+ if (transition instanceof PatchTransition) {
// TODO(bazel-team): safety-check that this never mutates fromOptions.
result = ImmutableList.of(((PatchTransition) transition).apply(fromOptions));
} else if (transition instanceof SplitTransition) {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/DynamicTransitionMapper.java b/src/main/java/com/google/devtools/build/lib/analysis/config/DynamicTransitionMapper.java
index e481fb1c45..d08a0dbc7d 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/DynamicTransitionMapper.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/DynamicTransitionMapper.java
@@ -14,43 +14,23 @@
package com.google.devtools.build.lib.analysis.config;
import com.google.common.collect.ImmutableMap;
+import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransitionProxy;
import com.google.devtools.build.lib.analysis.config.transitions.PatchTransition;
import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
import com.google.devtools.build.lib.analysis.config.transitions.Transition;
-import com.google.devtools.build.lib.packages.Attribute;
-import com.google.devtools.build.lib.packages.RuleClass;
/**
* Maps non-{@link PatchTransition} declarations to their implementable equivalents.
*
* <p>Blaze applies configuration transitions by executing {@link PatchTransition} instances. But
- * for legacy reasons, not every transition declaration is a {@link PatchTransition}. The most
- * prominent example is {@link ConfigurationTransitionProxy}, which defines its transitions as
- * enums. These transitions are used all over the place. So we need a way to continue to support
- * them.
+ * for legacy reasons, {@link ConfigurationTransitionProxy#DATA} (which is used for C++/LIPO logic)
+ * is an implementation-free enum.
*
- * <p>Hence this class.
- *
- * <p>Going forward, we should eliminate the need for this class by eliminating
- * non-{@link PatchTransition} transitions. This is conceptually straightforward: replace
- * declarations of the form {@link RuleClass.Builder#cfg(Transition)} with
- * {@link RuleClass.Builder#cfg(PatchTransition)}. That way, transition declarations "just work",
- * with no extra fuss. But this is a migration that will take some time to complete.
- *
- * {@link ConfigurationTransitionProxy#DATA} provides the most complicated challenge. This is
- * C++/LIPO logic, and the implementation is in C++ rule code
- * ({@link com.google.devtools.build.lib.rules.cpp.transitions.DisableLipoTransition}). But the enum
- * is defined in {@link Attribute}, which is in {@code lib.packages}, which has access to neither
- * rule-specific nor configuration-specific code. Furthermore, many non-C++ rules declare this
- * transition. We ultimately need a cleaner way to inject this rules-specific logic into general
- * Blaze code.
+ * <p>We should ultimately restrict that logic just to the C++ rule definitions and remove this
+ * interface. But {@link ConfigurationTransitionProxy#DATA} is used everywhere, including in
+ * non-C++ rules and in {@code lib.packages} code, which lacks acccess to C++ configuration logic.
*/
public final class DynamicTransitionMapper {
- /**
- * Use this to declare a no-op transition that keeps the input configuration.
- */
- public static final Transition SELF = new Transition() {};
-
private final ImmutableMap<Transition, Transition> map;
/**
@@ -79,11 +59,9 @@ public final class DynamicTransitionMapper {
return fromTransition;
}
Transition toTransition = map.get(fromTransition);
- if (toTransition == SELF) {
- return fromTransition;
- } else if (toTransition != null) {
- return toTransition;
+ if (toTransition == null) {
+ throw new IllegalArgumentException("No dynamic mapping for " + fromTransition.toString());
}
- throw new IllegalArgumentException("No dynamic mapping for " + fromTransition.toString());
+ return toTransition;
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java
index 44530445c5..9fc95970fd 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java
@@ -19,6 +19,7 @@ import com.google.common.base.Preconditions;
import com.google.devtools.build.lib.analysis.TargetAndConfiguration;
import com.google.devtools.build.lib.analysis.config.transitions.ComposingSplitTransition;
import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransitionProxy;
+import com.google.devtools.build.lib.analysis.config.transitions.NoTransition;
import com.google.devtools.build.lib.analysis.config.transitions.NullTransition;
import com.google.devtools.build.lib.analysis.config.transitions.PatchTransition;
import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
@@ -77,7 +78,7 @@ public final class TransitionResolver {
// II. Host configurations never switch to another. All prerequisites of host targets have the
// same host configuration.
if (fromConfig.isHostConfiguration()) {
- return ConfigurationTransitionProxy.NONE;
+ return NoTransition.INSTANCE;
}
// Make sure config_setting dependencies are resolved in the referencing rule's configuration,
@@ -94,13 +95,13 @@ public final class TransitionResolver {
// TODO(bazel-team): don't require special casing here. This is far too hackish.
if (toTarget instanceof Rule && ((Rule) toTarget).getRuleClassObject().isConfigMatcher()) {
// TODO(gregce): see if this actually gets called
- return ConfigurationTransitionProxy.NONE;
+ return NoTransition.INSTANCE;
}
// The current transition to apply. When multiple transitions are requested, this is a
// ComposingSplitTransition, which encapsulates them into a single object so calling code
// doesn't need special logic for combinations.
- Transition currentTransition = ConfigurationTransitionProxy.NONE;
+ Transition currentTransition = NoTransition.INSTANCE;
// Apply the parent rule's outgoing transition if it has one.
RuleTransitionFactory transitionFactory =
@@ -140,7 +141,7 @@ public final class TransitionResolver {
// Top-level transitions (chosen by configuration fragments):
Transition topLevelTransition = fromConfig.topLevelConfigurationHook(target);
if (topLevelTransition == null) {
- topLevelTransition = ConfigurationTransitionProxy.NONE;
+ topLevelTransition = NoTransition.INSTANCE;
}
// Rule class transitions (chosen by rule class definitions):
@@ -165,7 +166,7 @@ public final class TransitionResolver {
public Transition composeTransitions(Transition transition1, Transition transition2) {
if (isFinal(transition1)) {
return transition1;
- } else if (transition2 == ConfigurationTransitionProxy.NONE) {
+ } else if (transition2 == NoTransition.INSTANCE) {
return transition1;
} else if (transition2 == NullTransition.INSTANCE) {
// A NULL transition can just replace earlier transitions: no need to compose them.
@@ -180,7 +181,7 @@ public final class TransitionResolver {
// TODO(gregce): remove the below conversion when all transitions are patch transitions.
Transition dynamicTransition = transitionMapper.map(transition2);
- return transition1 == ConfigurationTransitionProxy.NONE
+ return transition1 == NoTransition.INSTANCE
? dynamicTransition
: new ComposingSplitTransition(transition1, dynamicTransition);
}
@@ -202,7 +203,7 @@ public final class TransitionResolver {
"cannot apply splits after null transitions (null transitions are expected to be final)");
Preconditions.checkState(currentTransition != HostTransition.INSTANCE,
"cannot apply splits after host transitions (host transitions are expected to be final)");
- return currentTransition == ConfigurationTransitionProxy.NONE
+ return currentTransition == NoTransition.INSTANCE
? split
: new ComposingSplitTransition(currentTransition, split);
}
@@ -226,7 +227,7 @@ public final class TransitionResolver {
PatchTransition ruleClassTransition = (PatchTransition)
transitionMapper.map(transitionFactory.buildTransitionFor(associatedRule));
if (ruleClassTransition != null) {
- if (currentTransition == ConfigurationTransitionProxy.NONE) {
+ if (currentTransition == NoTransition.INSTANCE) {
return ruleClassTransition;
} else {
return new ComposingSplitTransition(currentTransition, ruleClassTransition);
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/transitions/ComposingSplitTransition.java b/src/main/java/com/google/devtools/build/lib/analysis/config/transitions/ComposingSplitTransition.java
index d58bafd917..d36968c21b 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/transitions/ComposingSplitTransition.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/transitions/ComposingSplitTransition.java
@@ -70,9 +70,7 @@ public class ComposingSplitTransition implements SplitTransition {
*/
// TODO(gregce): move this somewhere more general. This isn't intrinsic to composed splits.
static List<BuildOptions> apply(BuildOptions fromOptions, Transition transition) {
- if (transition == ConfigurationTransitionProxy.NONE) {
- return ImmutableList.<BuildOptions>of(fromOptions);
- } else if (transition instanceof PatchTransition) {
+ if (transition instanceof PatchTransition) {
return ImmutableList.<BuildOptions>of(((PatchTransition) transition).apply(fromOptions));
} else if (transition instanceof SplitTransition) {
SplitTransition split = (SplitTransition) transition;
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/transitions/ConfigurationTransitionProxy.java b/src/main/java/com/google/devtools/build/lib/analysis/config/transitions/ConfigurationTransitionProxy.java
index 6a19b36fbb..81baf16503 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/transitions/ConfigurationTransitionProxy.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/transitions/ConfigurationTransitionProxy.java
@@ -22,9 +22,6 @@ package com.google.devtools.build.lib.analysis.config.transitions;
*/
@Deprecated
public enum ConfigurationTransitionProxy implements Transition {
- /** No transition, i.e., the same configuration as the current. */
- NONE,
-
/** Transition from the target configuration to the data configuration. */
// TODO(bazel-team): Move this elsewhere.
DATA,
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/transitions/NoTransition.java b/src/main/java/com/google/devtools/build/lib/analysis/config/transitions/NoTransition.java
new file mode 100644
index 0000000000..d5581e5469
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/transitions/NoTransition.java
@@ -0,0 +1,30 @@
+// Copyright 2018 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.google.devtools.build.lib.analysis.config.transitions;
+
+import com.google.devtools.build.lib.analysis.config.BuildOptions;
+
+/**
+ * No-op configuration transition.
+ */
+public final class NoTransition implements PatchTransition {
+ public static final NoTransition INSTANCE = new NoTransition();
+
+ private NoTransition() {}
+
+ @Override
+ public BuildOptions apply(BuildOptions options) {
+ return options;
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java
index 506ff64543..ce082a3aea 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java
@@ -37,7 +37,7 @@ import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.config.FragmentCollection;
import com.google.devtools.build.lib.analysis.config.HostTransition;
-import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransitionProxy;
+import com.google.devtools.build.lib.analysis.config.transitions.NoTransition;
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.stringtemplate.ExpansionException;
import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector;
@@ -225,7 +225,7 @@ public final class SkylarkRuleContext implements SkylarkValue {
this.actionFactory = new SkylarkActionFactory(this, skylarkSemantics, ruleContext);
this.ruleContext = Preconditions.checkNotNull(ruleContext);
this.ruleLabelCanonicalName = ruleContext.getLabel().getCanonicalForm();
- this.fragments = new FragmentCollection(ruleContext, ConfigurationTransitionProxy.NONE);
+ this.fragments = new FragmentCollection(ruleContext, NoTransition.INSTANCE);
this.hostFragments = new FragmentCollection(ruleContext, HostTransition.INSTANCE);
this.aspectDescriptor = aspectDescriptor;
this.skylarkSemantics = skylarkSemantics;
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
index 75f933ee50..22d39ee88f 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
@@ -29,7 +29,7 @@ import com.google.common.collect.Iterables;
import com.google.common.collect.Ordering;
import com.google.common.collect.Sets;
import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
-import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransitionProxy;
+import com.google.devtools.build.lib.analysis.config.transitions.NoTransition;
import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
import com.google.devtools.build.lib.analysis.config.transitions.Transition;
import com.google.devtools.build.lib.events.EventHandler;
@@ -359,7 +359,7 @@ public final class Attribute implements Comparable<Attribute> {
public static class Builder <TYPE> {
private final String name;
private final Type<TYPE> type;
- private Transition configTransition = ConfigurationTransitionProxy.NONE;
+ private Transition configTransition = NoTransition.INSTANCE;
private RuleClassNamePredicate allowedRuleClassesForLabels = ANY_RULE;
private RuleClassNamePredicate allowedRuleClassesForLabelsWarning = NO_RULE;
private SplitTransitionProvider splitTransitionProvider;
@@ -479,7 +479,7 @@ public final class Attribute implements Comparable<Attribute> {
* Defines the configuration transition for this attribute.
*/
public Builder<TYPE> cfg(SplitTransitionProvider splitTransitionProvider) {
- Preconditions.checkState(this.configTransition == ConfigurationTransitionProxy.NONE,
+ Preconditions.checkState(this.configTransition == NoTransition.INSTANCE,
"the configuration transition is already set");
this.splitTransitionProvider = Preconditions.checkNotNull(splitTransitionProvider);
@@ -499,7 +499,7 @@ public final class Attribute implements Comparable<Attribute> {
* {@code NONE}.
*/
public Builder<TYPE> cfg(Transition configTransition) {
- Preconditions.checkState(this.configTransition == ConfigurationTransitionProxy.NONE,
+ Preconditions.checkState(this.configTransition == NoTransition.INSTANCE,
"the configuration transition is already set");
if (configTransition instanceof SplitTransition) {
return cfg((SplitTransition) configTransition);
@@ -1801,7 +1801,7 @@ public final class Attribute implements Comparable<Attribute> {
ImmutableList<RuleAspect<?>> aspects) {
Preconditions.checkNotNull(configTransition);
Preconditions.checkArgument(
- (configTransition == ConfigurationTransitionProxy.NONE)
+ (configTransition == NoTransition.INSTANCE)
|| type.getLabelClass() == LabelClass.DEPENDENCY
|| type.getLabelClass() == LabelClass.NONDEP_REFERENCE,
"Configuration transitions can only be specified for label or label list attributes");
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ConfigurationFragmentPolicy.java b/src/main/java/com/google/devtools/build/lib/packages/ConfigurationFragmentPolicy.java
index 6679f248b3..83d5aa39f3 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ConfigurationFragmentPolicy.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ConfigurationFragmentPolicy.java
@@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSetMultimap;
import com.google.common.collect.LinkedHashMultimap;
import com.google.common.collect.SetMultimap;
-import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransitionProxy;
+import com.google.devtools.build.lib.analysis.config.transitions.NoTransition;
import com.google.devtools.build.lib.analysis.config.transitions.Transition;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
import java.util.Collection;
@@ -82,7 +82,7 @@ public final class ConfigurationFragmentPolicy {
* <p>The value is inherited by subclasses.
*/
public Builder requiresConfigurationFragments(Collection<Class<?>> configurationFragments) {
- requiresConfigurationFragments(ConfigurationTransitionProxy.NONE, configurationFragments);
+ requiresConfigurationFragments(NoTransition.INSTANCE, configurationFragments);
return this;
}
@@ -98,7 +98,7 @@ public final class ConfigurationFragmentPolicy {
// We can relax this assumption if needed. But it's already sketchy to let a rule see more
// than its own configuration. So we don't want to casually proliferate this pattern.
Preconditions.checkArgument(
- transition == ConfigurationTransitionProxy.NONE || transition.isHostTransition());
+ transition == NoTransition.INSTANCE || transition.isHostTransition());
requiredConfigurationFragments.putAll(transition, configurationFragments);
return this;
}
@@ -117,7 +117,7 @@ public final class ConfigurationFragmentPolicy {
Collection<String> configurationFragmentNames) {
requiresConfigurationFragmentsBySkylarkModuleName(
- ConfigurationTransitionProxy.NONE, configurationFragmentNames);
+ NoTransition.INSTANCE, configurationFragmentNames);
return this;
}
@@ -136,7 +136,7 @@ public final class ConfigurationFragmentPolicy {
// We can relax this assumption if needed. But it's already sketchy to let a rule see more
// than its own configuration. So we don't want to casually proliferate this pattern.
Preconditions.checkArgument(
- transition == ConfigurationTransitionProxy.NONE || transition.isHostTransition());
+ transition == NoTransition.INSTANCE || transition.isHostTransition());
requiredConfigurationFragmentNames.putAll(transition, configurationFragmentNames);
return this;
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/core/CoreRules.java b/src/main/java/com/google/devtools/build/lib/rules/core/CoreRules.java
index 50f1de6ff1..5cfe5939a2 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/core/CoreRules.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/core/CoreRules.java
@@ -29,8 +29,6 @@ public final class CoreRules implements RuleSet {
@Override
public void init(Builder builder) {
- builder.addDynamicTransitionMaps(BaseRuleClasses.DYNAMIC_TRANSITIONS_MAP);
-
builder.addConfig(TestConfiguration.TestOptions.class, new TestConfiguration.Loader());
builder.addRuleDefinition(new BaseRuleClasses.RootRule());
builder.addRuleDefinition(new BaseRuleClasses.BaseRule());
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index 58f557c96f..9e0a419eb8 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -73,6 +73,7 @@ import com.google.devtools.build.lib.analysis.config.ConfigurationResolver;
import com.google.devtools.build.lib.analysis.config.HostTransition;
import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransitionProxy;
+import com.google.devtools.build.lib.analysis.config.transitions.NoTransition;
import com.google.devtools.build.lib.analysis.config.transitions.PatchTransition;
import com.google.devtools.build.lib.analysis.config.transitions.Transition;
import com.google.devtools.build.lib.analysis.configuredtargets.MergedConfiguredTarget;
@@ -1131,7 +1132,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory {
((ConfiguredRuleClassProvider) ruleClassProvider)
.getDynamicTransitionMapper()
.map(ConfigurationTransitionProxy.DATA);
- BuildOptions dataOptions = dataTransition != ConfigurationTransitionProxy.NONE
+ BuildOptions dataOptions = dataTransition != NoTransition.INSTANCE
? ((PatchTransition) dataTransition).apply(firstTargetConfig.getOptions())
: firstTargetConfig.getOptions();
@@ -1629,8 +1630,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory {
@Nullable
public ConfiguredTarget getConfiguredTargetForTesting(
ExtendedEventHandler eventHandler, Label label, BuildConfiguration configuration) {
- return getConfiguredTargetForTesting(
- eventHandler, label, configuration, ConfigurationTransitionProxy.NONE);
+ return getConfiguredTargetForTesting(eventHandler, label, configuration, NoTransition.INSTANCE);
}
/**