Author: bernhard
Date: Tue Jan 20 08:37:20 2009
New Revision: 35815

Modified:
   trunk/languages/pipp/src/pct/actions.pm
   trunk/languages/pipp/t/php/oo.t

Log:
[Pipp] Assign __CLASS__ with parsed classname

Modified: trunk/languages/pipp/src/pct/actions.pm
==============================================================================
--- trunk/languages/pipp/src/pct/actions.pm     (original)
+++ trunk/languages/pipp/src/pct/actions.pm     Tue Jan 20 08:37:20 2009
@@ -264,6 +264,9 @@
 
 method constant($/) {
     our $?NS;
+    our $?CLASS;
+    my $ns   := $?CLASS eq '' ?? $?NS
+                              !! $?NS ~ '\\' ~ $?CLASS ~ '::';
     if $<name><leading_backslash> {
         # fully qualified name
         make PAST::Var.new(
@@ -277,7 +280,7 @@
         make PAST::Var.new(
             :name(~$<name><ident>),
             :scope('package'),
-            :namespace($?NS ~ $<name><ns_path>)
+            :namespace($ns ~ $<name><ns_path>)
         );
     }
 }
@@ -741,15 +744,19 @@
 method class_definition($/, $key) {
     our @?BLOCK; # A stack of PAST::Block
     our $?CLASS; # for namespacing of constants
-
     if $key eq 'open' {
-        # Start of class definition; make PAST to create class object
         $?CLASS := ~$<class_name>;
+        our $?NS;
+
         my $block := PAST::Block.new(
             :node($/),
             :blocktype('declaration'),
             :pirflags( ':init :load' ),
-            :namespace($?CLASS),
+            :namespace($?CLASS)
+        );
+
+        # Start of class definition; make PAST to create class object
+        $block.push(
             PAST::Op.new(
                 :pasttype('bind'),
                 PAST::Var.new(
@@ -765,6 +772,25 @@
             )
         );
 
+        # assign predeclared constant __CLASS__
+        my $ns :=  $?NS ~ '\\' ~ $?CLASS ~ '::';
+        $block.push(
+            PAST::Op.new(
+                :pasttype('bind'),
+                PAST::Var.new(
+                    :name('__CLASS__'),
+                    :isdecl(1),
+                    :scope('package'),
+                    :viviself('PhpNull'),
+                    :namespace($ns)
+                ),
+                PAST::Val.new(
+                    :value($?CLASS),
+                    :returns('PhpString'),
+                )
+            )
+        );
+
         # set up scope 'package' for the superglobals
         our @?SUPER_GLOBALS;
         for ( @?SUPER_GLOBALS ) { $block.symbol( :scope('package'), $_ ); }

Modified: trunk/languages/pipp/t/php/oo.t
==============================================================================
--- trunk/languages/pipp/t/php/oo.t     (original)
+++ trunk/languages/pipp/t/php/oo.t     Tue Jan 20 08:37:20 2009
@@ -20,7 +20,7 @@
 use FindBin;
 use lib "$FindBin::Bin/../../../../lib", "$FindBin::Bin/../../lib";
 
-use Parrot::Test tests => 15;
+use Parrot::Test tests => 16;
 
 language_output_is( 'Pipp', <<'CODE', <<'OUT', 'definition of a class' );
 <?php
@@ -339,3 +339,22 @@
 static member $a
 OUT
 
+
+language_output_is( 'Pipp', <<'CODE', <<'OUT', '__CLASS__' );
+<?php
+
+class A {
+    function echo_class () {
+        echo __CLASS__;
+        echo "\n";
+    }
+}
+
+$a = new A;
+$a->echo_class();
+
+?>
+CODE
+A
+OUT
+

Reply via email to