Add fine grained Query failure codes to query functions.

Fine grained failures were added to "SomeFunction", "RBuildFilesFunction", and "RPackageLookupsFunction".

RELNOTES: None.
PiperOrigin-RevId: 320304168
diff --git a/src/main/java/com/google/devtools/build/lib/query2/RBuildFilesFunction.java b/src/main/java/com/google/devtools/build/lib/query2/RBuildFilesFunction.java
index f6a9d66..fe9eeb6 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/RBuildFilesFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/RBuildFilesFunction.java
@@ -24,6 +24,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.QueryExpressionContext;
+import com.google.devtools.build.lib.server.FailureDetails.Query;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -66,7 +67,9 @@
       Callback<T> callback) {
     if (!(env instanceof SkyQueryEnvironment)) {
       return env.immediateFailedFuture(
-          new QueryException("rbuildfiles can only be used with SkyQueryEnvironment"));
+          new QueryException(
+              "rbuildfiles can only be used with SkyQueryEnvironment",
+              Query.Code.RBUILDFILES_FUNCTION_REQUIRES_SKYQUERY));
     }
     SkyQueryEnvironment skyEnv = ((SkyQueryEnvironment) env);
     return skyEnv.getRBuildFiles(
diff --git a/src/main/java/com/google/devtools/build/lib/query2/engine/QueryParser.java b/src/main/java/com/google/devtools/build/lib/query2/engine/QueryParser.java
index 45aa9fb..0463dcd 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/engine/QueryParser.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/engine/QueryParser.java
@@ -19,6 +19,7 @@
 import com.google.devtools.build.lib.query2.engine.QueryEnvironment.Argument;
 import com.google.devtools.build.lib.query2.engine.QueryEnvironment.ArgumentType;
 import com.google.devtools.build.lib.query2.engine.QueryEnvironment.QueryFunction;
+import com.google.devtools.build.lib.server.FailureDetails.Query;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -68,8 +69,9 @@
     QueryParser parser = new QueryParser(Lexer.scan(query), functions);
     QueryExpression expr = parser.parseExpression();
     if (parser.token.kind != TokenKind.EOF) {
-      throw new QueryException("unexpected token '" + parser.token
-          + "' after query expression '" + expr +  "'");
+      throw new QueryException(
+          "unexpected token '" + parser.token + "' after query expression '" + expr + "'",
+          Query.Code.UNEXPECTED_TOKEN_ERROR);
     }
     return expr;
   }
@@ -86,6 +88,7 @@
    */
   private QueryException syntaxError(Lexer.Token token) {
     String message = "premature end of input";
+    Query.Code queryCode = Query.Code.PREMATURE_END_OF_INPUT_ERROR;
     if (token.kind != TokenKind.EOF) {
       StringBuilder buf = new StringBuilder("syntax error at '");
       String sep = "";
@@ -97,8 +100,9 @@
       }
       buf.append("'");
       message = buf.toString();
+      queryCode = Query.Code.SYNTAX_ERROR;
     }
-    return new QueryException(message);
+    return new QueryException(message, queryCode);
   }
 
   /**
@@ -124,7 +128,8 @@
     try {
       return Integer.parseInt(intString);
     } catch (NumberFormatException e) {
-      throw new QueryException("expected an integer literal: '" + intString + "'");
+      throw new QueryException(
+          "expected an integer literal: '" + intString + "'", Query.Code.INTEGER_LITERAL_MISSING);
     }
   }
 
@@ -267,7 +272,8 @@
   private static TargetLiteral validateTargetLiteral(String word) throws QueryException {
     if (word.startsWith("-") || word.startsWith("*")) {
       throw new QueryException(
-          "target literal must not begin with " + "(" + word.charAt(0) + "): " + word);
+          "target literal must not begin with " + "(" + word.charAt(0) + "): " + word,
+          Query.Code.INVALID_STARTING_CHARACTER_ERROR);
     }
     return new TargetLiteral(word);
   }
diff --git a/src/main/java/com/google/devtools/build/lib/query2/engine/SomeFunction.java b/src/main/java/com/google/devtools/build/lib/query2/engine/SomeFunction.java
index 882cbc9..14ef027 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/engine/SomeFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/engine/SomeFunction.java
@@ -21,6 +21,7 @@
 import com.google.devtools.build.lib.query2.engine.QueryEnvironment.QueryFunction;
 import com.google.devtools.build.lib.query2.engine.QueryEnvironment.QueryTaskCallable;
 import com.google.devtools.build.lib.query2.engine.QueryEnvironment.QueryTaskFuture;
+import com.google.devtools.build.lib.server.FailureDetails.Query;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicBoolean;
 
@@ -76,7 +77,8 @@
           @Override
           public Void call() throws QueryException {
             if (!someFound.get()) {
-              throw new QueryException(expression, "argument set is empty");
+              throw new QueryException(
+                  expression, "argument set is empty", Query.Code.ARGUMENTS_MISSING);
             }
             return null;
           }
diff --git a/src/main/protobuf/failure_details.proto b/src/main/protobuf/failure_details.proto
index eae6131..8533c4d 100644
--- a/src/main/protobuf/failure_details.proto
+++ b/src/main/protobuf/failure_details.proto
@@ -609,6 +609,14 @@
     UNIVERSE_SCOPE_LIMIT_EXCEEDED = 25 [(metadata) = { exit_code: 7 }];
     INVALIDATION_LIMIT_EXCEEDED = 26 [(metadata) = { exit_code: 7 }];
     OUTPUT_FORMAT_PREREQ_UNMET = 27 [(metadata) = { exit_code: 2 }];
+    ARGUMENTS_MISSING = 28 [(metadata) = { exit_code: 7 }];
+    RBUILDFILES_FUNCTION_REQUIRES_SKYQUERY = 29 [(metadata) = { exit_code: 7 }];
+    FULL_TARGETS_NOT_SUPPORTED = 30 [(metadata) = { exit_code: 7 }];
+    UNEXPECTED_TOKEN_ERROR = 31 [(metadata) = { exit_code: 2 }];
+    INTEGER_LITERAL_MISSING = 32 [(metadata) = { exit_code: 2 }];
+    INVALID_STARTING_CHARACTER_ERROR = 33 [(metadata) = { exit_code: 2 }];
+    PREMATURE_END_OF_INPUT_ERROR = 34 [(metadata) = { exit_code: 2 }];
+    SYNTAX_ERROR = 35 [(metadata) = { exit_code: 2 }];
 
     reserved 7 to 12; // For internal use
   }