22
33namespace  PHPStan \PhpDocParser \Lexer ;
44
5- use  function  array_keys ;
6- use  function  assert ;
7- use  function  count ;
85use  function  implode ;
96use  function  preg_match_all ;
107use  const  PREG_SET_ORDER ;
@@ -93,23 +90,17 @@ class Lexer
9390	/** @var string|null */ 
9491	private  $ regexp
9592
96- 	/** @var int[]|null */ 
97- 	private  $ types
98- 
9993	public  function  tokenize (string  $ sarray 
10094	{
101- 		if  ($ this regexp  === null  ||  $ this -> types  ===  null ) {
102- 			$ this initialize ();
95+ 		if  ($ this regexp  === null ) {
96+ 			$ this regexp  =  $ this -> generateRegexp ();
10397		}
10498
105- 		assert ($ this regexp  !== null );
106- 		assert ($ this types  !== null );
107- 
10899		preg_match_all ($ this regexp , $ s$ matchesPREG_SET_ORDER );
109100
110101		$ tokens
111102		foreach  ($ matchesas  $ match
112- 			$ tokens$ match0 ], $ this -> types [ count ( $ match ) -  2 ]];
103+ 			$ tokens$ match0 ], ( int )  $ match [ ' MARK ' 
113104		}
114105
115106		$ tokens'' , self ::TOKEN_END ];
@@ -118,7 +109,7 @@ public function tokenize(string $s): array
118109	}
119110
120111
121- 	private  function  initialize (): void 
112+ 	private  function  generateRegexp (): string 
122113	{
123114		$ patterns
124115			self ::TOKEN_HORIZONTAL_WS  => '[ \\x09 \\x20]++ ' ,
@@ -166,8 +157,11 @@ private function initialize(): void
166157			self ::TOKEN_OTHER  => '(?:(?! \\*/)[^ \\s])++ ' ,
167158		];
168159
169- 		$ this regexp  = '~( '  . implode (')|( ' , $ patterns')~Asi ' ;
170- 		$ this types  = array_keys ($ patterns
160+ 		foreach  ($ patternsas  $ type$ pattern
161+ 			$ pattern'(?: '  . $ pattern')(*MARK: '  . $ type') ' ;
162+ 		}
163+ 
164+ 		return  '~ '  . implode ('| ' , $ patterns'~Asi ' ;
171165	}
172166
173167}
0 commit comments