aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Laurent Le Brun <laurentlb@google.com>2015-05-27 16:14:43 +0000
committerGravatar Laurent Le Brun <laurentlb@google.com>2015-05-27 16:50:21 +0000
commitb3266389f0887b3f6f447f3313f3fe5c6cf1d23e (patch)
tree9f15e420daf3b04c00a1ff9a491b87cf63083a0c /src
parent5e81faf82ec67d53437cc02501ea0fc13d94050c (diff)
Forbid **kwargs and *args in BUILD files.
Rationale: it makes BUILD files less declarative and makes harder to do automated changes on BUILD files. It is however still allowed in .bzl files. -- MOS_MIGRATED_REVID=94577442
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/Parser.java14
-rw-r--r--src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java14
2 files changed, 28 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java b/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
index ae267e52e3..67e13e537c 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
@@ -407,16 +407,30 @@ class Parser {
// arg ::= IDENTIFIER '=' nontupleexpr
// | expr
+ // | *args (only in Skylark mode)
+ // | **kwargs (only in Skylark mode)
+ // To keep BUILD files declarative and easy to process, *args and **kwargs
+ // arguments are allowed only in Skylark mode.
private Argument.Passed parseFuncallArgument() {
final int start = token.left;
// parse **expr
if (token.kind == TokenKind.STAR_STAR) {
+ if (!skylarkMode) {
+ reportError(
+ lexer.createLocation(token.left, token.right),
+ "**kwargs arguments are not allowed in BUILD files");
+ }
nextToken();
Expression expr = parseNonTupleExpression();
return setLocation(new Argument.StarStar(expr), start, expr);
}
// parse *expr
if (token.kind == TokenKind.STAR) {
+ if (!skylarkMode) {
+ reportError(
+ lexer.createLocation(token.left, token.right),
+ "*args arguments are not allowed in BUILD files");
+ }
nextToken();
Expression expr = parseNonTupleExpression();
return setLocation(new Argument.Star(expr), start, expr);
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
index ef1b9f9fda..5f33718fc2 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
@@ -1036,6 +1036,20 @@ public class ParserTest extends EvaluationTestCase {
}
@Test
+ public void testKwargsForbidden() throws Exception {
+ setFailFast(false);
+ parseFile("func(**dict)");
+ assertContainsEvent("**kwargs arguments are not allowed in BUILD files");
+ }
+
+ @Test
+ public void testArgsForbidden() throws Exception {
+ setFailFast(false);
+ parseFile("func(*array)");
+ assertContainsEvent("*args arguments are not allowed in BUILD files");
+ }
+
+ @Test
public void testOptionalArgBeforeMandatoryArgInFuncDef() throws Exception {
setFailFast(false);
parseFileForSkylark("def func(a, b = 'a', c):\n return 0\n");