--- /dev/null
+Valid usages of reserved keywords as identifiers
+-----
+<?php
+
+class Test {
+ function array() {}
+ function public() {}
+
+ static function list() {}
+ static function protected() {}
+
+ public $class;
+ public $private;
+
+ const TRAIT = 3, FINAL = 4;
+
+ const __CLASS__ = 1, __TRAIT__ = 2, __FUNCTION__ = 3, __METHOD__ = 4, __LINE__ = 5,
+ __FILE__ = 6, __DIR__ = 7, __NAMESPACE__ = 8;
+ // __halt_compiler does not work
+}
+
+$t = new Test;
+$t->array();
+$t->public();
+
+Test::list();
+Test::protected();
+
+$t->class;
+$t->private;
+
+Test::TRAIT;
+Test::FINAL;
+
+class Foo {
+ use TraitA, TraitB {
+ TraitA::catch insteadof namespace\TraitB;
+ TraitA::list as foreach;
+ TraitB::throw as protected public;
+ TraitB::self as protected;
+ exit as die;
+ \TraitC::exit as bye;
+ namespace\TraitC::exit as byebye;
+ TraitA::
+ //
+ /** doc comment */
+ #
+ catch /* comment */
+ // comment
+ # comment
+ insteadof TraitB;
+ }
+}
+-----
+array(
+ 0: Stmt_Class(
+ flags: 0
+ name: Test
+ extends: null
+ implements: array(
+ )
+ stmts: array(
+ 0: Stmt_ClassMethod(
+ flags: 0
+ byRef: false
+ name: array
+ params: array(
+ )
+ returnType: null
+ stmts: array(
+ )
+ )
+ 1: Stmt_ClassMethod(
+ flags: 0
+ byRef: false
+ name: public
+ params: array(
+ )
+ returnType: null
+ stmts: array(
+ )
+ )
+ 2: Stmt_ClassMethod(
+ flags: MODIFIER_STATIC (8)
+ byRef: false
+ name: list
+ params: array(
+ )
+ returnType: null
+ stmts: array(
+ )
+ )
+ 3: Stmt_ClassMethod(
+ flags: MODIFIER_STATIC (8)
+ byRef: false
+ name: protected
+ params: array(
+ )
+ returnType: null
+ stmts: array(
+ )
+ )
+ 4: Stmt_Property(
+ flags: MODIFIER_PUBLIC (1)
+ props: array(
+ 0: Stmt_PropertyProperty(
+ name: class
+ default: null
+ )
+ )
+ )
+ 5: Stmt_Property(
+ flags: MODIFIER_PUBLIC (1)
+ props: array(
+ 0: Stmt_PropertyProperty(
+ name: private
+ default: null
+ )
+ )
+ )
+ 6: Stmt_ClassConst(
+ flags: 0
+ consts: array(
+ 0: Const(
+ name: TRAIT
+ value: Scalar_LNumber(
+ value: 3
+ )
+ )
+ 1: Const(
+ name: FINAL
+ value: Scalar_LNumber(
+ value: 4
+ )
+ )
+ )
+ )
+ 7: Stmt_ClassConst(
+ flags: 0
+ consts: array(
+ 0: Const(
+ name: __CLASS__
+ value: Scalar_LNumber(
+ value: 1
+ )
+ )
+ 1: Const(
+ name: __TRAIT__
+ value: Scalar_LNumber(
+ value: 2
+ )
+ )
+ 2: Const(
+ name: __FUNCTION__
+ value: Scalar_LNumber(
+ value: 3
+ )
+ )
+ 3: Const(
+ name: __METHOD__
+ value: Scalar_LNumber(
+ value: 4
+ )
+ )
+ 4: Const(
+ name: __LINE__
+ value: Scalar_LNumber(
+ value: 5
+ )
+ )
+ 5: Const(
+ name: __FILE__
+ value: Scalar_LNumber(
+ value: 6
+ )
+ )
+ 6: Const(
+ name: __DIR__
+ value: Scalar_LNumber(
+ value: 7
+ )
+ )
+ 7: Const(
+ name: __NAMESPACE__
+ value: Scalar_LNumber(
+ value: 8
+ )
+ )
+ )
+ )
+ )
+ )
+ 1: Expr_Assign(
+ var: Expr_Variable(
+ name: t
+ )
+ expr: Expr_New(
+ class: Name(
+ parts: array(
+ 0: Test
+ )
+ )
+ args: array(
+ )
+ )
+ )
+ 2: Expr_MethodCall(
+ var: Expr_Variable(
+ name: t
+ )
+ name: array
+ args: array(
+ )
+ )
+ 3: Expr_MethodCall(
+ var: Expr_Variable(
+ name: t
+ )
+ name: public
+ args: array(
+ )
+ )
+ 4: Expr_StaticCall(
+ class: Name(
+ parts: array(
+ 0: Test
+ )
+ )
+ name: list
+ args: array(
+ )
+ )
+ 5: Expr_StaticCall(
+ class: Name(
+ parts: array(
+ 0: Test
+ )
+ )
+ name: protected
+ args: array(
+ )
+ )
+ 6: Expr_PropertyFetch(
+ var: Expr_Variable(
+ name: t
+ )
+ name: class
+ )
+ 7: Expr_PropertyFetch(
+ var: Expr_Variable(
+ name: t
+ )
+ name: private
+ )
+ 8: Expr_ClassConstFetch(
+ class: Name(
+ parts: array(
+ 0: Test
+ )
+ )
+ name: TRAIT
+ )
+ 9: Expr_ClassConstFetch(
+ class: Name(
+ parts: array(
+ 0: Test
+ )
+ )
+ name: FINAL
+ )
+ 10: Stmt_Class(
+ flags: 0
+ name: Foo
+ extends: null
+ implements: array(
+ )
+ stmts: array(
+ 0: Stmt_TraitUse(
+ traits: array(
+ 0: Name(
+ parts: array(
+ 0: TraitA
+ )
+ )
+ 1: Name(
+ parts: array(
+ 0: TraitB
+ )
+ )
+ )
+ adaptations: array(
+ 0: Stmt_TraitUseAdaptation_Precedence(
+ trait: Name(
+ parts: array(
+ 0: TraitA
+ )
+ )
+ method: catch
+ insteadof: array(
+ 0: Name_Relative(
+ parts: array(
+ 0: TraitB
+ )
+ )
+ )
+ )
+ 1: Stmt_TraitUseAdaptation_Alias(
+ trait: Name(
+ parts: array(
+ 0: TraitA
+ )
+ )
+ method: list
+ newModifier: null
+ newName: foreach
+ )
+ 2: Stmt_TraitUseAdaptation_Alias(
+ trait: Name(
+ parts: array(
+ 0: TraitB
+ )
+ )
+ method: throw
+ newModifier: MODIFIER_PROTECTED (2)
+ newName: public
+ )
+ 3: Stmt_TraitUseAdaptation_Alias(
+ trait: Name(
+ parts: array(
+ 0: TraitB
+ )
+ )
+ method: self
+ newModifier: MODIFIER_PROTECTED (2)
+ newName: null
+ )
+ 4: Stmt_TraitUseAdaptation_Alias(
+ trait: null
+ method: exit
+ newModifier: null
+ newName: die
+ )
+ 5: Stmt_TraitUseAdaptation_Alias(
+ trait: Name_FullyQualified(
+ parts: array(
+ 0: TraitC
+ )
+ )
+ method: exit
+ newModifier: null
+ newName: bye
+ )
+ 6: Stmt_TraitUseAdaptation_Alias(
+ trait: Name_Relative(
+ parts: array(
+ 0: TraitC
+ )
+ )
+ method: exit
+ newModifier: null
+ newName: byebye
+ )
+ 7: Stmt_TraitUseAdaptation_Precedence(
+ trait: Name(
+ parts: array(
+ 0: TraitA
+ )
+ )
+ method: catch
+ insteadof: array(
+ 0: Name(
+ parts: array(
+ 0: TraitB
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+)
\ No newline at end of file