From 599f0e45a6a023fab0253445edb00553b8284a6f Mon Sep 17 00:00:00 2001 From: N1ebieski Date: Mon, 17 Mar 2025 10:22:23 +0000 Subject: [PATCH 1/8] Add ArrayValue to searchForAutocompleting Fixes N1ebieski/vs-code-php-parser-cli#7 --- app/Contexts/AbstractContext.php | 9 +++++---- app/Contexts/ArrayValue.php | 4 +++- app/Contexts/Contracts/PossibleAutocompleting.php | 10 ++++++++++ app/Contexts/MethodCall.php | 4 +++- app/Contexts/ObjectValue.php | 4 +++- 5 files changed, 24 insertions(+), 7 deletions(-) create mode 100644 app/Contexts/Contracts/PossibleAutocompleting.php diff --git a/app/Contexts/AbstractContext.php b/app/Contexts/AbstractContext.php index b241b77..251a334 100644 --- a/app/Contexts/AbstractContext.php +++ b/app/Contexts/AbstractContext.php @@ -2,6 +2,7 @@ namespace App\Contexts; +use App\Contexts\Contracts\PossibleAutocompleting; use Illuminate\Support\Arr; use Microsoft\PhpParser\Range; @@ -48,20 +49,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 instanceof PossibleAutocompleting) { return $context; } diff --git a/app/Contexts/ArrayValue.php b/app/Contexts/ArrayValue.php index 71299ce..450f863 100644 --- a/app/Contexts/ArrayValue.php +++ b/app/Contexts/ArrayValue.php @@ -2,7 +2,9 @@ namespace App\Contexts; -class ArrayValue extends AbstractContext +use App\Contexts\Contracts\PossibleAutocompleting; + +class ArrayValue extends AbstractContext implements PossibleAutocompleting { public function type(): string { diff --git a/app/Contexts/Contracts/PossibleAutocompleting.php b/app/Contexts/Contracts/PossibleAutocompleting.php new file mode 100644 index 0000000..5a4521f --- /dev/null +++ b/app/Contexts/Contracts/PossibleAutocompleting.php @@ -0,0 +1,10 @@ + Date: Mon, 17 Mar 2025 11:37:42 +0000 Subject: [PATCH 2/8] Add ArrayValue to searchForAutocompleting Fixes N1ebieski/vs-code-php-parser-cli#7 --- app/Parsers/ArrayCreationExpressionParser.php | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/app/Parsers/ArrayCreationExpressionParser.php b/app/Parsers/ArrayCreationExpressionParser.php index 550eeab..fdceb44 100644 --- a/app/Parsers/ArrayCreationExpressionParser.php +++ b/app/Parsers/ArrayCreationExpressionParser.php @@ -5,7 +5,9 @@ use App\Contexts\AbstractContext; use App\Contexts\ArrayValue; use Microsoft\PhpParser\MissingToken; +use Microsoft\PhpParser\Node; use Microsoft\PhpParser\Node\Expression\ArrayCreationExpression; +use Microsoft\PhpParser\Node\Expression\CallExpression; class ArrayCreationExpressionParser extends AbstractParser { @@ -14,9 +16,27 @@ class ArrayCreationExpressionParser extends AbstractParser */ protected AbstractContext $context; + private function isParentNode(Node $node, string $nodeClass): bool + { + if ($node->getParent() !== null) { + if ($node->getParent() instanceof $nodeClass) { + return true; + } + + return $this->isParentNode($node->getParent(), $nodeClass); + } + + return false; + } + public function parse(ArrayCreationExpression $node) { - $this->context->autocompleting = $node->closeParenOrBracket instanceof MissingToken; + // If array is inside a method, for example Validator::validate([' + // then we need to ignore autocompleting for ArrayValue because + // priority is given to App\Contexts\MethodCall + if (!$this->isParentNode($node, CallExpression::class)) { + $this->context->autocompleting = $node->closeParenOrBracket instanceof MissingToken; + } return $this->context; } From 31a2a679d9680ff3f6e951d50ddab58725c1d7d0 Mon Sep 17 00:00:00 2001 From: N1ebieski Date: Mon, 17 Mar 2025 11:57:22 +0000 Subject: [PATCH 3/8] Add ArrayValue to searchForAutocompleting N1ebieski/vs-code-php-parser-cli#7 --- app/Contexts/AbstractContext.php | 9 +++++++-- app/Contexts/ArrayValue.php | 4 +--- app/Contexts/Contracts/PossibleAutocompleting.php | 10 ---------- app/Contexts/MethodCall.php | 6 +++--- app/Contexts/ObjectValue.php | 6 +++--- app/Parsers/ArrayCreationExpressionParser.php | 4 +++- 6 files changed, 17 insertions(+), 22 deletions(-) delete mode 100644 app/Contexts/Contracts/PossibleAutocompleting.php diff --git a/app/Contexts/AbstractContext.php b/app/Contexts/AbstractContext.php index 251a334..cc12a15 100644 --- a/app/Contexts/AbstractContext.php +++ b/app/Contexts/AbstractContext.php @@ -2,7 +2,6 @@ namespace App\Contexts; -use App\Contexts\Contracts\PossibleAutocompleting; use Illuminate\Support\Arr; use Microsoft\PhpParser\Range; @@ -10,6 +9,12 @@ abstract class AbstractContext { public array $children = []; + /** + * Whether this context can be found as last result + * in findAutocompleting method + */ + public bool $findable = false; + public bool $autocompleting = false; protected array $freshObject; @@ -62,7 +67,7 @@ public function findAutocompleting(?AbstractContext $context = null) protected function searchForAutocompleting(AbstractContext $context, $checkCurrent = false) { - if ($checkCurrent && $context->autocompleting && $context instanceof PossibleAutocompleting) { + if ($checkCurrent && $context->autocompleting && $context->findable) { return $context; } diff --git a/app/Contexts/ArrayValue.php b/app/Contexts/ArrayValue.php index 450f863..71299ce 100644 --- a/app/Contexts/ArrayValue.php +++ b/app/Contexts/ArrayValue.php @@ -2,9 +2,7 @@ namespace App\Contexts; -use App\Contexts\Contracts\PossibleAutocompleting; - -class ArrayValue extends AbstractContext implements PossibleAutocompleting +class ArrayValue extends AbstractContext { public function type(): string { diff --git a/app/Contexts/Contracts/PossibleAutocompleting.php b/app/Contexts/Contracts/PossibleAutocompleting.php deleted file mode 100644 index 5a4521f..0000000 --- a/app/Contexts/Contracts/PossibleAutocompleting.php +++ /dev/null @@ -1,10 +0,0 @@ -isParentNode($node, CallExpression::class)) { - $this->context->autocompleting = $node->closeParenOrBracket instanceof MissingToken; + $this->context->findable = true; } + $this->context->autocompleting = $node->closeParenOrBracket instanceof MissingToken; + return $this->context; } From e5922fcb9e3e6981cde083fc68f790ba6df5a0c1 Mon Sep 17 00:00:00 2001 From: N1ebieski Date: Mon, 17 Mar 2025 11:58:21 +0000 Subject: [PATCH 4/8] Add ArrayValue to searchForAutocompleting N1ebieski/vs-code-php-parser-cli#7 --- app/Parsers/ArrayCreationExpressionParser.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Parsers/ArrayCreationExpressionParser.php b/app/Parsers/ArrayCreationExpressionParser.php index 181487c..302bfbd 100644 --- a/app/Parsers/ArrayCreationExpressionParser.php +++ b/app/Parsers/ArrayCreationExpressionParser.php @@ -32,7 +32,7 @@ private function isParentNode(Node $node, string $nodeClass): bool public function parse(ArrayCreationExpression $node) { // If array is inside a method, for example Validator::validate([' - // then we need to ignore autocompleting for ArrayValue because + // then we need to ignore findable for ArrayValue because // priority is given to App\Contexts\MethodCall if (!$this->isParentNode($node, CallExpression::class)) { $this->context->findable = true; From 3c5ff398a1105fb891396f4d4c8cea3978e00826 Mon Sep 17 00:00:00 2001 From: N1ebieski Date: Mon, 17 Mar 2025 12:46:01 +0000 Subject: [PATCH 5/8] add ObjectValue to exceptions --- app/Parsers/ArrayCreationExpressionParser.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/Parsers/ArrayCreationExpressionParser.php b/app/Parsers/ArrayCreationExpressionParser.php index 302bfbd..88a0c18 100644 --- a/app/Parsers/ArrayCreationExpressionParser.php +++ b/app/Parsers/ArrayCreationExpressionParser.php @@ -4,6 +4,7 @@ use App\Contexts\AbstractContext; use App\Contexts\ArrayValue; +use App\Contexts\ObjectValue; use Microsoft\PhpParser\MissingToken; use Microsoft\PhpParser\Node; use Microsoft\PhpParser\Node\Expression\ArrayCreationExpression; @@ -16,14 +17,14 @@ class ArrayCreationExpressionParser extends AbstractParser */ protected AbstractContext $context; - private function isParentNode(Node $node, string $nodeClass): bool + private function isParentNode(Node $node, array $nodeClasses): bool { if ($node->getParent() !== null) { - if ($node->getParent() instanceof $nodeClass) { + if (collect($nodeClasses)->contains(get_class($node->getParent()))) { return true; } - return $this->isParentNode($node->getParent(), $nodeClass); + return $this->isParentNode($node->getParent(), $nodeClasses); } return false; @@ -33,8 +34,8 @@ public function parse(ArrayCreationExpression $node) { // If array is inside a method, for example Validator::validate([' // then we need to ignore findable for ArrayValue because - // priority is given to App\Contexts\MethodCall - if (!$this->isParentNode($node, CallExpression::class)) { + // priority is given to App\Contexts\MethodCall or App\Contexts\ObjectValue + if (!$this->isParentNode($node, [CallExpression::class, ObjectValue::class])) { $this->context->findable = true; } From d57b8fd993a80a39d4115f112b23394817446af3 Mon Sep 17 00:00:00 2001 From: N1ebieski Date: Mon, 17 Mar 2025 12:47:38 +0000 Subject: [PATCH 6/8] refactoring --- app/Parsers/ArrayCreationExpressionParser.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Parsers/ArrayCreationExpressionParser.php b/app/Parsers/ArrayCreationExpressionParser.php index 88a0c18..0551ceb 100644 --- a/app/Parsers/ArrayCreationExpressionParser.php +++ b/app/Parsers/ArrayCreationExpressionParser.php @@ -20,7 +20,7 @@ class ArrayCreationExpressionParser extends AbstractParser private function isParentNode(Node $node, array $nodeClasses): bool { if ($node->getParent() !== null) { - if (collect($nodeClasses)->contains(get_class($node->getParent()))) { + if (in_array(get_class($node->getParent()), $nodeClasses)) { return true; } From ee236e0bfc96e5584540a3b1414bcd144842a027 Mon Sep 17 00:00:00 2001 From: N1ebieski Date: Sun, 30 Mar 2025 09:48:22 +0000 Subject: [PATCH 7/8] fix replace ObjectValue to ObjectCreationExpression --- app/Parsers/ArrayCreationExpressionParser.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Parsers/ArrayCreationExpressionParser.php b/app/Parsers/ArrayCreationExpressionParser.php index 0551ceb..c50bd50 100644 --- a/app/Parsers/ArrayCreationExpressionParser.php +++ b/app/Parsers/ArrayCreationExpressionParser.php @@ -4,11 +4,11 @@ use App\Contexts\AbstractContext; use App\Contexts\ArrayValue; -use App\Contexts\ObjectValue; use Microsoft\PhpParser\MissingToken; use Microsoft\PhpParser\Node; use Microsoft\PhpParser\Node\Expression\ArrayCreationExpression; use Microsoft\PhpParser\Node\Expression\CallExpression; +use Microsoft\PhpParser\Node\Expression\ObjectCreationExpression; class ArrayCreationExpressionParser extends AbstractParser { @@ -35,7 +35,7 @@ public function parse(ArrayCreationExpression $node) // If array is inside a method, for example Validator::validate([' // then we need to ignore findable for ArrayValue because // priority is given to App\Contexts\MethodCall or App\Contexts\ObjectValue - if (!$this->isParentNode($node, [CallExpression::class, ObjectValue::class])) { + if (!$this->isParentNode($node, [CallExpression::class, ObjectCreationExpression::class])) { $this->context->findable = true; } From 006eb25325889c358d27aa81a88dba2869e7b442 Mon Sep 17 00:00:00 2001 From: Joe Tannenbaum Date: Wed, 7 May 2025 13:47:26 -0400 Subject: [PATCH 8/8] method/property renaming --- app/Contexts/AbstractContext.php | 8 ++------ app/Contexts/MethodCall.php | 2 +- app/Contexts/ObjectValue.php | 2 +- app/Parsers/AbstractParser.php | 10 ++++++++++ app/Parsers/ArrayCreationExpressionParser.php | 20 +++---------------- 5 files changed, 17 insertions(+), 25 deletions(-) diff --git a/app/Contexts/AbstractContext.php b/app/Contexts/AbstractContext.php index cc12a15..5500282 100644 --- a/app/Contexts/AbstractContext.php +++ b/app/Contexts/AbstractContext.php @@ -9,11 +9,7 @@ abstract class AbstractContext { public array $children = []; - /** - * Whether this context can be found as last result - * in findAutocompleting method - */ - public bool $findable = false; + public bool $isAbleToAutocomplete = false; public bool $autocompleting = false; @@ -67,7 +63,7 @@ public function findAutocompleting(?AbstractContext $context = null) protected function searchForAutocompleting(AbstractContext $context, $checkCurrent = false) { - if ($checkCurrent && $context->autocompleting && $context->findable) { + if ($checkCurrent && $context->autocompleting && $context->isAbleToAutocomplete) { return $context; } diff --git a/app/Contexts/MethodCall.php b/app/Contexts/MethodCall.php index 6a81662..26b77ff 100644 --- a/app/Contexts/MethodCall.php +++ b/app/Contexts/MethodCall.php @@ -4,7 +4,7 @@ class MethodCall extends AbstractContext { - public bool $findable = true; + public bool $isAbleToAutocomplete = true; public ?string $methodName = null; diff --git a/app/Contexts/ObjectValue.php b/app/Contexts/ObjectValue.php index 71a5ca4..77c66cf 100644 --- a/app/Contexts/ObjectValue.php +++ b/app/Contexts/ObjectValue.php @@ -4,7 +4,7 @@ class ObjectValue extends AbstractContext { - public bool $findable = true; + public bool $isAbleToAutocomplete = true; public ?string $className = null; 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 c50bd50..21cf78e 100644 --- a/app/Parsers/ArrayCreationExpressionParser.php +++ b/app/Parsers/ArrayCreationExpressionParser.php @@ -5,7 +5,6 @@ use App\Contexts\AbstractContext; use App\Contexts\ArrayValue; use Microsoft\PhpParser\MissingToken; -use Microsoft\PhpParser\Node; use Microsoft\PhpParser\Node\Expression\ArrayCreationExpression; use Microsoft\PhpParser\Node\Expression\CallExpression; use Microsoft\PhpParser\Node\Expression\ObjectCreationExpression; @@ -17,26 +16,13 @@ class ArrayCreationExpressionParser extends AbstractParser */ protected AbstractContext $context; - private function isParentNode(Node $node, array $nodeClasses): bool - { - if ($node->getParent() !== null) { - if (in_array(get_class($node->getParent()), $nodeClasses)) { - return true; - } - - return $this->isParentNode($node->getParent(), $nodeClasses); - } - - return false; - } - public function parse(ArrayCreationExpression $node) { // If array is inside a method, for example Validator::validate([' - // then we need to ignore findable for ArrayValue because + // then we need to ignore isAbleToAutocomplete for ArrayValue because // priority is given to App\Contexts\MethodCall or App\Contexts\ObjectValue - if (!$this->isParentNode($node, [CallExpression::class, ObjectCreationExpression::class])) { - $this->context->findable = true; + if (!$this->parentNodeIs($node, [CallExpression::class, ObjectCreationExpression::class])) { + $this->context->isAbleToAutocomplete = true; } $this->context->autocompleting = $node->closeParenOrBracket instanceof MissingToken;