@@ -446,21 +446,22 @@ WithItem: ast::WithItem = {
446
446
};
447
447
448
448
FuncDef: ast::LocatedStatement = {
449
- <d:Decorator*> <loc:@L> "def" <i:Identifier> <a:Parameters> ":" <s:Suite> => {
449
+ <d:Decorator*> <loc:@L> "def" <i:Identifier> <a:Parameters> <r:("->" Test)?> ":" <s:Suite> => {
450
450
ast::LocatedStatement {
451
451
location: loc,
452
452
node: ast::Statement::FunctionDef {
453
453
name: i,
454
454
args: a,
455
455
body: s,
456
456
decorator_list: d,
457
+ returns: r.map(|x| x.1),
457
458
}
458
459
}
459
460
},
460
461
};
461
462
462
463
Parameters: ast::Parameters = {
463
- "(" <a: (TypedArgsList)?> ")" => {
464
+ "(" <a: (TypedArgsList<TypedParameter> )?> ")" => {
464
465
match a {
465
466
Some(a) => a,
466
467
None => Default::default(),
@@ -470,8 +471,10 @@ Parameters: ast::Parameters = {
470
471
471
472
// parameters are (String, None), kwargs are (String, Some(Test)) where Test is
472
473
// the default
473
- TypedArgsList: ast::Parameters = {
474
- <param1:TypedParameters> <args2:("," ParameterListStarArgs)?> => {
474
+ // Note that this is a macro which is used once for function defs, and
475
+ // once for lambda defs.
476
+ TypedArgsList<ArgType>: ast::Parameters = {
477
+ <param1:TypedParameters<ArgType>> <args2:("," ParameterListStarArgs<ArgType>)?> => {
475
478
let (names, default_elements) = param1;
476
479
477
480
// Now gather rest of parameters:
@@ -489,7 +492,7 @@ TypedArgsList: ast::Parameters = {
489
492
kw_defaults: kw_defaults,
490
493
}
491
494
},
492
- <param1:TypedParameters> <kw:("," KwargParameter)> => {
495
+ <param1:TypedParameters<ArgType>> <kw:("," KwargParameter<ArgType> )> => {
493
496
let (names, default_elements) = param1;
494
497
495
498
// Now gather rest of parameters:
@@ -507,7 +510,7 @@ TypedArgsList: ast::Parameters = {
507
510
kw_defaults: kw_defaults,
508
511
}
509
512
},
510
- <params:ParameterListStarArgs> => {
513
+ <params:ParameterListStarArgs<ArgType> > => {
511
514
let (vararg, kwonlyargs, kw_defaults, kwarg) = params;
512
515
ast::Parameters {
513
516
args: vec![],
@@ -518,7 +521,7 @@ TypedArgsList: ast::Parameters = {
518
521
kw_defaults: kw_defaults,
519
522
}
520
523
},
521
- <kw:KwargParameter> => {
524
+ <kw:KwargParameter<ArgType> > => {
522
525
ast::Parameters {
523
526
args: vec![],
524
527
kwonlyargs: vec![],
@@ -532,8 +535,8 @@ TypedArgsList: ast::Parameters = {
532
535
533
536
// Use inline here to make sure the "," is not creating an ambiguity.
534
537
#[inline]
535
- TypedParameters: (Vec<String >, Vec<ast::Expression>) = {
536
- <param1:TypedParameterDef> <param2:("," TypedParameterDef)*> => {
538
+ TypedParameters<ArgType> : (Vec<ast::Parameter >, Vec<ast::Expression>) = {
539
+ <param1:TypedParameterDef<ArgType>> <param2:("," TypedParameterDef<ArgType> )*> => {
537
540
// Combine first parameters:
538
541
let mut args = vec![param1];
539
542
args.extend(param2.into_iter().map(|x| x.1));
@@ -542,7 +545,6 @@ TypedParameters: (Vec<String>, Vec<ast::Expression>) = {
542
545
let mut default_elements = vec![];
543
546
544
547
for (name, default) in args.into_iter() {
545
- names.push(name.clone());
546
548
if let Some(default) = default {
547
549
default_elements.push(default);
548
550
} else {
@@ -551,28 +553,35 @@ TypedParameters: (Vec<String>, Vec<ast::Expression>) = {
551
553
// have defaults
552
554
panic!(
553
555
"non-default argument follows default argument: {}",
554
- name
556
+ & name.arg
555
557
);
556
558
}
557
559
}
560
+ names.push(name);
558
561
}
559
562
560
563
(names, default_elements)
561
564
}
562
565
};
563
566
564
- TypedParameterDef: (String , Option<ast::Expression>) = {
565
- <i:TypedParameter > => (i, None),
566
- <i:TypedParameter > "=" <e:Test> => (i, Some(e)),
567
+ TypedParameterDef<ArgType> : (ast::Parameter , Option<ast::Expression>) = {
568
+ <i:ArgType > => (i, None),
569
+ <i:ArgType > "=" <e:Test> => (i, Some(e)),
567
570
};
568
571
569
- // TODO: add type annotations here:
570
- TypedParameter: String = {
571
- Identifier,
572
+ UntypedParameter: ast::Parameter = {
573
+ <i:Identifier> => ast::Parameter { arg: i, annotation: None },
572
574
};
573
575
574
- ParameterListStarArgs: (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>) = {
575
- "*" <va:Identifier?> <kw:("," TypedParameterDef)*> <kwarg:("," KwargParameter)?> => {
576
+ TypedParameter: ast::Parameter = {
577
+ <arg:Identifier> <a:(":" Test)?>=> {
578
+ let annotation = a.map(|x| Box::new(x.1));
579
+ ast::Parameter { arg, annotation }
580
+ },
581
+ };
582
+
583
+ ParameterListStarArgs<ArgType>: (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>) = {
584
+ "*" <va:ArgType?> <kw:("," TypedParameterDef<ArgType>)*> <kwarg:("," KwargParameter<ArgType>)?> => {
576
585
// Extract keyword arguments:
577
586
let mut kwonlyargs = vec![];
578
587
let mut kw_defaults = vec![];
@@ -590,8 +599,8 @@ ParameterListStarArgs: (Option<Option<String>>, Vec<String>, Vec<Option<ast::Exp
590
599
}
591
600
};
592
601
593
- KwargParameter: Option<String > = {
594
- "**" <kwarg:Identifier ?> => {
602
+ KwargParameter<ArgType> : Option<ast::Parameter > = {
603
+ "**" <kwarg:ArgType ?> => {
595
604
kwarg
596
605
}
597
606
};
@@ -675,7 +684,7 @@ Test: ast::Expression = {
675
684
};
676
685
677
686
LambdaDef: ast::Expression = {
678
- "lambda" <p:TypedArgsList?> ":" <b:Test> =>
687
+ "lambda" <p:TypedArgsList<UntypedParameter> ?> ":" <b:Test> =>
679
688
ast::Expression::Lambda {
680
689
args: p.unwrap_or(Default::default()),
681
690
body:Box::new(b)
@@ -839,6 +848,7 @@ Atom: ast::Expression = {
839
848
"True" => ast::Expression::True,
840
849
"False" => ast::Expression::False,
841
850
"None" => ast::Expression::None,
851
+ "..." => ast::Expression::Ellipsis,
842
852
};
843
853
844
854
TestListComp: Vec<ast::Expression> = {
@@ -1048,6 +1058,7 @@ extern {
1048
1058
"~" => lexer::Tok::Tilde,
1049
1059
":" => lexer::Tok::Colon,
1050
1060
"." => lexer::Tok::Dot,
1061
+ "..." => lexer::Tok::Ellipsis,
1051
1062
"," => lexer::Tok::Comma,
1052
1063
"*" => lexer::Tok::Star,
1053
1064
"**" => lexer::Tok::DoubleStar,
@@ -1086,6 +1097,7 @@ extern {
1086
1097
"<=" => lexer::Tok::LessEqual,
1087
1098
">" => lexer::Tok::Greater,
1088
1099
">=" => lexer::Tok::GreaterEqual,
1100
+ "->" => lexer::Tok::Rarrow,
1089
1101
"and" => lexer::Tok::And,
1090
1102
"as" => lexer::Tok::As,
1091
1103
"assert" => lexer::Tok::Assert,
0 commit comments