Skip to content

Commit bf62f09

Browse files
committed
decorators
1 parent 8ed83d0 commit bf62f09

File tree

3 files changed

+36
-2
lines changed

3 files changed

+36
-2
lines changed

parser/grammar.y

+9-2
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ nls:
260260

261261
optional_arglist:
262262
{
263-
$$ = nil
263+
$$ = &ast.Call{ExprBase: ast.ExprBase{$<pos>$}}
264264
}
265265
| arglist
266266
{
@@ -279,7 +279,14 @@ optional_arglist_call:
279279
decorator:
280280
'@' dotted_name optional_arglist_call NEWLINE
281281
{
282-
// FIXME
282+
fn := &ast.Name{ExprBase: ast.ExprBase{$<pos>$}, Id: ast.Identifier($2), Ctx: ast.Load}
283+
if $3 == nil {
284+
$$ = fn
285+
} else {
286+
call := *$3
287+
call.Func = fn
288+
$$ = &call
289+
}
283290
}
284291

285292
decorators:

parser/grammar_test.go

+4
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,10 @@ func TestGrammar(t *testing.T) {
267267
{"class A(B,C): pass", "exec", "Module(body=[ClassDef(name='A', bases=[Name(id='B', ctx=Load()), Name(id='C', ctx=Load())], keywords=[], starargs=None, kwargs=None, body=[Pass()], decorator_list=[])])"},
268268
{"class A(B,C,D=F): pass", "exec", "Module(body=[ClassDef(name='A', bases=[Name(id='B', ctx=Load()), Name(id='C', ctx=Load())], keywords=[keyword(arg='D', value=Name(id='F', ctx=Load()))], starargs=None, kwargs=None, body=[Pass()], decorator_list=[])])"},
269269
{"class A(B,C,D=F,*AS,**KWS): pass", "exec", "Module(body=[ClassDef(name='A', bases=[Name(id='B', ctx=Load()), Name(id='C', ctx=Load())], keywords=[keyword(arg='D', value=Name(id='F', ctx=Load()))], starargs=Name(id='AS', ctx=Load()), kwargs=Name(id='KWS', ctx=Load()), body=[Pass()], decorator_list=[])])"},
270+
{"@dec\ndef fn():\n pass\n", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[Name(id='dec', ctx=Load())], returns=None)])"},
271+
{"@dec()\ndef fn():\n pass\n", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[Call(func=Name(id='dec', ctx=Load()), args=[], keywords=[], starargs=None, kwargs=None)], returns=None)])"},
272+
{"@dec(a,b,c=d,*args,**kwargs)\ndef fn():\n pass\n", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[Call(func=Name(id='dec', ctx=Load()), args=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())], keywords=[keyword(arg='c', value=Name(id='d', ctx=Load()))], starargs=Name(id='args', ctx=Load()), kwargs=Name(id='kwargs', ctx=Load()))], returns=None)])"},
273+
{"@dec1\n@dec2()\n@dec3(a)\n@dec4(a,b)\ndef fn():\n pass\n", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[Name(id='dec1', ctx=Load()), Call(func=Name(id='dec2', ctx=Load()), args=[], keywords=[], starargs=None, kwargs=None), Call(func=Name(id='dec3', ctx=Load()), args=[Name(id='a', ctx=Load())], keywords=[], starargs=None, kwargs=None), Call(func=Name(id='dec4', ctx=Load()), args=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())], keywords=[], starargs=None, kwargs=None)], returns=None)])"},
270274
// END TESTS
271275
} {
272276
Ast, err := ParseString(test.in, test.mode)

parser/make_grammar_test.py

+23
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,29 @@
376376
("class A(B,C,D=F,*AS,**KWS): pass", "exec"),
377377

378378
# decorators
379+
("""\
380+
@dec
381+
def fn():
382+
pass
383+
""", "exec"),
384+
("""\
385+
@dec()
386+
def fn():
387+
pass
388+
""", "exec"),
389+
("""\
390+
@dec(a,b,c=d,*args,**kwargs)
391+
def fn():
392+
pass
393+
""", "exec"),
394+
("""\
395+
@dec1
396+
@dec2()
397+
@dec3(a)
398+
@dec4(a,b)
399+
def fn():
400+
pass
401+
""", "exec"),
379402
]
380403

381404
def dump(source, mode):

0 commit comments

Comments
 (0)