diff --git a/app/Parsers/InlineHtmlParser.php b/app/Parsers/InlineHtmlParser.php index 8ce758d..97f7a46 100644 --- a/app/Parsers/InlineHtmlParser.php +++ b/app/Parsers/InlineHtmlParser.php @@ -6,12 +6,16 @@ use App\Contexts\Blade; use App\Parser\Parse; use App\Parser\Settings; +use Illuminate\Support\Collection; +use Illuminate\Support\Str; use Microsoft\PhpParser\Node\Statement\InlineHtml; use Microsoft\PhpParser\Parser; use Microsoft\PhpParser\PositionUtilities; use Microsoft\PhpParser\Range; use Stillat\BladeParser\Document\Document; use Stillat\BladeParser\Nodes\BaseNode; +use Stillat\BladeParser\Nodes\Components\ComponentNode; +use Stillat\BladeParser\Nodes\Components\ParameterNode; use Stillat\BladeParser\Nodes\DirectiveNode; use Stillat\BladeParser\Nodes\EchoNode; use Stillat\BladeParser\Nodes\EchoType; @@ -76,10 +80,56 @@ protected function parseBladeContent($node) $this->parseEchoNode($child); } + if ($child instanceof ComponentNode) { + $this->parseComponentNode($child); + } + $this->parseBladeContent($child); } } + protected function parseComponentNode(ComponentNode $node) + { + /** @var Collection $parameters */ + $parameters = $node->getParameters(); + + foreach ($parameters as $parameter) { + $prefix = Str::match('/^({{{|{{|{!!)/', $parameter->value); + + $snippet = "getStartIndentationLevel()) . str_replace($prefix, '', $parameter->value) . ';'; + + $sourceFile = (new Parser)->parseSourceFile($snippet); + + Settings::$calculatePosition = function (Range $range) use ($node, $parameter) { + if ($range->start->line === 1) { + $rangeCharacters = $range->end->character - $range->start->character; + // If component has />, then we need to remove 1 character + $selfClosingCharacter = $node->getIsSelfClosing() ? 1 : 0; + + $firstQuotePosition = strpos($parameter->content, "'"); + + $range->start->character = $parameter->position->startColumn + $firstQuotePosition - $selfClosingCharacter; + $range->end->character = $parameter->position->startColumn + $firstQuotePosition + $rangeCharacters - $selfClosingCharacter; + } + + $range->start->line += $this->startLine + $parameter->position->startLine - 2; + $range->end->line += $this->startLine + $parameter->position->startLine - 2; + + return $range; + }; + + $result = Parse::parse($sourceFile); + + if (count($result->children) === 0) { + continue; + } + + $child = $result->children[0]; + + $this->items[] = $child; + } + } + protected function doEchoParse(BaseNode $node, $prefix, $content) { $snippet = "getStartIndentationLevel()) . str_replace($prefix, '', $content) . ';'; @@ -95,7 +145,7 @@ protected function doEchoParse(BaseNode $node, $prefix, $content) } $range->start->line += $this->startLine + $node->position->startLine - 2; - $range->end->line += $this->startLine + $node->position->startLine - 2; + $range->end->line += $this->startLine + $node->position->startLine - 2; return $range; };