@@ -2308,14 +2308,7 @@ private function parseDeclareStatement($parentNode) {
23082308 $ declareStatement ->parent = $ parentNode ;
23092309 $ declareStatement ->declareKeyword = $ this ->eat1 (TokenKind::DeclareKeyword);
23102310 $ declareStatement ->openParen = $ this ->eat1 (TokenKind::OpenParenToken);
2311- $ declareStatement ->declareDirectives = $ this ->parseDelimitedList (
2312- DelimitedList \DeclareDirectiveList::class,
2313- TokenKind::CommaToken,
2314- function ($ token ) {
2315- return $ token ->kind === TokenKind::Name;
2316- },
2317- $ this ->parseDeclareDirectiveFn (),
2318- $ declareStatement );
2311+ $ this ->parseAndSetDeclareDirectiveList ($ declareStatement );
23192312 $ declareStatement ->closeParen = $ this ->eat1 (TokenKind::CloseParenToken);
23202313
23212314 if ($ this ->checkToken (TokenKind::SemicolonToken)) {
@@ -2332,6 +2325,54 @@ function ($token) {
23322325 return $ declareStatement ;
23332326 }
23342327
2328+ /**
2329+ * @param DeclareStatement $parentNode
2330+ */
2331+ private function parseAndSetDeclareDirectiveList ($ parentNode ) {
2332+ $ declareDirectiveList = $ this ->parseDeclareDirectiveList ($ parentNode );
2333+
2334+ if (!$ declareDirectiveList ) {
2335+ $ declareDirective = new DeclareDirective ();
2336+ $ declareDirective ->parent = $ parentNode ;
2337+
2338+ $ declareDirective ->name = new MissingToken (TokenKind::Name, $ this ->token ->fullStart );
2339+ $ declareDirective ->equals = new MissingToken (TokenKind::EqualsToken, $ this ->token ->fullStart );
2340+ // TODO: This is matching the first token in $this::parseDeclareDirectiveFn.
2341+ // Probably best to emit a more general "literal error".
2342+ $ declareDirective ->literal = new MissingToken (TokenKind::FloatingLiteralToken, $ this ->token ->fullStart );
2343+
2344+ $ parentNode ->declareDirective = $ declareDirective ;
2345+ return ;
2346+ }
2347+
2348+ $ declareDirective = array_shift ($ declareDirectiveList ->children );
2349+ $ parentNode ->declareDirective = $ declareDirective ;
2350+ $ declareDirective ->parent = $ parentNode ;
2351+
2352+ if ($ declareDirectiveList ->children ) {
2353+ $ parentNode ->otherDeclareDirectives = $ declareDirectiveList ;
2354+ }
2355+ }
2356+
2357+ /**
2358+ * @param DeclareStatement $parentNode
2359+ * @return DelimitedList\DeclareDirectiveList|null
2360+ */
2361+ private function parseDeclareDirectiveList ($ parentNode ) {
2362+ $ declareDirectiveList = $ this ->parseDelimitedList (
2363+ DelimitedList \DeclareDirectiveList::class,
2364+ TokenKind::CommaToken,
2365+ function ($ token ) {
2366+ return $ token ->kind === TokenKind::Name;
2367+ },
2368+ $ this ->parseDeclareDirectiveFn (),
2369+ $ parentNode ,
2370+ false
2371+ );
2372+
2373+ return $ declareDirectiveList ;
2374+ }
2375+
23352376 private function parseDeclareDirectiveFn () {
23362377 return function ($ parentNode ) {
23372378 $ declareDirective = new DeclareDirective ();
0 commit comments