14
14
UnpackExpression ,
15
15
Variable
16
16
};
17
- use lang \ast \types \{IsUnion , IsFunction , IsArray , IsMap , IsNullable };
17
+ use lang \ast \types \{IsUnion , IsFunction , IsArray , IsMap , IsNullable , IsExpression };
18
18
use lang \ast \{Emitter , Node , Type , Result };
19
19
20
20
abstract class PHP extends Emitter {
@@ -373,9 +373,17 @@ protected function emitEnum($result, $enum) {
373
373
374
374
$ enum ->comment && $ this ->emitOne ($ result , $ enum ->comment );
375
375
$ enum ->annotations && $ this ->emitOne ($ result , $ enum ->annotations );
376
- $ result ->at ($ enum ->declared )->out ->write ('enum ' .$ this ->declaration ($ enum -> name ));
376
+ $ result ->at ($ enum ->declared )->out ->write ('enum ' .$ enum ->declaration ());
377
377
$ enum ->base && $ result ->out ->write (': ' .$ enum ->base );
378
- $ enum ->implements && $ result ->out ->write (' implements ' .implode (', ' , $ enum ->implements ));
378
+
379
+ if ($ enum ->implements ) {
380
+ $ list = '' ;
381
+ foreach ($ enum ->implements as $ type ) {
382
+ $ list .= ', ' .$ type ->literal ();
383
+ }
384
+ $ result ->out ->write (' implements ' .substr ($ list , 2 ));
385
+ }
386
+
379
387
$ result ->out ->write ('{ ' );
380
388
381
389
foreach ($ enum ->body as $ member ) {
@@ -386,7 +394,7 @@ protected function emitEnum($result, $enum) {
386
394
$ result ->out ->write ('static function __init() { ' );
387
395
$ this ->emitInitializations ($ result , $ result ->locals [0 ]);
388
396
$ this ->emitMeta ($ result , $ enum ->name , $ enum ->annotations , $ enum ->comment );
389
- $ result ->out ->write ('}} ' .$ enum ->name .'::__init(); ' );
397
+ $ result ->out ->write ('}} ' .$ enum ->name -> literal () .'::__init(); ' );
390
398
array_shift ($ result ->type );
391
399
}
392
400
@@ -397,9 +405,17 @@ protected function emitClass($result, $class) {
397
405
398
406
$ class ->comment && $ this ->emitOne ($ result , $ class ->comment );
399
407
$ class ->annotations && $ this ->emitOne ($ result , $ class ->annotations );
400
- $ result ->at ($ class ->declared )->out ->write (implode (' ' , $ class ->modifiers ).' class ' .$ this ->declaration ($ class ->name ));
401
- $ class ->parent && $ result ->out ->write (' extends ' .$ class ->parent );
402
- $ class ->implements && $ result ->out ->write (' implements ' .implode (', ' , $ class ->implements ));
408
+ $ result ->at ($ class ->declared )->out ->write (implode (' ' , $ class ->modifiers ).' class ' .$ class ->declaration ());
409
+ $ class ->parent && $ result ->out ->write (' extends ' .$ class ->parent ->literal ());
410
+
411
+ if ($ class ->implements ) {
412
+ $ list = '' ;
413
+ foreach ($ class ->implements as $ type ) {
414
+ $ list .= ', ' .$ type ->literal ();
415
+ }
416
+ $ result ->out ->write (' implements ' .substr ($ list , 2 ));
417
+ }
418
+
403
419
$ result ->out ->write ('{ ' );
404
420
foreach ($ class ->body as $ member ) {
405
421
$ this ->emitOne ($ result , $ member );
@@ -444,7 +460,7 @@ protected function emitClass($result, $class) {
444
460
$ result ->out ->write ('static function __init() { ' );
445
461
$ this ->emitInitializations ($ result , $ result ->locals [0 ]);
446
462
$ this ->emitMeta ($ result , $ class ->name , $ class ->annotations , $ class ->comment );
447
- $ result ->out ->write ('}} ' .$ class ->name .'::__init(); ' );
463
+ $ result ->out ->write ('}} ' .$ class ->name -> literal () .'::__init(); ' );
448
464
array_shift ($ result ->type );
449
465
$ result ->locals = [];
450
466
}
@@ -507,7 +523,7 @@ protected function emitInterface($result, $interface) {
507
523
508
524
$ interface ->comment && $ this ->emitOne ($ result , $ interface ->comment );
509
525
$ interface ->annotations && $ this ->emitOne ($ result , $ interface ->annotations );
510
- $ result ->at ($ interface ->declared )->out ->write ('interface ' .$ this ->declaration ($ interface -> name ));
526
+ $ result ->at ($ interface ->declared )->out ->write ('interface ' .$ interface ->declaration ());
511
527
$ interface ->parents && $ result ->out ->write (' extends ' .implode (', ' , $ interface ->parents ));
512
528
$ result ->out ->write ('{ ' );
513
529
foreach ($ interface ->body as $ member ) {
@@ -523,7 +539,7 @@ protected function emitTrait($result, $trait) {
523
539
524
540
$ trait ->comment && $ this ->emitOne ($ result , $ trait ->comment );
525
541
$ trait ->annotations && $ this ->emitOne ($ result , $ trait ->annotations );
526
- $ result ->at ($ trait ->declared )->out ->write ('trait ' .$ this ->declaration ($ trait -> name ));
542
+ $ result ->at ($ trait ->declared )->out ->write ('trait ' .$ trait ->declaration ());
527
543
$ result ->out ->write ('{ ' );
528
544
foreach ($ trait ->body as $ member ) {
529
545
$ this ->emitOne ($ result , $ member );
@@ -904,12 +920,12 @@ protected function emitArguments($result, $arguments) {
904
920
}
905
921
906
922
protected function emitNew ($ result , $ new ) {
907
- if ($ new ->type instanceof Node ) {
923
+ if ($ new ->type instanceof IsExpression ) {
908
924
$ result ->out ->write ('new ( ' );
909
- $ this ->emitOne ($ result , $ new ->type );
925
+ $ this ->emitOne ($ result , $ new ->type -> expression );
910
926
$ result ->out ->write (')( ' );
911
927
} else {
912
- $ result ->out ->write ('new ' .$ new ->type .'( ' );
928
+ $ result ->out ->write ('new ' .$ new ->type -> literal () .'( ' );
913
929
}
914
930
915
931
$ this ->emitArguments ($ result , $ new ->arguments );
@@ -925,12 +941,19 @@ protected function emitNewClass($result, $new) {
925
941
926
942
// Allow "extends self" to reference enclosing class (except if this
927
943
// class is an anonymous class!)
928
- if (' self ' === $ new -> definition -> parent && $ result -> type && $ result -> type [ 0 ]-> name ) {
929
- $ result ->out ->write (' extends ' .$ result ->type [0 ]->name );
944
+ if ($ result -> type && $ result -> type [ 0 ]-> name && $ new -> definition -> parent && ' self ' === $ new -> definition -> parent -> name () ) {
945
+ $ result ->out ->write (' extends ' .$ result ->type [0 ]->name -> literal () );
930
946
} else if ($ new ->definition ->parent ) {
931
- $ result ->out ->write (' extends ' .$ new ->definition ->parent );
947
+ $ result ->out ->write (' extends ' .$ new ->definition ->parent ->literal ());
948
+ }
949
+
950
+ if ($ new ->definition ->implements ) {
951
+ $ list = '' ;
952
+ foreach ($ new ->definition ->implements as $ type ) {
953
+ $ list .= ', ' .$ type ->literal ();
954
+ }
955
+ $ result ->out ->write (' implements ' .substr ($ list , 2 ));
932
956
}
933
- $ new ->definition ->implements && $ result ->out ->write (' implements ' .implode (', ' , $ new ->definition ->implements ));
934
957
935
958
array_unshift ($ result ->type , $ new ->definition );
936
959
$ result ->out ->write ('{ ' );
0 commit comments