Author: bernhard
Date: Mon Jan 19 06:50:34 2009
New Revision: 35756

Modified:
   trunk/languages/pipp/src/pct/actions.pm
   trunk/languages/pipp/src/pct/grammar.pg
   trunk/languages/pipp/t/php/namespace.t

Log:
[Pipp] Add support for constants with fully qualified name.
Keep the trailing '\' in namespace names.

Modified: trunk/languages/pipp/src/pct/actions.pm
==============================================================================
--- trunk/languages/pipp/src/pct/actions.pm     (original)
+++ trunk/languages/pipp/src/pct/actions.pm     Mon Jan 19 06:50:34 2009
@@ -127,7 +127,7 @@
     our $?NS;
 
     if $key eq 'open' {
-        $?NS := +$<namespace_name> ?? ~$<namespace_name>[0] !! '';
+        $?NS := +$<namespace_name> ?? ~$<namespace_name>[0] ~ '\\' !! '';
     }
     else {
         my $block :=
@@ -264,11 +264,22 @@
 
 method constant($/) {
     our $?NS;
-    make PAST::Var.new(
-        :name(~$<name>),
-        :scope('package'),
-        :namespace($?NS)
-    );
+    if $<name><leading_backslash> {
+        # fully qualified name
+        make PAST::Var.new(
+            :name(~$<name><ident>),
+            :scope('package'),
+            :namespace(~$<name><ns_path>)
+        );
+    }
+    else {
+        # access relative to current namespace
+        make PAST::Var.new(
+            :name(~$<name><ident>),
+            :scope('package'),
+            :namespace($?NS ~ $<name><ns_path>)
+        );
+    }
 }
 
 # TODO: merge with rule 'constant'

Modified: trunk/languages/pipp/src/pct/grammar.pg
==============================================================================
--- trunk/languages/pipp/src/pct/grammar.pg     (original)
+++ trunk/languages/pipp/src/pct/grammar.pg     Mon Jan 19 06:50:34 2009
@@ -251,17 +251,20 @@
 
 token method_name              { <ident> }
 
-token namespace_name           { <ns_component>* <ident> }
+token namespace_name           { <ns_path> <ident> }
 
 token name {
     <leading_backslash=ns_sep>?           # a leading backslash is optional, 
but significant
-    <ns_component>*                       # namespace
+    <ns_path>                             # namespace
     <ident>                               # identifier is required
 }
 
 token ns_sep                   { '\\' }   # yes, PHP 5.3 uses backslash as the 
namespace separator
 
-token ns_component             { <ident> <.ns_sep> }
+
+token ns_path                  {
+    [ <ident> <.ns_sep> ]*
+} 
 
 token var_name                 { '$' <ident> }
 

Modified: trunk/languages/pipp/t/php/namespace.t
==============================================================================
--- trunk/languages/pipp/t/php/namespace.t      (original)
+++ trunk/languages/pipp/t/php/namespace.t      Mon Jan 19 06:50:34 2009
@@ -88,6 +88,30 @@
 FOO in A\B
 OUT
 
+
+language_output_is( 'Pipp', <<'CODE', <<'OUT', 'constant with fully qualified 
names' );
+<?php
+
+namespace A {
+    const FOO = "FOO in A\n";
+}
+
+namespace A\B {
+    const FOO = "FOO in A\\B\n";
+    echo \A\FOO;
+}
+
+namespace A\B {
+    echo \A\FOO;
+    echo \A\B\FOO;
+}
+
+?>
+CODE
+FOO in A
+FOO in A\B
+OUT
+
 =for perl6
 
 package A {

Reply via email to