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;
};