aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--site/docs/skylark/spec.md10
-rw-r--r--src/test/java/com/google/devtools/build/lib/syntax/BaseFunctionTest.java10
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,)");
+ }
}