2323use Doctrine \ORM \Mapping \OneToOne ;
2424use PhpParser \Builder ;
2525use PhpParser \BuilderHelpers ;
26+ use PhpParser \Lexer ;
2627use PhpParser \Node ;
2728use PhpParser \NodeTraverser ;
2829use PhpParser \NodeVisitor ;
2930use PhpParser \Parser ;
30- use PhpParser \ParserFactory ;
31+ use PhpParser \PhpVersion ;
3132use Symfony \Bundle \MakerBundle \ConsoleStyle ;
3233use Symfony \Bundle \MakerBundle \Doctrine \BaseCollectionRelation ;
3334use Symfony \Bundle \MakerBundle \Doctrine \BaseRelation ;
@@ -48,7 +49,8 @@ final class ClassSourceManipulator
4849 private const CONTEXT_CLASS_METHOD = 'class_method ' ;
4950 private const DEFAULT_VALUE_NONE = '__default_value_none ' ;
5051
51- private Parser \Php8 $ parser ;
52+ private Parser $ parser ;
53+ private Lexer \Emulative $ lexer ;
5254 private PrettyPrinter $ printer ;
5355 private ?ConsoleStyle $ io = null ;
5456
@@ -63,7 +65,21 @@ public function __construct(
6365 private bool $ overwrite = false ,
6466 private bool $ useAttributesForDoctrineMapping = true ,
6567 ) {
66- $ this ->parser = (new ParserFactory ())->createForNewestSupportedVersion ();
68+ if (class_exists (PhpVersion::class)) {
69+ $ version = PhpVersion::fromString (\PHP_VERSION );
70+ $ this ->lexer = new Lexer \Emulative ($ version );
71+ $ this ->parser = new Parser \Php8 ($ this ->lexer , $ version );
72+ } else {
73+ $ this ->lexer = new Lexer \Emulative ([
74+ 'usedAttributes ' => [
75+ 'comments ' ,
76+ 'startLine ' , 'endLine ' ,
77+ 'startTokenPos ' , 'endTokenPos ' ,
78+ ],
79+ ]);
80+ $ this ->parser = new Parser \Php7 ($ this ->lexer );
81+ }
82+
6783 $ this ->printer = new PrettyPrinter ();
6884
6985 $ this ->setSourceCode ($ sourceCode );
@@ -892,7 +908,12 @@ private function setSourceCode(string $sourceCode): void
892908 {
893909 $ this ->sourceCode = $ sourceCode ;
894910 $ this ->oldStmts = $ this ->parser ->parse ($ sourceCode );
895- $ this ->oldTokens = $ this ->parser ->getTokens ();
911+
912+ if (\is_callable ([$ this ->parser , 'getTokens ' ])) {
913+ $ this ->oldTokens = $ this ->parser ->getTokens ();
914+ } elseif (\is_callable ([$ this ->lexer , 'getTokens ' ])) {
915+ $ this ->oldTokens = $ this ->lexer ->getTokens ();
916+ }
896917
897918 $ traverser = new NodeTraverser ();
898919 $ traverser ->addVisitor (new NodeVisitor \CloningVisitor ());
0 commit comments