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
}