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) {