@@ -845,4 +845,109 @@ public function testInsertNewDocBlockWithClassNameAndSeparateNone(): void
845845 $ expected = "<?php /** \n * TestClass. \n * \n * @author John Doe \n */class TestClass {} " ;
846846 self ::assertSame ($ expected , $ tokens ->generateCode ());
847847 }
848+
849+ public function testSkipsAnonymousClasses (): void
850+ {
851+ $ code = '<?php $obj = new class {}; ' ;
852+ $ tokens = Tokens::fromCode ($ code );
853+ $ file = new SplFileInfo (__FILE__ );
854+
855+ $ method = new ReflectionMethod ($ this ->fixer , 'applyFix ' );
856+
857+ $ this ->fixer ->configure ([
858+ 'annotations ' => ['author ' => 'John Doe ' ],
859+ 'separate ' => 'none ' ,
860+ 'ensure_spacing ' => false ,
861+ ]);
862+ $ method ->invoke ($ this ->fixer , $ file , $ tokens );
863+
864+ // Code should remain unchanged - no DocBlock added to anonymous class
865+ self ::assertSame ($ code , $ tokens ->generateCode ());
866+ }
867+
868+ public function testSkipsAnonymousClassesButProcessesRegularClasses (): void
869+ {
870+ $ code = '<?php class RegularClass {} $obj = new class {}; ' ;
871+ $ tokens = Tokens::fromCode ($ code );
872+ $ file = new SplFileInfo (__FILE__ );
873+
874+ $ method = new ReflectionMethod ($ this ->fixer , 'applyFix ' );
875+
876+ $ this ->fixer ->configure ([
877+ 'annotations ' => ['author ' => 'John Doe ' ],
878+ 'separate ' => 'none ' ,
879+ 'ensure_spacing ' => false ,
880+ ]);
881+ $ method ->invoke ($ this ->fixer , $ file , $ tokens );
882+
883+ $ result = $ tokens ->generateCode ();
884+
885+ // Regular class should have DocBlock
886+ self ::assertStringContainsString ("/** \n * @author John Doe \n */class RegularClass " , $ result );
887+ // Anonymous class should NOT have DocBlock (should remain as "new class")
888+ self ::assertStringContainsString ('new class {} ' , $ result );
889+ }
890+
891+ public function testIsAnonymousClassDetectsAnonymousClass (): void
892+ {
893+ $ code = '<?php $obj = new class {}; ' ;
894+ $ tokens = Tokens::fromCode ($ code );
895+
896+ $ method = new ReflectionMethod ($ this ->fixer , 'isAnonymousClass ' );
897+
898+ // Find the class token index
899+ $ classIndex = null ;
900+ for ($ i = 0 ; $ i < $ tokens ->count (); ++$ i ) {
901+ if ($ tokens [$ i ]->isGivenKind (T_CLASS )) {
902+ $ classIndex = $ i ;
903+ break ;
904+ }
905+ }
906+
907+ $ result = $ method ->invoke ($ this ->fixer , $ tokens , $ classIndex );
908+
909+ self ::assertTrue ($ result );
910+ }
911+
912+ public function testIsAnonymousClassReturnsFalseForRegularClass (): void
913+ {
914+ $ code = '<?php class RegularClass {} ' ;
915+ $ tokens = Tokens::fromCode ($ code );
916+
917+ $ method = new ReflectionMethod ($ this ->fixer , 'isAnonymousClass ' );
918+
919+ // Find the class token index
920+ $ classIndex = null ;
921+ for ($ i = 0 ; $ i < $ tokens ->count (); ++$ i ) {
922+ if ($ tokens [$ i ]->isGivenKind (T_CLASS )) {
923+ $ classIndex = $ i ;
924+ break ;
925+ }
926+ }
927+
928+ $ result = $ method ->invoke ($ this ->fixer , $ tokens , $ classIndex );
929+
930+ self ::assertFalse ($ result );
931+ }
932+
933+ public function testIsAnonymousClassWithAttribute (): void
934+ {
935+ $ code = '<?php $obj = new #[SomeAttribute] class {}; ' ;
936+ $ tokens = Tokens::fromCode ($ code );
937+
938+ $ method = new ReflectionMethod ($ this ->fixer , 'isAnonymousClass ' );
939+
940+ // Find the class token index
941+ $ classIndex = null ;
942+ for ($ i = 0 ; $ i < $ tokens ->count (); ++$ i ) {
943+ if ($ tokens [$ i ]->isGivenKind (T_CLASS )) {
944+ $ classIndex = $ i ;
945+ break ;
946+ }
947+ }
948+
949+ $ result = $ method ->invoke ($ this ->fixer , $ tokens , $ classIndex );
950+
951+ self ::assertTrue ($ result );
952+ }
848953}
0 commit comments