diff --git a/src/DefinitionResolver.php b/src/DefinitionResolver.php index f36588d..07a30a9 100644 --- a/src/DefinitionResolver.php +++ b/src/DefinitionResolver.php @@ -587,6 +587,7 @@ class DefinitionResolver if ($n instanceof Node\Statement\ExpressionStatement) { $n = $n->expression; } + if ( // TODO - clean this up ($n instanceof Node\Expression\AssignmentExpression && $n->operator->kind === PhpParser\TokenKind::EqualsToken) @@ -594,6 +595,14 @@ class DefinitionResolver ) { return $n; } + + // get variables from foreach statements + if ( + ($n instanceof Node\ForeachValue || $n instanceof Node\ForeachKey) && + $n->expression->getName() === $name + ) { + return $n; + } } } while (isset($n) && $n = $n->parent); // Return null if nothing was found @@ -1026,6 +1035,11 @@ class DefinitionResolver return $this->resolveExpressionNodeToType($node->argumentExpressionList->children[2]->expression); } + // FOREACH KEY VARIABLE + if ($node instanceof Node\ForeachKey) { + return new Types\Integer; + } + // PARAMETERS // Get the type of the parameter: // 1. Doc block diff --git a/src/Protocol/SymbolInformation.php b/src/Protocol/SymbolInformation.php index 6b4d39e..0ac8973 100644 --- a/src/Protocol/SymbolInformation.php +++ b/src/Protocol/SymbolInformation.php @@ -83,6 +83,8 @@ class SymbolInformation ) || $node instanceof Node\UseVariableName || $node instanceof Node\Parameter + || $node instanceof Node\ForeachValue + || $node instanceof Node\ForeachKey ) { $symbol->kind = SymbolKind::VARIABLE; } else { @@ -103,6 +105,8 @@ class SymbolInformation } else { $symbol->name = ltrim((string)$node->name->getText($node->getFileContents()), "$"); } + } else if ($node instanceof Node\ForeachValue || $node instanceof Node\ForeachKey) { + $symbol->name = $node->expression->getName(); } else if (isset($node->variableName)) { $symbol->name = $node->variableName->getText($node); } else if (!isset($symbol->name)) { diff --git a/src/Server/TextDocument.php b/src/Server/TextDocument.php index 371ad36..faeb685 100644 --- a/src/Server/TextDocument.php +++ b/src/Server/TextDocument.php @@ -312,6 +312,8 @@ class TextDocument public function hover(TextDocumentIdentifier $textDocument, Position $position): Promise { return coroutine(function () use ($textDocument, $position) { + $contents = []; + $document = yield $this->documentLoader->getOrLoad($textDocument->uri); // Find the node under the cursor $node = $document->getNodeAtPosition($position); diff --git a/tests/DefinitionResolverTest.php b/tests/DefinitionResolverTest.php index 0397e71..0ccb42e 100644 --- a/tests/DefinitionResolverTest.php +++ b/tests/DefinitionResolverTest.php @@ -62,4 +62,19 @@ class DefinitionResolverTest extends TestCase $this->assertEquals('TEST_DEFINE', $fqn); } + + public function testGetVaribleFromForeachValue() + { + $parser = new PhpParser\Parser; + $doc = new MockPhpDocument; + $sourceFileNode = $parser->parseSourceFile("getUri()); + + $index = new Index; + + $definitionResolver = new DefinitionResolver($index); + $testValueVariable = $sourceFileNode->statementList[1]->statements->statements[0]->expression->expressions->children[0]; + $fqn = $definitionResolver->resolveVariableToNode($testValueVariable); + + $this->assertInstanceOf(PhpParser\Node\ForeachValue::class, $fqn); + } }