diff options
Diffstat (limited to 'vendor/scssphp/scssphp/src/Visitor/StatementSearchVisitor.php')
-rw-r--r-- | vendor/scssphp/scssphp/src/Visitor/StatementSearchVisitor.php | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/vendor/scssphp/scssphp/src/Visitor/StatementSearchVisitor.php b/vendor/scssphp/scssphp/src/Visitor/StatementSearchVisitor.php new file mode 100644 index 000000000..1cb011f00 --- /dev/null +++ b/vendor/scssphp/scssphp/src/Visitor/StatementSearchVisitor.php @@ -0,0 +1,230 @@ +<?php + +/** + * SCSSPHP + * + * @copyright 2012-2020 Leaf Corcoran + * + * @license http://opensource.org/licenses/MIT MIT + * + * @link http://scssphp.github.io/scssphp + */ + +namespace ScssPhp\ScssPhp\Visitor; + +use ScssPhp\ScssPhp\Ast\Sass\Statement; +use ScssPhp\ScssPhp\Ast\Sass\Statement\AtRootRule; +use ScssPhp\ScssPhp\Ast\Sass\Statement\AtRule; +use ScssPhp\ScssPhp\Ast\Sass\Statement\CallableDeclaration; +use ScssPhp\ScssPhp\Ast\Sass\Statement\ContentBlock; +use ScssPhp\ScssPhp\Ast\Sass\Statement\ContentRule; +use ScssPhp\ScssPhp\Ast\Sass\Statement\DebugRule; +use ScssPhp\ScssPhp\Ast\Sass\Statement\Declaration; +use ScssPhp\ScssPhp\Ast\Sass\Statement\EachRule; +use ScssPhp\ScssPhp\Ast\Sass\Statement\ErrorRule; +use ScssPhp\ScssPhp\Ast\Sass\Statement\ExtendRule; +use ScssPhp\ScssPhp\Ast\Sass\Statement\ForRule; +use ScssPhp\ScssPhp\Ast\Sass\Statement\FunctionRule; +use ScssPhp\ScssPhp\Ast\Sass\Statement\IfClause; +use ScssPhp\ScssPhp\Ast\Sass\Statement\IfRule; +use ScssPhp\ScssPhp\Ast\Sass\Statement\ImportRule; +use ScssPhp\ScssPhp\Ast\Sass\Statement\IncludeRule; +use ScssPhp\ScssPhp\Ast\Sass\Statement\LoudComment; +use ScssPhp\ScssPhp\Ast\Sass\Statement\MediaRule; +use ScssPhp\ScssPhp\Ast\Sass\Statement\MixinRule; +use ScssPhp\ScssPhp\Ast\Sass\Statement\ParentStatement; +use ScssPhp\ScssPhp\Ast\Sass\Statement\ReturnRule; +use ScssPhp\ScssPhp\Ast\Sass\Statement\SilentComment; +use ScssPhp\ScssPhp\Ast\Sass\Statement\StyleRule; +use ScssPhp\ScssPhp\Ast\Sass\Statement\Stylesheet; +use ScssPhp\ScssPhp\Ast\Sass\Statement\SupportsRule; +use ScssPhp\ScssPhp\Ast\Sass\Statement\VariableDeclaration; +use ScssPhp\ScssPhp\Ast\Sass\Statement\WarnRule; +use ScssPhp\ScssPhp\Ast\Sass\Statement\WhileRule; +use ScssPhp\ScssPhp\Util\IterableUtil; + +/** + * A StatementVisitor whose `visit*` methods default to returning `null`, but + * which returns the first non-`null` value returned by any method. + * + * This can be extended to find the first instance of particular nodes in the + * AST. + * + * @internal + * + * @template T + * @template-implements StatementVisitor<T|null> + */ +abstract class StatementSearchVisitor implements StatementVisitor +{ + public function visitAtRootRule(AtRootRule $node) + { + return $this->visitChildren($node->getChildren()); + } + + public function visitAtRule(AtRule $node) + { + if ($node->getChildren() !== null) { + return $this->visitChildren($node->getChildren()); + } + + return null; + } + + public function visitContentBlock(ContentBlock $node) + { + return $this->visitCallableDeclaration($node); + } + + public function visitContentRule(ContentRule $node) + { + return null; + } + + public function visitDebugRule(DebugRule $node) + { + return null; + } + + public function visitDeclaration(Declaration $node) + { + if ($node->getChildren() !== null) { + return $this->visitChildren($node->getChildren()); + } + + return null; + } + + public function visitEachRule(EachRule $node) + { + return $this->visitChildren($node->getChildren()); + } + + public function visitErrorRule(ErrorRule $node) + { + return null; + } + + public function visitExtendRule(ExtendRule $node) + { + return null; + } + + public function visitForRule(ForRule $node) + { + return $this->visitChildren($node->getChildren()); + } + + public function visitFunctionRule(FunctionRule $node) + { + return $this->visitCallableDeclaration($node); + } + + public function visitIfRule(IfRule $node) + { + $value = IterableUtil::search($node->getClauses(), fn(IfClause $clause) => IterableUtil::search($clause->getChildren(), fn(Statement $child) => $child->accept($this))); + + if ($node->getLastClause() !== null) { + $value ??= IterableUtil::search($node->getLastClause()->getChildren(), fn(Statement $child) => $child->accept($this)); + } + + return $value; + } + + public function visitImportRule(ImportRule $node) + { + return null; + } + + public function visitIncludeRule(IncludeRule $node) + { + if ($node->getContent() !== null) { + return $this->visitContentBlock($node->getContent()); + } + + return null; + } + + public function visitLoudComment(LoudComment $node) + { + return null; + } + + public function visitMediaRule(MediaRule $node) + { + return $this->visitChildren($node->getChildren()); + } + + public function visitMixinRule(MixinRule $node) + { + return $this->visitCallableDeclaration($node); + } + + public function visitReturnRule(ReturnRule $node) + { + return null; + } + + public function visitSilentComment(SilentComment $node) + { + return null; + } + + public function visitStyleRule(StyleRule $node) + { + return $this->visitChildren($node->getChildren()); + } + + public function visitStylesheet(Stylesheet $node) + { + return $this->visitChildren($node->getChildren()); + } + + public function visitSupportsRule(SupportsRule $node) + { + return $this->visitChildren($node->getChildren()); + } + + public function visitVariableDeclaration(VariableDeclaration $node) + { + return null; + } + + public function visitWarnRule(WarnRule $node) + { + return null; + } + + public function visitWhileRule(WhileRule $node) + { + return $this->visitChildren($node->getChildren()); + } + + /** + * Visits each of $node's expressions and children. + * + * The default implementations of {@see visitFunctionRule} and {@see visitMixinRule} + * call this. + * + * @return T|null + */ + protected function visitCallableDeclaration(CallableDeclaration $node) + { + return $this->visitChildren($node->getChildren()); + } + + /** + * Visits each child in $children. + * + * The default implementation of the visit methods for all {@see ParentStatement}s + * call this. + * + * @param Statement[] $children + * + * @return T|null + */ + protected function visitChildren(array $children) + { + return IterableUtil::search($children, fn (Statement $child) => $child->accept($this)); + } +} |