diff options
-rw-r--r-- | site/docs/skylark/spec.md | 10 | ||||
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/syntax/BaseFunctionTest.java | 10 |
2 files changed, 16 insertions, 4 deletions
diff --git a/site/docs/skylark/spec.md b/site/docs/skylark/spec.md index 5eedb45dfc..6cb428b1cf 100644 --- a/site/docs/skylark/spec.md +++ b/site/docs/skylark/spec.md @@ -1635,10 +1635,10 @@ print(x) # 1 ### Function and method calls ```text -CallSuffix = '(' [Arguments] ')' . +CallSuffix = '(' [Arguments [',']] ')' . Arguments = Argument {',' Argument} . -Argument = Test | identifier '=' Test | '*' identifier | '**' identifier . +Argument = Test | identifier '=' Test | '*' Test | '**' Test . ``` A value `f` of type `function` may be called using the expression `f(...)`. @@ -3161,6 +3161,7 @@ File = {Statement | newline} eof . Statement = DefStmt | IfStmt | ForStmt | SimpleStmt . DefStmt = 'def' identifier '(' [Parameters [',']] ')' ':' Suite . +# NOTE: trailing comma is not permitted if the last argument is `'*' identifier` or `'**' identifier`. Parameters = Parameter {',' Parameter}. @@ -3214,11 +3215,12 @@ Operand = identifier . DotSuffix = '.' identifier . -CallSuffix = '(' [Arguments [',']] ')' . SliceSuffix = '[' [Expression] [':' Test [':' Test]] ']' . +CallSuffix = '(' [Arguments [',']] ')' . +# NOTE: trailing comma is not permitted if the last argument is `'*' Test` or `'**' Test`. Arguments = Argument {',' Argument} . -Argument = Test | identifier '=' Test | '*' identifier | '**' identifier . +Argument = Test | identifier '=' Test | '*' Test | '**' Test . ListExpr = '[' [Expression [',']] ']' . ListComp = '[' Test {CompClause} ']'. diff --git a/src/test/java/com/google/devtools/build/lib/syntax/BaseFunctionTest.java b/src/test/java/com/google/devtools/build/lib/syntax/BaseFunctionTest.java index 575b03f662..8933ce6a05 100644 --- a/src/test/java/com/google/devtools/build/lib/syntax/BaseFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/syntax/BaseFunctionTest.java @@ -157,4 +157,14 @@ public class BaseFunctionTest extends EvaluationTestCase { .isEqualTo("{\"name\": \"foo\", \"type\": \"jpg\", \"version\": 42}"); assertThat(Printer.repr(lookup("b2"))).isEqualTo("{}"); } + + @Test + public void testCommaAfterArgsAndKwargs() throws Exception { + // Test that commas are not allowed in function definitions and calls + // after last *args or **kwargs expressions. + checkEvalErrorContains("syntax error at ')': expected identifier", "def foo(*args,): pass"); + checkEvalErrorContains("unexpected tokens after kwarg", "def foo(**kwargs,): pass"); + checkEvalErrorContains("syntax error at ')': expected expression", "foo(*args,)"); + checkEvalErrorContains("unexpected tokens after kwarg", "foo(**kwargs,)"); + } } |