Handle transition creation exceptions in producers.
Part of #22996.
PiperOrigin-RevId: 656502048
Change-Id: Ib56cd9374c7d2cc964689c3029c865b294247da8
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/producers/DependencyError.java b/src/main/java/com/google/devtools/build/lib/analysis/producers/DependencyError.java
index ab46baa..24d96db 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/producers/DependencyError.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/producers/DependencyError.java
@@ -16,6 +16,7 @@
import com.google.auto.value.AutoOneOf;
import com.google.devtools.build.lib.analysis.InvalidVisibilityDependencyException;
import com.google.devtools.build.lib.analysis.config.DependencyEvaluationException;
+import com.google.devtools.build.lib.analysis.config.transitions.TransitionFactory.TransitionCreationException;
import com.google.devtools.build.lib.analysis.starlark.StarlarkTransition.TransitionException;
import com.google.devtools.build.lib.skyframe.AspectCreationException;
import com.google.devtools.build.lib.skyframe.config.PlatformMappingException;
@@ -43,6 +44,8 @@
PLATFORM_MAPPING,
/** An error occurred while looking up the target platform. */
INVALID_PLATFORM,
+ /** An error occurred while creating a transition. */
+ TRANSITION_CREATION,
}
public abstract Kind kind();
@@ -61,6 +64,8 @@
public abstract InvalidPlatformException invalidPlatform();
+ public abstract TransitionCreationException transitionCreation();
+
public static boolean isSecondErrorMoreImportant(DependencyError first, DependencyError second) {
// There isn't a good way to prioritize when the type matches, so we just keep the first.
return first.kind().compareTo(second.kind()) > 0;
@@ -82,6 +87,8 @@
return platformMapping();
case INVALID_PLATFORM:
return invalidPlatform();
+ case TRANSITION_CREATION:
+ return transitionCreation();
}
throw new IllegalStateException("unreachable");
}
@@ -113,4 +120,8 @@
static DependencyError of(InvalidPlatformException e) {
return AutoOneOf_DependencyError.invalidPlatform(e);
}
+
+ static DependencyError of(TransitionCreationException e) {
+ return AutoOneOf_DependencyError.transitionCreation(e);
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/producers/DependencyProducer.java b/src/main/java/com/google/devtools/build/lib/analysis/producers/DependencyProducer.java
index bef6aa4..bbdc20e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/producers/DependencyProducer.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/producers/DependencyProducer.java
@@ -32,6 +32,7 @@
import com.google.devtools.build.lib.analysis.config.DependencyEvaluationException;
import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransition;
import com.google.devtools.build.lib.analysis.config.transitions.TransitionCollector;
+import com.google.devtools.build.lib.analysis.config.transitions.TransitionFactory.TransitionCreationException;
import com.google.devtools.build.lib.analysis.starlark.StarlarkTransition.TransitionException;
import com.google.devtools.build.lib.causes.Cause;
import com.google.devtools.build.lib.causes.LoadingFailedCause;
@@ -172,8 +173,13 @@
case ERROR:
return new ExecGroupErrorEmitter(executionPlatformResult.error());
}
- ConfigurationTransition attributeTransition =
- attribute.getTransitionFactory().create(transitionData.build());
+ ConfigurationTransition attributeTransition;
+ try {
+ attributeTransition = attribute.getTransitionFactory().create(transitionData.build());
+ } catch (TransitionCreationException e) {
+ sink.acceptDependencyError(DependencyError.of(e));
+ return DONE;
+ }
sink.acceptTransition(kind, toLabel, attributeTransition);
return new TransitionApplier(
configurationKey,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
index 9dc0189..0c61a00 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
@@ -258,6 +258,7 @@
"//src/main/java/com/google/devtools/build/lib/analysis:config/transitions/configuration_transition",
"//src/main/java/com/google/devtools/build/lib/analysis:config/transitions/patch_transition",
"//src/main/java/com/google/devtools/build/lib/analysis:config/transitions/transition_collector",
+ "//src/main/java/com/google/devtools/build/lib/analysis:config/transitions/transition_factory",
"//src/main/java/com/google/devtools/build/lib/analysis:configured_object_value",
"//src/main/java/com/google/devtools/build/lib/analysis:configured_target",
"//src/main/java/com/google/devtools/build/lib/analysis:configured_target_value",
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/DependencyResolver.java b/src/main/java/com/google/devtools/build/lib/skyframe/DependencyResolver.java
index 63f8daa..602861a 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/DependencyResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/DependencyResolver.java
@@ -45,6 +45,7 @@
import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransition;
import com.google.devtools.build.lib.analysis.config.transitions.PatchTransition;
import com.google.devtools.build.lib.analysis.config.transitions.TransitionCollector;
+import com.google.devtools.build.lib.analysis.config.transitions.TransitionFactory.TransitionCreationException;
import com.google.devtools.build.lib.analysis.constraints.IncompatibleTargetChecker.IncompatibleTargetException;
import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
import com.google.devtools.build.lib.analysis.producers.BuildConfigurationKeyCache;
@@ -733,6 +734,10 @@
InvalidPlatformException invalidPlatformException = error.invalidPlatform();
throw new ConfiguredValueCreationException(
ctgValue.getTarget(), invalidPlatformException.getMessage());
+ case TRANSITION_CREATION:
+ TransitionCreationException transitionCreationException = error.transitionCreation();
+ throw new ConfiguredValueCreationException(
+ ctgValue.getTarget(), transitionCreationException.getMessage());
}
}
if (!state.transitiveState.hasRootCause() && state.dependencyMap == null) {