Author: pmichaud
Date: Sat Jan  3 14:18:21 2009
New Revision: 34903

Modified:
   branches/rvar/languages/perl6/src/parser/actions.pm

Log:
[rakudo]:  Add 'is rw' trait to attributes.


Modified: branches/rvar/languages/perl6/src/parser/actions.pm
==============================================================================
--- branches/rvar/languages/perl6/src/parser/actions.pm (original)
+++ branches/rvar/languages/perl6/src/parser/actions.pm Sat Jan  3 14:18:21 2009
@@ -1038,9 +1038,9 @@
         }
     }
 
-    my $traitlist := PAST::Op.new( :name('infix:,'), :pasttype('call') );
-    $var<traitlist> := $traitlist;
     if $<trait> {
+        my $traitlist := PAST::Op.new( :name('infix:,'), :pasttype('call') );
+        $var<traitlist> := $traitlist;
         for @($<trait>) { $traitlist.push( $( $_ ) ); }
     }
 
@@ -1438,7 +1438,21 @@
             if $var<twigil> eq '.' {
                 my $method := PAST::Block.new( :blocktype('method') );
                 $method.name( substr($var.name(), 2) );
-                $method.push( PAST::Var.new( :name($var.name()) ) );
+                my $value := PAST::Var.new( :name($var.name()) );
+                my $readtype := trait_readtype( $var<traitlist> ) || 
'readonly';
+                if $readtype eq 'CONFLICT' {
+                    $<scoped>.panic(
+                        "Can use only one of readonly, rw, and copy on "
+                        ~ $var.name() ~ " parameter"
+                    );
+                }
+                elsif $readtype ne 'rw' {
+                    $value := PAST::Op.new( :pirop('new PsP'), 
+                                  'ObjectRef', $value);
+                    $value := PAST::Op.new( :pirop('setprop'),
+                                  $value, 'readonly', 1);
+                }
+                $method.push( $value );
                 $block[0].push($method);
             }
             
@@ -1531,6 +1545,13 @@
     $var.isdecl(1);
     $var<type>  := PAST::Op.new( :name('and'), :pasttype('call') );
     $var<itype> := container_itype($<variable><sigil>);
+
+    if $<trait> {
+        my $traitlist := PAST::Op.new( :name('infix:,'), :pasttype('call') );
+        $var<traitlist> := $traitlist;
+        for @($<trait>) { $traitlist.push( $( $_ ) ); }
+    }
+
     make $var;
 }
 
@@ -2371,10 +2392,12 @@
 
 sub trait_readtype($traitpast) {
     my $readtype;
-    for @($traitpast) {
-        my $tname := $_[1];
-        if $tname eq 'readonly' || $tname eq 'rw' || $tname eq 'copy' {
-            $readtype := $readtype ?? 'CONFLICT' !! $tname;
+    if $traitpast {
+        for @($traitpast) {
+            my $tname := $_[1];
+            if $tname eq 'readonly' || $tname eq 'rw' || $tname eq 'copy' {
+                $readtype := $readtype ?? 'CONFLICT' !! $tname;
+            }
         }
     }
     $readtype;

Reply via email to