Add fine grained Aquery failure codes to AqueryCommandUtils and ActionFilterFunction.

RELNOTES: None.
PiperOrigin-RevId: 320288980
diff --git a/src/main/java/com/google/devtools/build/lib/query2/engine/ActionFilterFunction.java b/src/main/java/com/google/devtools/build/lib/query2/engine/ActionFilterFunction.java
index 65fa79a..68d672a 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/engine/ActionFilterFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/engine/ActionFilterFunction.java
@@ -16,6 +16,7 @@
 import com.google.devtools.build.lib.query2.engine.QueryEnvironment.Argument;
 import com.google.devtools.build.lib.query2.engine.QueryEnvironment.QueryFunction;
 import com.google.devtools.build.lib.query2.engine.QueryEnvironment.QueryTaskFuture;
+import com.google.devtools.build.lib.server.FailureDetails.ActionQuery;
 import java.util.List;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
@@ -45,8 +46,8 @@
           new QueryException(
               expression,
               String.format(
-                  "Illegal '%s' pattern regexp '%s': %s",
-                  getName(), filterPattern, e.getMessage())));
+                  "Illegal '%s' pattern regexp '%s': %s", getName(), filterPattern, e.getMessage()),
+              ActionQuery.Code.ILLEGAL_PATTERN_SYNTAX));
     }
 
     // The 2nd argument can only be empty in the case of --skyframe_state.
@@ -55,7 +56,8 @@
           new QueryException(
               expression,
               "aquery filter functions (inputs, outputs, mnemonics) must have exactly 2 arguments,"
-                  + "except when --skyframe_state is used."));
+                  + "except when --skyframe_state is used.",
+              ActionQuery.Code.INCORRECT_ARGUMENTS));
     }
 
     // Do nothing, pass the expression along
diff --git a/src/main/java/com/google/devtools/build/lib/query2/engine/QueryException.java b/src/main/java/com/google/devtools/build/lib/query2/engine/QueryException.java
index a653be8..f005836 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/engine/QueryException.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/engine/QueryException.java
@@ -13,6 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.query2.engine;
 
+import com.google.devtools.build.lib.server.FailureDetails.ActionQuery;
 import com.google.devtools.build.lib.server.FailureDetails.ConfigurableQuery;
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
 import com.google.devtools.build.lib.server.FailureDetails.Query;
@@ -73,6 +74,17 @@
             .build());
   }
 
+  public QueryException(
+      QueryExpression expression, String message, ActionQuery.Code actionQueryCode) {
+    this(
+        expression,
+        message,
+        FailureDetail.newBuilder()
+            .setMessage(message)
+            .setActionQuery(ActionQuery.newBuilder().setCode(actionQueryCode).build())
+            .build());
+  }
+
   public QueryException(String message, Throwable cause, FailureDetail failureDetail) {
     super(message, cause);
     this.expression = null;
@@ -87,6 +99,10 @@
     this(null, message, queryCode);
   }
 
+  public QueryException(String message, ActionQuery.Code actionQueryCode) {
+    this(null, message, actionQueryCode);
+  }
+
   public QueryException(String message, ConfigurableQuery.Code configurableQueryCode) {
     this(
         null,
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/AqueryCommandUtils.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/AqueryCommandUtils.java
index 0de18cb..8729695 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/AqueryCommandUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/AqueryCommandUtils.java
@@ -16,6 +16,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.query2.engine.QueryException;
 import com.google.devtools.build.lib.query2.engine.QueryExpression;
+import com.google.devtools.build.lib.server.FailureDetails.ActionQuery;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
@@ -56,7 +57,8 @@
               + query
               + "': Specifying build target(s) "
               + topLevelTargets
-              + " with --skyframe_state is currently not supported.");
+              + " with --skyframe_state is currently not supported.",
+          ActionQuery.Code.TOP_LEVEL_TARGETS_WITH_SKYFRAME_STATE_NOT_SUPPORTED);
     }
 
     return topLevelTargets;
diff --git a/src/main/protobuf/failure_details.proto b/src/main/protobuf/failure_details.proto
index 08c9098..eae6131 100644
--- a/src/main/protobuf/failure_details.proto
+++ b/src/main/protobuf/failure_details.proto
@@ -726,6 +726,10 @@
     INVALID_AQUERY_EXPRESSION = 6 [(metadata) = { exit_code: 1 }];
     SKYFRAME_STATE_PREREQ_UNMET = 7 [(metadata) = { exit_code: 2 }];
     AQUERY_OUTPUT_TOO_BIG = 8 [(metadata) = { exit_code: 7 }];
+    ILLEGAL_PATTERN_SYNTAX = 9 [(metadata) = { exit_code: 2 }];
+    INCORRECT_ARGUMENTS = 10 [(metadata) = { exit_code: 2 }];
+    TOP_LEVEL_TARGETS_WITH_SKYFRAME_STATE_NOT_SUPPORTED = 11
+        [(metadata) = { exit_code: 2 }];
   }
 
   Code code = 1;
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/commands/AqueryCommandUtilsTest.java b/src/test/java/com/google/devtools/build/lib/runtime/commands/AqueryCommandUtilsTest.java
index 4c3e68c..8ae7bbe 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/commands/AqueryCommandUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/commands/AqueryCommandUtilsTest.java
@@ -13,6 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.runtime.commands;
 
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.assertThrows;
 
 import com.google.common.collect.ImmutableList;
@@ -22,6 +23,7 @@
 import com.google.devtools.build.lib.query2.engine.QueryException;
 import com.google.devtools.build.lib.query2.engine.QueryExpression;
 import com.google.devtools.build.lib.query2.engine.QueryParser;
+import com.google.devtools.build.lib.server.FailureDetails.ActionQuery;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -52,14 +54,20 @@
       throws Exception {
     String query = "//some_target";
     QueryExpression expr = QueryParser.parse(query, functions);
-
-    assertThrows(
-        QueryException.class,
-        () ->
-            AqueryCommandUtils.getTopLevelTargets(
-                /* universeScope= */ ImmutableList.of(),
-                expr,
-                /* queryCurrentSkyframeState= */ true,
-                query));
+    QueryException exception =
+        assertThrows(
+            QueryException.class,
+            () ->
+                AqueryCommandUtils.getTopLevelTargets(
+                    /* universeScope= */ ImmutableList.of(),
+                    expr,
+                    /* queryCurrentSkyframeState= */ true,
+                    query));
+    assertThat(exception).hasMessageThat().contains("Error while parsing '" + query);
+    assertThat(exception)
+        .hasMessageThat()
+        .contains("with --skyframe_state is currently not supported");
+    assertThat(exception.getFailureDetail().get().getActionQuery().getCode())
+        .isEqualTo(ActionQuery.Code.TOP_LEVEL_TARGETS_WITH_SKYFRAME_STATE_NOT_SUPPORTED);
   }
 }