Skip to content

Commit

Permalink
Support renaming of named parameters in the signature. This also take…
Browse files Browse the repository at this point in the history
…s us a couple of steps closer to STD.pm.
  • Loading branch information
jnthn committed Mar 20, 2009
1 parent 619ebd0 commit 4c90262
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 9 deletions.
22 changes: 16 additions & 6 deletions src/parser/actions.pm
Expand Up @@ -1210,12 +1210,12 @@ method post_constraint($/) {


method parameter($/) {
my $var := $( $<param_var> );
my $sigil := $<param_var><sigil>;
my $var := $( $<named_param> ?? $<named_param> !! $<param_var> );
my $sigil := $<named_param> ?? $<named_param><param_var><sigil> !! $<param_var><sigil>;
my $quant := $<quant>;

## if it was type a type capture and nothing else, need to make a PAST::Var
unless $<param_var> {
unless $<param_var> || $<named_param> {
unless $<type_constraint> == 1 {
$/.panic("Invalid signature; cannot have two consecutive parameter separators.");
}
Expand All @@ -1231,9 +1231,8 @@ method parameter($/) {
$var.slurpy( $sigil eq '@' || $sigil eq '%' );
$var.named( $sigil eq '%' );
}
elsif $<named> eq ':' { # named
$var.named(~$<param_var><identifier>[0]);
if $quant ne '!' { # required (optional is default)
elsif $<named_param> { # named
if $quant ne '!' { # required (optional is default)
$var.viviself(container_itype($sigil));
}
}
Expand Down Expand Up @@ -1305,6 +1304,17 @@ method parameter($/) {
}


method named_param($/) {
my $var := $( $<param_var> );
if $<name> {
$var.named(~$<name>);
}
else {
$var.named(~$<param_var><identifier>[0]);
}
make $var;
}

method param_var($/) {
my $sigil := ~$<sigil>;
my $twigil := ~$<twigil>[0];
Expand Down
16 changes: 13 additions & 3 deletions src/parser/grammar.pg
Expand Up @@ -513,13 +513,23 @@ token param_var {
{*}
}

token named_param {
':'
[
| <name=identifier> '(' <.ws>
[ <param_var> <.ws> ]
[ ')' || <.panic: "Unable to parse named parameter; couldn't find right parenthesis"> ]
| <param_var>
]
{*}
}

token parameter {
<type_constraint>*
[
| $<quant>=['*'] <param_var>
| $<named>=[':'?]
<param_var>
$<quant>=[ <[ ? ! ]>? ]
| <param_var> $<quant>=[ <[ ? ! ]>? ]
| <named_param> $<quant>=[ <[ ? ! ]>? ]
| <?{{
$I0 = match['type_constraint']
$I0 = $I0 > 0
Expand Down

0 comments on commit 4c90262

Please sign in to comment.