Skip to content

Commit 8ed83d0

Browse files
committed
Class definition
1 parent 6ae1b00 commit 8ed83d0

File tree

3 files changed

+31
-8
lines changed

3 files changed

+31
-8
lines changed

parser/grammar.y

+15-8
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,13 @@ func setCtx(exprs []ast.Expr, ctx ast.ExprContext) {
8686
%type <stmts> simple_stmt stmt nl_or_stmt small_stmts stmts suite optional_else
8787
%type <stmt> compound_stmt small_stmt expr_stmt del_stmt pass_stmt flow_stmt import_stmt global_stmt nonlocal_stmt assert_stmt break_stmt continue_stmt return_stmt raise_stmt yield_stmt import_name import_from while_stmt if_stmt for_stmt try_stmt with_stmt funcdef classdef classdef_or_funcdef decorated
8888
%type <op> augassign
89-
%type <expr> expr_or_star_expr expr star_expr xor_expr and_expr shift_expr arith_expr term factor power trailer atom test_or_star_expr test not_test lambdef test_nocond lambdef_nocond or_test and_test comparison testlist testlist_star_expr yield_expr_or_testlist yield_expr yield_expr_or_testlist_star_expr dictorsetmaker sliceop arglist except_clause optional_return_type decorator
89+
%type <expr> expr_or_star_expr expr star_expr xor_expr and_expr shift_expr arith_expr term factor power trailer atom test_or_star_expr test not_test lambdef test_nocond lambdef_nocond or_test and_test comparison testlist testlist_star_expr yield_expr_or_testlist yield_expr yield_expr_or_testlist_star_expr dictorsetmaker sliceop except_clause optional_return_type decorator
9090
%type <exprs> exprlist testlistraw comp_if comp_iter expr_or_star_exprs test_or_star_exprs tests test_colon_tests trailers equals_yield_expr_or_testlist_star_expr decorators
9191
%type <cmpop> comp_op
9292
%type <comma> optional_comma
9393
%type <comprehensions> comp_for
9494
%type <slice> subscript subscriptlist subscripts
95-
%type <call> argument arguments optional_arguments arguments2
95+
%type <call> argument arguments optional_arguments arguments2 arglist optional_arglist_call optional_arglist
9696
%type <level> dot dots
9797
%type <str> dotted_name from_arg
9898
%type <identifiers> names
@@ -260,20 +260,20 @@ nls:
260260

261261
optional_arglist:
262262
{
263-
// FIXME
263+
$$ = nil
264264
}
265265
| arglist
266266
{
267-
// FIXME
267+
$$ = $1
268268
}
269269

270270
optional_arglist_call:
271271
{
272-
// FIXME
272+
$$ = nil
273273
}
274274
| '(' optional_arglist ')'
275275
{
276-
// FIXME
276+
$$ = $2
277277
}
278278

279279
decorator:
@@ -1763,8 +1763,15 @@ dictorsetmaker:
17631763
classdef:
17641764
CLASS NAME optional_arglist_call ':' suite
17651765
{
1766-
// FIXME
1767-
// $$ = &ast.ClassDef{StmtBase: ast.StmtBase{$<pos>$}, Name: ast.Identifier($2), Args: $3, Body: $5}
1766+
classDef := &ast.ClassDef{StmtBase: ast.StmtBase{$<pos>$}, Name: ast.Identifier($2), Body: $5}
1767+
$$ = classDef
1768+
args := $3
1769+
if args != nil {
1770+
classDef.Bases = args.Args
1771+
classDef.Keywords = args.Keywords
1772+
classDef.Starargs = args.Starargs
1773+
classDef.Kwargs = args.Kwargs
1774+
}
17681775
}
17691776

17701777
arguments:

parser/grammar_test.go

+6
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,12 @@ func TestGrammar(t *testing.T) {
261261
{"def fn(*args, c=d): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=arg(arg='args', annotation=None), kwonlyargs=[arg(arg='c', annotation=None)], kw_defaults=[Name(id='d', ctx=Load())], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None)])"},
262262
{"def fn(*args, c=d, **kws): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=arg(arg='args', annotation=None), kwonlyargs=[arg(arg='c', annotation=None)], kw_defaults=[Name(id='d', ctx=Load())], kwarg=arg(arg='kws', annotation=None), defaults=[]), body=[Pass()], decorator_list=[], returns=None)])"},
263263
{"def fn(**kws): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=arg(arg='kws', annotation=None), defaults=[]), body=[Pass()], decorator_list=[], returns=None)])"},
264+
{"class A: pass", "exec", "Module(body=[ClassDef(name='A', bases=[], keywords=[], starargs=None, kwargs=None, body=[Pass()], decorator_list=[])])"},
265+
{"class A(): pass", "exec", "Module(body=[ClassDef(name='A', bases=[], keywords=[], starargs=None, kwargs=None, body=[Pass()], decorator_list=[])])"},
266+
{"class A(B): pass", "exec", "Module(body=[ClassDef(name='A', bases=[Name(id='B', ctx=Load())], keywords=[], starargs=None, kwargs=None, body=[Pass()], decorator_list=[])])"},
267+
{"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=[])])"},
268+
{"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=[])])"},
269+
{"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=[])])"},
264270
// END TESTS
265271
} {
266272
Ast, err := ParseString(test.in, test.mode)

parser/make_grammar_test.py

+10
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,16 @@
366366
("def fn(*args, c=d): pass", "exec"),
367367
("def fn(*args, c=d, **kws): pass", "exec"),
368368
("def fn(**kws): pass", "exec"),
369+
370+
# class
371+
("class A: pass", "exec"),
372+
("class A(): pass", "exec"),
373+
("class A(B): pass", "exec"),
374+
("class A(B,C): pass", "exec"),
375+
("class A(B,C,D=F): pass", "exec"),
376+
("class A(B,C,D=F,*AS,**KWS): pass", "exec"),
377+
378+
# decorators
369379
]
370380

371381
def dump(source, mode):

0 commit comments

Comments
 (0)