Author: jonathan
Date: Mon Feb 25 07:46:40 2008
New Revision: 26057
Modified:
trunk/languages/perl6/src/parser/actions.pm
trunk/languages/perl6/src/parser/grammar.pg
Log:
[rakudo] Implement indirect method calls of forms $x.'foo'() and $x.$foo().
Modified: trunk/languages/perl6/src/parser/actions.pm
==============================================================================
--- trunk/languages/perl6/src/parser/actions.pm (original)
+++ trunk/languages/perl6/src/parser/actions.pm Mon Feb 25 07:46:40 2008
@@ -428,10 +428,30 @@
my $past := $( $/{$key} );
if $<postfix> {
for $<postfix> {
- # Check if it's a call; if so, need special handling.
my $term := $past;
$past := $($_);
- $past.unshift($term);
+
+ # Check if it's an indirect call.
+ if $_<methodop><variable> {
+ # What to call supplied; need to put the invocant second.
+ my $meth := $past[0];
+ $past[0] := $term;
+ $past.unshift($meth);
+ }
+ elsif $_<methodop><quote> {
+ # First child is something that we evaluate to get the
+ # name. Replace it with PIR to call find_method on it.
+ my $meth_name := $past[0];
+ $past[0] := $term;
+ $past.unshift( PAST::Op.new(
+ :inline("$S1000 = %1\n%r = find_method %0, $S1000\n"),
+ $term,
+ $meth_name
+ ));
+ }
+ else {
+ $past.unshift($term);
+ }
}
}
make $past;
@@ -448,15 +468,26 @@
method methodop($/, $key) {
my $past;
+
if ($key eq 'null') {
$past := PAST::Op.new();
}
else {
$past := $( $/{$key} );
}
- $past.name(~$<ident>);
$past.pasttype('callmethod');
$past.node($/);
+
+ if $<ident> {
+ $past.name(~$<ident>);
+ }
+ elsif $<variable> {
+ $past.unshift( $( $<variable> ) );
+ }
+ else {
+ $past.unshift( $( $<quote> ) );
+ }
+
make $past;
}
Modified: trunk/languages/perl6/src/parser/grammar.pg
==============================================================================
--- trunk/languages/perl6/src/parser/grammar.pg (original)
+++ trunk/languages/perl6/src/parser/grammar.pg Mon Feb 25 07:46:40 2008
@@ -403,7 +403,13 @@
token methodop {
- '.' <ident>
+ '.'
+ [
+ | <ident>
+ | <?before '$' | '@' > <variable>
+ | <?before <[ ' " ]>> <quote>
+# { $<quote> ~~ /\W/ or .panic("Useless use of quotes") }
+ ]
[
| <.unsp>? '(' <semilist> ')' {*} #= semilist
| ':' <?before \s> <arglist> {*} #= arglist