@@ -725,13 +725,14 @@ function (Expr $expr) use (&$defaultValueConstant) {
725
725
if ($ this ->type ) {
726
726
$ typeFlags = $ this ->type ->tryToRepresentableType ();
727
727
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 "" ;
729
730
}
730
731
731
732
if ($ typeFlags ->classType ) {
732
733
$ simpleType = $ this ->type ->tryToSimpleType ();
733
734
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) " ;
735
736
} else {
736
737
throw new Exception ("Property $ this ->name has an unsupported union type " );
737
738
}
@@ -874,6 +875,8 @@ class ClassInfo {
874
875
public $ flags ;
875
876
/** @var bool */
876
877
public $ isClass ;
878
+ /** @var string|null */
879
+ public $ alias ;
877
880
/** @var bool */
878
881
public $ isDeprecated ;
879
882
/** @var bool */
@@ -897,6 +900,7 @@ public function __construct(
897
900
Name $ name ,
898
901
int $ flags ,
899
902
bool $ isClass ,
903
+ ?string $ alias ,
900
904
bool $ isDeprecated ,
901
905
bool $ isStrictProperties ,
902
906
array $ extends ,
@@ -907,6 +911,7 @@ public function __construct(
907
911
$ this ->name = $ name ;
908
912
$ this ->flags = $ flags ;
909
913
$ this ->isClass = $ isClass ;
914
+ $ this ->alias = $ alias ;
910
915
$ this ->isDeprecated = $ isDeprecated ;
911
916
$ this ->isStrictProperties = $ isStrictProperties ;
912
917
$ this ->extends = $ extends ;
@@ -919,10 +924,10 @@ public function getRegistration(): string
919
924
{
920
925
$ params = ["zend_class_entry *class_entry " ];
921
926
foreach ($ this ->extends as $ extends ) {
922
- $ params [] = "zend_class_entry *class_entry_ $ extends" ;
927
+ $ params [] = "zend_class_entry *class_entry_ " . implode ( " _ " , $ extends-> parts ) ;
923
928
}
924
929
foreach ($ this ->implements as $ implements ) {
925
- $ params [] = "zend_class_entry *class_entry_ $ implements" ;
930
+ $ params [] = "zend_class_entry *class_entry_ " . implode ( " _ " , $ implements-> parts ) ;
926
931
}
927
932
foreach ($ this ->propertyInfos as $ property ) {
928
933
$ type = $ property ->type ;
@@ -932,20 +937,28 @@ public function getRegistration(): string
932
937
933
938
$ representableType = $ type ->tryToRepresentableType ();
934
939
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 () );
936
941
}
937
942
}
938
943
$ params = array_unique ($ params );
939
944
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" ;
943
948
944
949
$ code .= "{ \n" ;
945
950
$ 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
+
947
960
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" ;
949
962
} else {
950
963
$ code .= "\tclass_entry = zend_register_internal_interface(&ce); \n" ;
951
964
}
@@ -954,15 +967,19 @@ public function getRegistration(): string
954
967
}
955
968
956
969
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" ;
958
971
}
959
972
960
973
if ($ this ->isClass === false && $ this ->extends ) {
961
974
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" ;
963
976
}
964
977
}
965
978
979
+ if ($ this ->alias ) {
980
+ $ code .= "\tzend_register_class_alias( \"" . str_replace ("_ " , "\\" , $ this ->alias ) . "\", class_entry); \n" ;
981
+ }
982
+
966
983
foreach ($ this ->propertyInfos as $ property ) {
967
984
$ code .= $ property ->getDeclaration ();
968
985
}
@@ -1269,13 +1286,16 @@ function parseProperty(
1269
1286
function parseClass (Name $ name , Stmt \ClassLike $ class , array $ properties , array $ methods ): ClassInfo {
1270
1287
$ flags = $ class instanceof Class_ ? $ class ->flags : 0 ;
1271
1288
$ comment = $ class ->getDocComment ();
1289
+ $ alias = null ;
1272
1290
$ isDeprecated = false ;
1273
1291
$ isStrictProperties = false ;
1274
1292
1275
1293
if ($ comment ) {
1276
1294
$ tags = parseDocComment ($ comment );
1277
1295
foreach ($ tags as $ tag ) {
1278
- if ($ tag ->name === 'deprecated ' ) {
1296
+ if ($ tag ->name === 'alias ' ) {
1297
+ $ alias = $ tag ->getValue ();
1298
+ } else if ($ tag ->name === 'deprecated ' ) {
1279
1299
$ isDeprecated = true ;
1280
1300
} else if ($ tag ->name === 'strict-properties ' ) {
1281
1301
$ isStrictProperties = true ;
@@ -1299,6 +1319,7 @@ function parseClass(Name $name, Stmt\ClassLike $class, array $properties, array
1299
1319
$ name ,
1300
1320
$ flags ,
1301
1321
$ class instanceof Class_,
1322
+ $ alias ,
1302
1323
$ isDeprecated ,
1303
1324
$ isStrictProperties ,
1304
1325
$ extends ,
0 commit comments