@@ -725,13 +725,14 @@ function (Expr $expr) use (&$defaultValueConstant) {
725725 if ($ this ->type ) {
726726 $ typeFlags = $ this ->type ->tryToRepresentableType ();
727727 if ($ typeFlags === null ) {
728- throw new Exception ("Unimplemented property type " );
728+ echo "Skipping code generation for property $ this ->name , because it has an unimplemented type \n" ;
729+ return "" ;
729730 }
730731
731732 if ($ typeFlags ->classType ) {
732733 $ simpleType = $ this ->type ->tryToSimpleType ();
733734 if ($ simpleType ) {
734- $ typeCode = "(zend_type) ZEND_TYPE_INIT_CE(class_entry_ " . $ typeFlags ->classType ->toEscapedName ( ) . ", " . ((int ) $ this ->type ->isNullable ()) . ", 0) " ;
735+ $ typeCode = "(zend_type) ZEND_TYPE_INIT_CE(class_entry_ " . str_replace ( " _ " , "\\" , $ typeFlags ->classType ->name ) . ", " . ((int ) $ this ->type ->isNullable ()) . ", 0) " ;
735736 } else {
736737 throw new Exception ("Property $ this ->name has an unsupported union type " );
737738 }
@@ -874,6 +875,8 @@ class ClassInfo {
874875 public $ flags ;
875876 /** @var bool */
876877 public $ isClass ;
878+ /** @var string|null */
879+ public $ alias ;
877880 /** @var bool */
878881 public $ isDeprecated ;
879882 /** @var bool */
@@ -897,6 +900,7 @@ public function __construct(
897900 Name $ name ,
898901 int $ flags ,
899902 bool $ isClass ,
903+ ?string $ alias ,
900904 bool $ isDeprecated ,
901905 bool $ isStrictProperties ,
902906 array $ extends ,
@@ -907,6 +911,7 @@ public function __construct(
907911 $ this ->name = $ name ;
908912 $ this ->flags = $ flags ;
909913 $ this ->isClass = $ isClass ;
914+ $ this ->alias = $ alias ;
910915 $ this ->isDeprecated = $ isDeprecated ;
911916 $ this ->isStrictProperties = $ isStrictProperties ;
912917 $ this ->extends = $ extends ;
@@ -919,10 +924,10 @@ public function getRegistration(): string
919924 {
920925 $ params = ["zend_class_entry *class_entry " ];
921926 foreach ($ this ->extends as $ extends ) {
922- $ params [] = "zend_class_entry *class_entry_ $ extends" ;
927+ $ params [] = "zend_class_entry *class_entry_ " . implode ( " _ " , $ extends-> parts ) ;
923928 }
924929 foreach ($ this ->implements as $ implements ) {
925- $ params [] = "zend_class_entry *class_entry_ $ implements" ;
930+ $ params [] = "zend_class_entry *class_entry_ " . implode ( " _ " , $ implements-> parts ) ;
926931 }
927932 foreach ($ this ->propertyInfos as $ property ) {
928933 $ type = $ property ->type ;
@@ -932,20 +937,28 @@ public function getRegistration(): string
932937
933938 $ representableType = $ type ->tryToRepresentableType ();
934939 if ($ representableType && $ representableType ->classType ) {
935- $ params [] = "zend_class_entry *class_entry_ " . $ representableType ->classType ->toEscapedName ();
940+ $ params [] = "zend_class_entry *class_entry_ " . str_replace ( "\\" , " _ " , $ representableType ->classType ->toEscapedName () );
936941 }
937942 }
938943 $ params = array_unique ($ params );
939944
940- $ code = " void register_class_ { $ this ->name } ( " ;
941- $ code .= implode ( " , " , $ params );
942- $ code .= ") \n" ;
945+ $ escapedName = implode ( " _ " , $ this ->name -> parts ) ;
946+
947+ $ code = " void register_class_ $ escapedName ( " . implode ( " , " , $ params ) . ") \n" ;
943948
944949 $ code .= "{ \n" ;
945950 $ code .= "\tzend_class_entry ce; \n\n" ;
946- $ code .= "\tINIT_CLASS_ENTRY(ce, \"{$ this ->name }\", class_ {$ this ->name }_methods); \n" ;
951+ if (count ($ this ->name ->parts ) > 1 ) {
952+ $ className = array_pop ($ this ->name ->parts );
953+ $ namespace = $ this ->name ->toCodeString ();
954+
955+ $ code .= "\tINIT_NS_CLASS_ENTRY(ce, \"$ namespace \", \"$ className \", class_ {$ escapedName }_methods); \n" ;
956+ } else {
957+ $ code .= "\tINIT_CLASS_ENTRY(ce, \"$ this ->name \", class_ {$ escapedName }_methods); \n" ;
958+ }
959+
947960 if ($ this ->isClass ) {
948- $ code .= "\tclass_entry = zend_register_internal_class_ex(&ce, " . (isset ($ this ->extends [0 ]) ? "class_entry_ " . $ this ->extends [0 ] : "NULL " ) . "); \n" ;
961+ $ code .= "\tclass_entry = zend_register_internal_class_ex(&ce, " . (isset ($ this ->extends [0 ]) ? "class_entry_ " . str_replace ( "\\" , " _ " , $ this ->extends [0 ]) : "NULL " ) . "); \n" ;
949962 } else {
950963 $ code .= "\tclass_entry = zend_register_internal_interface(&ce); \n" ;
951964 }
@@ -954,15 +967,19 @@ public function getRegistration(): string
954967 }
955968
956969 foreach ($ this ->implements as $ implements ) {
957- $ code .= "\tzend_class_implements(class_entry, 1, class_entry_ $ implements); \n" ;
970+ $ code .= "\tzend_class_implements(class_entry, 1, class_entry_ " . implode ( " _ " , $ implements-> parts ) . " ); \n" ;
958971 }
959972
960973 if ($ this ->isClass === false && $ this ->extends ) {
961974 foreach ($ this ->extends as $ extends ) {
962- $ code .= "\tzend_class_implements(class_entry, 1, class_entry_ $ extends); \n" ;
975+ $ code .= "\tzend_class_implements(class_entry, 1, class_entry_ " . implode ( " _ " , $ extends-> parts ) . " ); \n" ;
963976 }
964977 }
965978
979+ if ($ this ->alias ) {
980+ $ code .= "\tzend_register_class_alias( \"" . str_replace ("_ " , "\\" , $ this ->alias ) . "\", class_entry); \n" ;
981+ }
982+
966983 foreach ($ this ->propertyInfos as $ property ) {
967984 $ code .= $ property ->getDeclaration ();
968985 }
@@ -1269,13 +1286,16 @@ function parseProperty(
12691286function parseClass (Name $ name , Stmt \ClassLike $ class , array $ properties , array $ methods ): ClassInfo {
12701287 $ flags = $ class instanceof Class_ ? $ class ->flags : 0 ;
12711288 $ comment = $ class ->getDocComment ();
1289+ $ alias = null ;
12721290 $ isDeprecated = false ;
12731291 $ isStrictProperties = false ;
12741292
12751293 if ($ comment ) {
12761294 $ tags = parseDocComment ($ comment );
12771295 foreach ($ tags as $ tag ) {
1278- if ($ tag ->name === 'deprecated ' ) {
1296+ if ($ tag ->name === 'alias ' ) {
1297+ $ alias = $ tag ->getValue ();
1298+ } else if ($ tag ->name === 'deprecated ' ) {
12791299 $ isDeprecated = true ;
12801300 } else if ($ tag ->name === 'strict-properties ' ) {
12811301 $ isStrictProperties = true ;
@@ -1299,6 +1319,7 @@ function parseClass(Name $name, Stmt\ClassLike $class, array $properties, array
12991319 $ name ,
13001320 $ flags ,
13011321 $ class instanceof Class_,
1322+ $ alias ,
13021323 $ isDeprecated ,
13031324 $ isStrictProperties ,
13041325 $ extends ,
0 commit comments