52
52
use function count ;
53
53
use const PHP_EOL ;
54
54
55
+ function nowdoc (string $ str ): string
56
+ {
57
+ $ lines = \preg_split ('/ \\n/ ' , $ str );
58
+
59
+ if ($ lines === false ) {
60
+ return '' ;
61
+ }
62
+
63
+ if (\count ($ lines ) <= 2 ) {
64
+ return '' ;
65
+ }
66
+
67
+ // Toss out the first line
68
+ $ lines = \array_slice ($ lines , 1 , \count ($ lines ) - 1 );
69
+
70
+ // normalize any tabs to spaces
71
+ $ lines = array_map (static function ($ line ) {
72
+ return preg_replace_callback ('/(\t+)/m ' , function ($ matches ) {
73
+ $ fixed = str_repeat (' ' , strlen ($ matches [1 ]));
74
+ return $ fixed ;
75
+ }, $ line );
76
+ }, $ lines );
77
+
78
+ // take the ws from the first line and subtract them from all lines
79
+ $ matches = [];
80
+ \preg_match ('/(^[ \t]+)/ ' , $ lines [0 ], $ matches );
81
+
82
+ $ numLines = \count ($ lines );
83
+ for ($ i = 0 ; $ i < $ numLines ; ++$ i ) {
84
+ $ lines [$ i ] = \str_replace ($ matches [0 ], '' , $ lines [$ i ]);
85
+ }
86
+
87
+ return \implode ("\n" , $ lines );
88
+ }
89
+
55
90
class PrinterTest extends TestCase
56
91
{
57
92
@@ -648,7 +683,7 @@ public function enterNode(Node $node)
648
683
$ changeCallableTypeIdentifier ,
649
684
];
650
685
651
- $ addItemsToArrayShape = new class extends AbstractNodeVisitor {
686
+ $ addKeylessItemsToArrayShape = new class extends AbstractNodeVisitor {
652
687
653
688
public function enterNode (Node $ node )
654
689
{
@@ -806,7 +841,7 @@ public function enterNode(Node $node)
806
841
'/**
807
842
* @return array{float, int, string}
808
843
*/ ' ,
809
- $ addItemsToArrayShape ,
844
+ $ addKeylessItemsToArrayShape ,
810
845
];
811
846
812
847
yield [
@@ -816,7 +851,7 @@ public function enterNode(Node $node)
816
851
'/**
817
852
* @return array{float, int, Foo, string}
818
853
*/ ' ,
819
- $ addItemsToArrayShape ,
854
+ $ addKeylessItemsToArrayShape ,
820
855
];
821
856
822
857
yield [
@@ -834,7 +869,7 @@ public function enterNode(Node $node)
834
869
* string,
835
870
* }
836
871
*/ ' ,
837
- $ addItemsToArrayShape ,
872
+ $ addKeylessItemsToArrayShape ,
838
873
];
839
874
840
875
yield [
@@ -852,7 +887,7 @@ public function enterNode(Node $node)
852
887
* string
853
888
* }
854
889
*/ ' ,
855
- $ addItemsToArrayShape ,
890
+ $ addKeylessItemsToArrayShape ,
856
891
];
857
892
858
893
yield [
@@ -870,7 +905,7 @@ public function enterNode(Node $node)
870
905
* string
871
906
* }
872
907
*/ ' ,
873
- $ addItemsToArrayShape ,
908
+ $ addKeylessItemsToArrayShape ,
874
909
];
875
910
876
911
yield [
@@ -888,7 +923,7 @@ public function enterNode(Node $node)
888
923
* string,
889
924
* }
890
925
*/ ' ,
891
- $ addItemsToArrayShape ,
926
+ $ addKeylessItemsToArrayShape ,
892
927
];
893
928
894
929
yield [
@@ -906,7 +941,7 @@ public function enterNode(Node $node)
906
941
* string
907
942
* }
908
943
*/ ' ,
909
- $ addItemsToArrayShape ,
944
+ $ addKeylessItemsToArrayShape ,
910
945
];
911
946
912
947
yield [
@@ -924,7 +959,7 @@ public function enterNode(Node $node)
924
959
* string
925
960
* }
926
961
*/ ' ,
927
- $ addItemsToArrayShape ,
962
+ $ addKeylessItemsToArrayShape ,
928
963
];
929
964
930
965
$ addItemsToObjectShape = new class extends AbstractNodeVisitor {
@@ -941,25 +976,66 @@ public function enterNode(Node $node)
941
976
};
942
977
943
978
yield [
944
- '/**
945
- * @return object{}
946
- */ ' ,
947
- '/**
948
- * @return object{foo: int}
949
- */ ' ,
979
+ nowdoc ('
980
+ /**
981
+ * @return object{}
982
+ */ ' ),
983
+ nowdoc ('
984
+ /**
985
+ * @return object{foo: int}
986
+ */ ' ),
950
987
$ addItemsToObjectShape ,
951
988
];
952
989
990
+ yield [
991
+ nowdoc ('
992
+ /**
993
+ * @return object{bar: string}
994
+ */ ' ),
995
+ nowdoc ('
996
+ /**
997
+ * @return object{bar: string, foo: int}
998
+ */ ' ),
999
+ $ addItemsToObjectShape ,
1000
+ ];
1001
+
1002
+ yield [
1003
+ nowdoc ('
1004
+ /**
1005
+ * @return object{bar: string}
1006
+ */ ' ),
1007
+ nowdoc ('
1008
+ /**
1009
+ * @return object{bar: string, foo: int}
1010
+ */ ' ),
1011
+ $ addItemsToObjectShape ,
1012
+ ];
1013
+ $ addCommentedItemsToMultilineObjectShape = new class extends AbstractNodeVisitor {
1014
+
1015
+ public function enterNode (Node $ node )
1016
+ {
1017
+ if ($ node instanceof ObjectShapeNode) {
1018
+ $ node = new ObjectShapeItemNode (new IdentifierTypeNode ('foo ' ), false , new IdentifierTypeNode ('int ' ));
1019
+ $ node ->setAttribute (Attribute::COMMENTS , [new Comment ('// bar ' )]);
1020
+ $ node ->items [] = $ node ;
1021
+ }
1022
+
1023
+ return $ node ;
1024
+ }
1025
+ };
1026
+
953
1027
yield [
954
1028
'/**
955
- * @return object{bar: string }
1029
+ * @return object{}
956
1030
*/ ' ,
957
1031
'/**
958
- * @return object{bar: string, foo: int}
1032
+ * @return object{foo: int}
959
1033
*/ ' ,
960
- $ addItemsToObjectShape ,
1034
+ $ addCommentedItemsToMultilineObjectShape ,
961
1035
];
962
1036
1037
+
1038
+
963
1039
$ addItemsToConstExprArray = new class extends AbstractNodeVisitor {
964
1040
965
1041
public function enterNode (Node $ node )
0 commit comments