Include dependency edge info in transition errors

When a Starlark transition implementation function fails, it now prints an error such as:

```
ERROR: /home/user/example/BUILD.bazel:3:11: On dependency edge //pkg:wrapper (ed19e2b) -|exports|-> //pkg:real_target: Errors encountered while applying Starlark transition
```

Previously, the generated error messages would only point to the BUILD file location of the target with the outgoing edge as well as a stack trace of the transition function (the latter only for Starlark errors, not those encountered during option conversion).

Closes #19251.

PiperOrigin-RevId: 557267979
Change-Id: I8988efde4ffb0ce0bc698640305b24e7b5f92cdd
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 3bbaac4..1e4e06f 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
@@ -189,12 +189,26 @@
 
   @Override
   public void acceptTransitionError(TransitionException e) {
-    sink.acceptDependencyError(DependencyError.of(e));
+    sink.acceptDependencyError(
+        DependencyError.of(new TransitionException(getMessageWithEdgeTransitionInfo(e), e)));
   }
 
   @Override
   public void acceptTransitionError(OptionsParsingException e) {
-    sink.acceptDependencyError(DependencyError.of(e));
+    sink.acceptDependencyError(
+        DependencyError.of(
+            new OptionsParsingException(
+                getMessageWithEdgeTransitionInfo(e), e.getInvalidArgument(), e)));
+  }
+
+  private String getMessageWithEdgeTransitionInfo(Throwable e) {
+    return String.format(
+        "On dependency edge %s (%s) -|%s|-> %s: %s",
+        parameters.target().getLabel(),
+        parameters.configurationKey().getOptions().shortId(),
+        kind.getAttribute().getName(),
+        toLabel,
+        e.getMessage());
   }
 
   private StateMachine processTransitionResult(Tasks tasks) {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkTransition.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkTransition.java
index 5e49ce0..9e1ebab 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkTransition.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkTransition.java
@@ -87,20 +87,16 @@
   // TODO(blaze-configurability): add more information to this exception e.g. originating target of
   // transition.
   public static class TransitionException extends Exception {
-    private final String message;
-
     public TransitionException(String message) {
-      this.message = message;
+      super(message);
     }
 
     public TransitionException(Throwable cause) {
-      this.message = cause.getMessage();
+      super(cause);
     }
 
-    /** Returns the error message. */
-    @Override
-    public String getMessage() {
-      return message;
+    public TransitionException(String message, Throwable cause) {
+      super(message, cause);
     }
   }