From a14f582b9c688869ecb21b0de1cec828371dffff Mon Sep 17 00:00:00 2001 From: Jake Hotson Date: Thu, 11 Dec 2025 10:00:40 +0000 Subject: [PATCH 1/2] [CLEANUP] Extract method `DeclarationBlock::parseSelector` Closes #1324 --- src/RuleSet/DeclarationBlock.php | 42 ++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/src/RuleSet/DeclarationBlock.php b/src/RuleSet/DeclarationBlock.php index 81590d51..d1a44703 100644 --- a/src/RuleSet/DeclarationBlock.php +++ b/src/RuleSet/DeclarationBlock.php @@ -283,19 +283,33 @@ public function render(OutputFormat $outputFormat): string private static function parseSelectors(ParserState $parserState, array &$comments = []): array { $selectors = []; + + while (true) { + $selectors[] = self::parseSelector($parserState, $comments); + if (!$parserState->consumeIfComes(',')) { + break; + } + } + + return $selectors; + } + + /** + * @param list $comments + * + * @throws UnexpectedTokenException + */ + private static function parseSelector(ParserState $parserState, array &$comments = []): string + { $selectorParts = []; $stringWrapperCharacter = null; $functionNestingLevel = 0; - $consumedNextCharacter = false; static $stopCharacters = ['{', '}', '\'', '"', '(', ')', ',']; - do { - if (!$consumedNextCharacter) { - $selectorParts[] = $parserState->consume(1); - } + while (true) { + $selectorParts[] = $parserState->consume(1); $selectorParts[] = $parserState->consumeUntil($stopCharacters, false, false, $comments); $nextCharacter = $parserState->peek(); - $consumedNextCharacter = false; switch ($nextCharacter) { case '\'': // The fallthrough is intentional. @@ -321,22 +335,24 @@ private static function parseSelectors(ParserState $parserState, array &$comment --$functionNestingLevel; } break; + case '{': + case '}': + if (!\is_string($stringWrapperCharacter)) { + break 2; + } + break; case ',': if (!\is_string($stringWrapperCharacter) && $functionNestingLevel === 0) { - $selectors[] = \implode('', $selectorParts); - $selectorParts = []; - $parserState->consume(1); - $consumedNextCharacter = true; + break 2; } break; } - } while (!\in_array($nextCharacter, ['{', '}'], true) || \is_string($stringWrapperCharacter)); + } if ($functionNestingLevel !== 0) { throw new UnexpectedTokenException(')', $nextCharacter); } - $selectors[] = \implode('', $selectorParts); // add final or only selector - return $selectors; + return \implode('', $selectorParts); } } From 3d6672238203c08675c2d47e9db86542ba100d63 Mon Sep 17 00:00:00 2001 From: JakeQZ Date: Fri, 12 Dec 2025 13:16:10 +0000 Subject: [PATCH 2/2] Add comment about fallthrough in `switch` Co-authored-by: Oliver Klee --- src/RuleSet/DeclarationBlock.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/RuleSet/DeclarationBlock.php b/src/RuleSet/DeclarationBlock.php index d1a44703..456dc33b 100644 --- a/src/RuleSet/DeclarationBlock.php +++ b/src/RuleSet/DeclarationBlock.php @@ -336,6 +336,7 @@ private static function parseSelector(ParserState $parserState, array &$comments } break; case '{': + // The fallthrough is intentional. case '}': if (!\is_string($stringWrapperCharacter)) { break 2;