@@ -460,7 +460,7 @@ FuncDef: ast::LocatedStatement = {
460
460
};
461
461
462
462
Parameters: ast::Parameters = {
463
- "(" <a: (TypedArgsList)?> ")" => {
463
+ "(" <a: (TypedArgsList<TypedParameter> )?> ")" => {
464
464
match a {
465
465
Some(a) => a,
466
466
None => Default::default(),
@@ -470,8 +470,10 @@ Parameters: ast::Parameters = {
470
470
471
471
// parameters are (String, None), kwargs are (String, Some(Test)) where Test is
472
472
// the default
473
- TypedArgsList: ast::Parameters = {
474
- <param1:TypedParameters> <args2:("," ParameterListStarArgs)?> => {
473
+ // Note that this is a macro which is used once for function defs, and
474
+ // once for lambda defs.
475
+ TypedArgsList<ArgType>: ast::Parameters = {
476
+ <param1:TypedParameters<ArgType>> <args2:("," ParameterListStarArgs<ArgType>)?> => {
475
477
let (names, default_elements) = param1;
476
478
477
479
// Now gather rest of parameters:
@@ -489,7 +491,7 @@ TypedArgsList: ast::Parameters = {
489
491
kw_defaults: kw_defaults,
490
492
}
491
493
},
492
- <param1:TypedParameters> <kw:("," KwargParameter)> => {
494
+ <param1:TypedParameters<ArgType>> <kw:("," KwargParameter<ArgType> )> => {
493
495
let (names, default_elements) = param1;
494
496
495
497
// Now gather rest of parameters:
@@ -507,7 +509,7 @@ TypedArgsList: ast::Parameters = {
507
509
kw_defaults: kw_defaults,
508
510
}
509
511
},
510
- <params:ParameterListStarArgs> => {
512
+ <params:ParameterListStarArgs<ArgType> > => {
511
513
let (vararg, kwonlyargs, kw_defaults, kwarg) = params;
512
514
ast::Parameters {
513
515
args: vec![],
@@ -518,7 +520,7 @@ TypedArgsList: ast::Parameters = {
518
520
kw_defaults: kw_defaults,
519
521
}
520
522
},
521
- <kw:KwargParameter> => {
523
+ <kw:KwargParameter<ArgType> > => {
522
524
ast::Parameters {
523
525
args: vec![],
524
526
kwonlyargs: vec![],
@@ -532,8 +534,8 @@ TypedArgsList: ast::Parameters = {
532
534
533
535
// Use inline here to make sure the "," is not creating an ambiguity.
534
536
#[inline]
535
- TypedParameters: (Vec<String >, Vec<ast::Expression>) = {
536
- <param1:TypedParameterDef> <param2:("," TypedParameterDef)*> => {
537
+ TypedParameters<ArgType> : (Vec<ast::Parameter >, Vec<ast::Expression>) = {
538
+ <param1:TypedParameterDef<ArgType>> <param2:("," TypedParameterDef<ArgType> )*> => {
537
539
// Combine first parameters:
538
540
let mut args = vec![param1];
539
541
args.extend(param2.into_iter().map(|x| x.1));
@@ -542,7 +544,6 @@ TypedParameters: (Vec<String>, Vec<ast::Expression>) = {
542
544
let mut default_elements = vec![];
543
545
544
546
for (name, default) in args.into_iter() {
545
- names.push(name.clone());
546
547
if let Some(default) = default {
547
548
default_elements.push(default);
548
549
} else {
@@ -551,28 +552,35 @@ TypedParameters: (Vec<String>, Vec<ast::Expression>) = {
551
552
// have defaults
552
553
panic!(
553
554
"non-default argument follows default argument: {}",
554
- name
555
+ & name.arg
555
556
);
556
557
}
557
558
}
559
+ names.push(name);
558
560
}
559
561
560
562
(names, default_elements)
561
563
}
562
564
};
563
565
564
- TypedParameterDef: (String , Option<ast::Expression>) = {
565
- <i:TypedParameter > => (i, None),
566
- <i:TypedParameter > "=" <e:Test> => (i, Some(e)),
566
+ TypedParameterDef<ArgType> : (ast::Parameter , Option<ast::Expression>) = {
567
+ <i:ArgType > => (i, None),
568
+ <i:ArgType > "=" <e:Test> => (i, Some(e)),
567
569
};
568
570
569
- // TODO: add type annotations here:
570
- TypedParameter: String = {
571
- Identifier,
571
+ UntypedParameter: ast::Parameter = {
572
+ <i:Identifier> => ast::Parameter { arg: i, annotation: None },
572
573
};
573
574
574
- ParameterListStarArgs: (Option<Option<String>>, Vec<String>, Vec<Option<ast::Expression>>, Option<Option<String>>) = {
575
- "*" <va:Identifier?> <kw:("," TypedParameterDef)*> <kwarg:("," KwargParameter)?> => {
575
+ TypedParameter: ast::Parameter = {
576
+ <arg:Identifier> <a:(":" Test)?>=> {
577
+ let annotation = a.map(|x| Box::new(x.1));
578
+ ast::Parameter { arg, annotation }
579
+ },
580
+ };
581
+
582
+ ParameterListStarArgs<ArgType>: (Option<Option<ast::Parameter>>, Vec<ast::Parameter>, Vec<Option<ast::Expression>>, Option<Option<ast::Parameter>>) = {
583
+ "*" <va:ArgType?> <kw:("," TypedParameterDef<ArgType>)*> <kwarg:("," KwargParameter<ArgType>)?> => {
576
584
// Extract keyword arguments:
577
585
let mut kwonlyargs = vec![];
578
586
let mut kw_defaults = vec![];
@@ -590,8 +598,8 @@ ParameterListStarArgs: (Option<Option<String>>, Vec<String>, Vec<Option<ast::Exp
590
598
}
591
599
};
592
600
593
- KwargParameter: Option<String > = {
594
- "**" <kwarg:Identifier ?> => {
601
+ KwargParameter<ArgType> : Option<ast::Parameter > = {
602
+ "**" <kwarg:ArgType ?> => {
595
603
kwarg
596
604
}
597
605
};
@@ -675,7 +683,7 @@ Test: ast::Expression = {
675
683
};
676
684
677
685
LambdaDef: ast::Expression = {
678
- "lambda" <p:TypedArgsList?> ":" <b:Test> =>
686
+ "lambda" <p:TypedArgsList<UntypedParameter> ?> ":" <b:Test> =>
679
687
ast::Expression::Lambda {
680
688
args: p.unwrap_or(Default::default()),
681
689
body:Box::new(b)
0 commit comments