Use failure details in InfoCommand, InvalidConfigurationException

Adapts its usage of ExitCode and AbruptExitException to add FailureDetail
values. Failure modes detected there now have corresponding codes in
failure_details.proto.

InvalidConfigurationException now specifies a fine-grained code to more
precisely represent what configuration-related activity failed. This gets
its first use for platform mapping failures. (Platform mapping failures
may benefit from additional refinement.)

RELNOTES: None.
PiperOrigin-RevId: 309104771
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BUILD b/src/main/java/com/google/devtools/build/lib/analysis/BUILD
index aa46a17..29d2426 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BUILD
@@ -1622,6 +1622,10 @@
 java_library(
     name = "config/invalid_configuration_exception",
     srcs = ["config/InvalidConfigurationException.java"],
+    deps = [
+        "//src/main/protobuf:failure_details_java_proto",
+        "//third_party:jsr305",
+    ],
 )
 
 java_library(
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/InvalidConfigurationException.java b/src/main/java/com/google/devtools/build/lib/analysis/config/InvalidConfigurationException.java
index 35bca2c..7f2a7f4 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/InvalidConfigurationException.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/InvalidConfigurationException.java
@@ -13,21 +13,39 @@
 // limitations under the License.
 package com.google.devtools.build.lib.analysis.config;
 
+import com.google.devtools.build.lib.server.FailureDetails.BuildConfiguration.Code;
+import javax.annotation.Nullable;
+
 /**
  * Thrown if the configuration options lead to an invalid configuration, or if any of the
  * configuration labels cannot be loaded.
  */
 public class InvalidConfigurationException extends Exception {
 
+  @Nullable private final Code detailedCode;
+
   public InvalidConfigurationException(String message) {
     super(message);
+    this.detailedCode = null;
   }
 
   public InvalidConfigurationException(String message, Throwable cause) {
     super(message, cause);
+    this.detailedCode = null;
   }
 
   public InvalidConfigurationException(Throwable cause) {
-    this(cause.getMessage(), cause);
+    super(cause.getMessage(), cause);
+    this.detailedCode = null;
+  }
+
+  public InvalidConfigurationException(Code detailedCode, Exception cause) {
+    super(cause.getMessage(), cause);
+    this.detailedCode = detailedCode;
+  }
+
+  @Nullable
+  public Code getDetailedCode() {
+    return detailedCode;
   }
 }