%PDF- %PDF-
Direktori : /home/q/g/b/qgbqkvz/www/wp-content/plugins/wp-scss/scssphp/src/Visitor/ |
Current File : /home/q/g/b/qgbqkvz/www/wp-content/plugins/wp-scss/scssphp/src/Visitor/StatementSearchVisitor.php |
<?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; /** * 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 = $this->searchIterable($node->getClauses(), function (IfClause $clause) { return $this->searchIterable($clause->getChildren(), function (Statement $child) { return $child->accept($this); }); }); if ($node->getLastClause() !== null) { $value = $value ?? $this->searchIterable($node->getLastClause()->getChildren(), function (Statement $child) { return $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) { foreach ($children as $child) { $result = $child->accept($this); if ($result !== null) { return $result; } } return null; } /** * Returns the first `T` returned by $callback for an element of $iterable, * or `null` if it returns `null` for every element. * * @template E * @param iterable<E> $iterable * @param callable(E): (T|null) $callback * * @return T|null */ private function searchIterable(iterable $iterable, callable $callback) { foreach ($iterable as $element) { $value = $callback($element); if ($value !== null) { return $value; } } return null; } }