Skip to content

Commit b26c66d

Browse files
Merge pull request #16 from N1ebieski/Add-ArrayValue-to-searchForAutocompleting-#7
Add ArrayValue to search for autocompleting
2 parents dee53c3 + 006eb25 commit b26c66d

File tree

5 files changed

+29
-4
lines changed

5 files changed

+29
-4
lines changed

app/Contexts/AbstractContext.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ abstract class AbstractContext
99
{
1010
public array $children = [];
1111

12+
public bool $isAbleToAutocomplete = false;
13+
1214
public bool $autocompleting = false;
1315

1416
protected array $freshObject;
@@ -48,20 +50,20 @@ public function flip()
4850
public function findAutocompleting(?AbstractContext $context = null)
4951
{
5052
$context = $context ?? $this;
51-
$result = $this->seachForAutocompleting($context, true);
53+
$result = $this->searchForAutocompleting($context, true);
5254
$lastResult = null;
5355

5456
while ($result !== null) {
5557
$lastResult = $result;
56-
$result = $this->seachForAutocompleting($result);
58+
$result = $this->searchForAutocompleting($result);
5759
}
5860

5961
return $lastResult;
6062
}
6163

62-
protected function seachForAutocompleting(AbstractContext $context, $checkCurrent = false)
64+
protected function searchForAutocompleting(AbstractContext $context, $checkCurrent = false)
6365
{
64-
if ($checkCurrent && $context->autocompleting && ($context instanceof MethodCall || $context instanceof ObjectValue)) {
66+
if ($checkCurrent && $context->autocompleting && $context->isAbleToAutocomplete) {
6567
return $context;
6668
}
6769

app/Contexts/MethodCall.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
class MethodCall extends AbstractContext
66
{
7+
public bool $isAbleToAutocomplete = true;
8+
79
public ?string $methodName = null;
810

911
public ?string $className = null;

app/Contexts/ObjectValue.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
class ObjectValue extends AbstractContext
66
{
7+
public bool $isAbleToAutocomplete = true;
8+
79
public ?string $className = null;
810

911
public Arguments $arguments;

app/Parsers/AbstractParser.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,14 @@ public function debug(...$messages)
5555
echo $this->indent($message) . PHP_EOL;
5656
}
5757
}
58+
59+
protected function parentNodeIs(Node $node, array $nodeClasses): bool
60+
{
61+
if ($node->getParent() === null) {
62+
return false;
63+
}
64+
65+
return in_array(get_class($node->getParent()), $nodeClasses)
66+
|| $this->parentNodeIs($node->getParent(), $nodeClasses);
67+
}
5868
}

app/Parsers/ArrayCreationExpressionParser.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
use App\Contexts\ArrayValue;
77
use Microsoft\PhpParser\MissingToken;
88
use Microsoft\PhpParser\Node\Expression\ArrayCreationExpression;
9+
use Microsoft\PhpParser\Node\Expression\CallExpression;
10+
use Microsoft\PhpParser\Node\Expression\ObjectCreationExpression;
911

1012
class ArrayCreationExpressionParser extends AbstractParser
1113
{
@@ -16,6 +18,13 @@ class ArrayCreationExpressionParser extends AbstractParser
1618

1719
public function parse(ArrayCreationExpression $node)
1820
{
21+
// If array is inside a method, for example Validator::validate(['
22+
// then we need to ignore isAbleToAutocomplete for ArrayValue because
23+
// priority is given to App\Contexts\MethodCall or App\Contexts\ObjectValue
24+
if (!$this->parentNodeIs($node, [CallExpression::class, ObjectCreationExpression::class])) {
25+
$this->context->isAbleToAutocomplete = true;
26+
}
27+
1928
$this->context->autocompleting = $node->closeParenOrBracket instanceof MissingToken;
2029

2130
return $this->context;

0 commit comments

Comments
 (0)