@@ -2312,7 +2312,7 @@ private function parseDeclareStatement($parentNode) {
23122312 $ declareStatement ->parent = $ parentNode ;
23132313 $ declareStatement ->declareKeyword = $ this ->eat1 (TokenKind::DeclareKeyword);
23142314 $ declareStatement ->openParen = $ this ->eat1 (TokenKind::OpenParenToken);
2315- $ declareStatement -> declareDirective = $ this ->parseDeclareDirective ($ declareStatement );
2315+ $ this ->parseAndSetDeclareDirectiveList ($ declareStatement );
23162316 $ declareStatement ->closeParen = $ this ->eat1 (TokenKind::CloseParenToken);
23172317
23182318 if ($ this ->checkToken (TokenKind::SemicolonToken)) {
@@ -2329,26 +2329,76 @@ private function parseDeclareStatement($parentNode) {
23292329 return $ declareStatement ;
23302330 }
23312331
2332- private function parseDeclareDirective ($ parentNode ) {
2333- $ declareDirective = new DeclareDirective ();
2332+ /**
2333+ * @param DeclareStatement $parentNode
2334+ */
2335+ private function parseAndSetDeclareDirectiveList ($ parentNode ) {
2336+ $ declareDirectiveList = $ this ->parseDeclareDirectiveList ($ parentNode );
2337+
2338+ if (!$ declareDirectiveList ) {
2339+ $ declareDirective = new DeclareDirective ();
2340+ $ declareDirective ->parent = $ parentNode ;
2341+
2342+ $ declareDirective ->name = new MissingToken (TokenKind::Name, $ this ->token ->fullStart );
2343+ $ declareDirective ->equals = new MissingToken (TokenKind::EqualsToken, $ this ->token ->fullStart );
2344+ // TODO: This is matching the first token in $this::parseDeclareDirectiveFn.
2345+ // Probably best to emit a more general "literal error".
2346+ $ declareDirective ->literal = new MissingToken (TokenKind::FloatingLiteralToken, $ this ->token ->fullStart );
2347+
2348+ $ parentNode ->declareDirective = $ declareDirective ;
2349+ return ;
2350+ }
2351+
2352+ $ declareDirective = array_shift ($ declareDirectiveList ->children );
2353+ $ parentNode ->declareDirective = $ declareDirective ;
23342354 $ declareDirective ->parent = $ parentNode ;
2335- $ declareDirective ->name = $ this ->eat1 (TokenKind::Name);
2336- $ declareDirective ->equals = $ this ->eat1 (TokenKind::EqualsToken);
2337- $ declareDirective ->literal =
2338- $ this ->eat (
2339- TokenKind::FloatingLiteralToken,
2340- TokenKind::IntegerLiteralToken,
2341- TokenKind::DecimalLiteralToken,
2342- TokenKind::OctalLiteralToken,
2343- TokenKind::HexadecimalLiteralToken,
2344- TokenKind::BinaryLiteralToken,
2345- TokenKind::InvalidOctalLiteralToken,
2346- TokenKind::InvalidHexadecimalLiteral,
2347- TokenKind::InvalidBinaryLiteral,
2348- TokenKind::StringLiteralToken
2349- ); // TODO simplify
2350-
2351- return $ declareDirective ;
2355+
2356+ if ($ declareDirectiveList ->children ) {
2357+ $ parentNode ->otherDeclareDirectives = $ declareDirectiveList ;
2358+ }
2359+ }
2360+
2361+ /**
2362+ * @param DeclareStatement $parentNode
2363+ * @return DelimitedList\DeclareDirectiveList|null
2364+ */
2365+ private function parseDeclareDirectiveList ($ parentNode ) {
2366+ $ declareDirectiveList = $ this ->parseDelimitedList (
2367+ DelimitedList \DeclareDirectiveList::class,
2368+ TokenKind::CommaToken,
2369+ function ($ token ) {
2370+ return $ token ->kind === TokenKind::Name;
2371+ },
2372+ $ this ->parseDeclareDirectiveFn (),
2373+ $ parentNode ,
2374+ false
2375+ );
2376+
2377+ return $ declareDirectiveList ;
2378+ }
2379+
2380+ private function parseDeclareDirectiveFn () {
2381+ return function ($ parentNode ) {
2382+ $ declareDirective = new DeclareDirective ();
2383+ $ declareDirective ->parent = $ parentNode ;
2384+ $ declareDirective ->name = $ this ->eat1 (TokenKind::Name);
2385+ $ declareDirective ->equals = $ this ->eat1 (TokenKind::EqualsToken);
2386+ $ declareDirective ->literal =
2387+ $ this ->eat (
2388+ TokenKind::FloatingLiteralToken,
2389+ TokenKind::IntegerLiteralToken,
2390+ TokenKind::DecimalLiteralToken,
2391+ TokenKind::OctalLiteralToken,
2392+ TokenKind::HexadecimalLiteralToken,
2393+ TokenKind::BinaryLiteralToken,
2394+ TokenKind::InvalidOctalLiteralToken,
2395+ TokenKind::InvalidHexadecimalLiteral,
2396+ TokenKind::InvalidBinaryLiteral,
2397+ TokenKind::StringLiteralToken
2398+ ); // TODO simplify
2399+
2400+ return $ declareDirective ;
2401+ };
23522402 }
23532403
23542404 private function parseSimpleVariable ($ parentNode ) {
0 commit comments