diff --git a/app/Contexts/AbstractContext.php b/app/Contexts/AbstractContext.php index b241b77..5500282 100644 --- a/app/Contexts/AbstractContext.php +++ b/app/Contexts/AbstractContext.php @@ -9,6 +9,8 @@ abstract class AbstractContext { public array $children = []; + public bool $isAbleToAutocomplete = false; + public bool $autocompleting = false; protected array $freshObject; @@ -48,20 +50,20 @@ public function flip() public function findAutocompleting(?AbstractContext $context = null) { $context = $context ?? $this; - $result = $this->seachForAutocompleting($context, true); + $result = $this->searchForAutocompleting($context, true); $lastResult = null; while ($result !== null) { $lastResult = $result; - $result = $this->seachForAutocompleting($result); + $result = $this->searchForAutocompleting($result); } return $lastResult; } - protected function seachForAutocompleting(AbstractContext $context, $checkCurrent = false) + protected function searchForAutocompleting(AbstractContext $context, $checkCurrent = false) { - if ($checkCurrent && $context->autocompleting && ($context instanceof MethodCall || $context instanceof ObjectValue)) { + if ($checkCurrent && $context->autocompleting && $context->isAbleToAutocomplete) { return $context; } diff --git a/app/Contexts/MethodCall.php b/app/Contexts/MethodCall.php index 4e82220..26b77ff 100644 --- a/app/Contexts/MethodCall.php +++ b/app/Contexts/MethodCall.php @@ -4,6 +4,8 @@ class MethodCall extends AbstractContext { + public bool $isAbleToAutocomplete = true; + public ?string $methodName = null; public ?string $className = null; diff --git a/app/Contexts/ObjectValue.php b/app/Contexts/ObjectValue.php index 6d3ea44..77c66cf 100644 --- a/app/Contexts/ObjectValue.php +++ b/app/Contexts/ObjectValue.php @@ -4,6 +4,8 @@ class ObjectValue extends AbstractContext { + public bool $isAbleToAutocomplete = true; + public ?string $className = null; public Arguments $arguments; diff --git a/app/Parsers/AbstractParser.php b/app/Parsers/AbstractParser.php index ad3ee12..17ec868 100644 --- a/app/Parsers/AbstractParser.php +++ b/app/Parsers/AbstractParser.php @@ -55,4 +55,14 @@ public function debug(...$messages) echo $this->indent($message) . PHP_EOL; } } + + protected function parentNodeIs(Node $node, array $nodeClasses): bool + { + if ($node->getParent() === null) { + return false; + } + + return in_array(get_class($node->getParent()), $nodeClasses) + || $this->parentNodeIs($node->getParent(), $nodeClasses); + } } diff --git a/app/Parsers/ArrayCreationExpressionParser.php b/app/Parsers/ArrayCreationExpressionParser.php index 550eeab..21cf78e 100644 --- a/app/Parsers/ArrayCreationExpressionParser.php +++ b/app/Parsers/ArrayCreationExpressionParser.php @@ -6,6 +6,8 @@ use App\Contexts\ArrayValue; use Microsoft\PhpParser\MissingToken; use Microsoft\PhpParser\Node\Expression\ArrayCreationExpression; +use Microsoft\PhpParser\Node\Expression\CallExpression; +use Microsoft\PhpParser\Node\Expression\ObjectCreationExpression; class ArrayCreationExpressionParser extends AbstractParser { @@ -16,6 +18,13 @@ class ArrayCreationExpressionParser extends AbstractParser public function parse(ArrayCreationExpression $node) { + // If array is inside a method, for example Validator::validate([' + // then we need to ignore isAbleToAutocomplete for ArrayValue because + // priority is given to App\Contexts\MethodCall or App\Contexts\ObjectValue + if (!$this->parentNodeIs($node, [CallExpression::class, ObjectCreationExpression::class])) { + $this->context->isAbleToAutocomplete = true; + } + $this->context->autocompleting = $node->closeParenOrBracket instanceof MissingToken; return $this->context;