diff options
author | 2015-05-27 16:14:43 +0000 | |
---|---|---|
committer | 2015-05-27 16:50:21 +0000 | |
commit | b3266389f0887b3f6f447f3313f3fe5c6cf1d23e (patch) | |
tree | 9f15e420daf3b04c00a1ff9a491b87cf63083a0c /src | |
parent | 5e81faf82ec67d53437cc02501ea0fc13d94050c (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.java | 14 | ||||
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java | 14 |
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"); |