diff --git a/fixtures/global_symbols.php b/fixtures/global_symbols.php index 63d6abf..395b49c 100644 --- a/fixtures/global_symbols.php +++ b/fixtures/global_symbols.php @@ -119,4 +119,8 @@ class Something { public function hello() { echo 'Hi!'; } -} \ No newline at end of file + + public function selfParamTest(self $something) { + $something->hello(); + } +} diff --git a/src/DefinitionResolver.php b/src/DefinitionResolver.php index ebcebcf..bf04c9d 100644 --- a/src/DefinitionResolver.php +++ b/src/DefinitionResolver.php @@ -747,7 +747,7 @@ class DefinitionResolver $type = $this->typeResolver->resolve($node->type); } else if ($node->type instanceof Node\Name && strtolower((string)$node->type) === 'self') { // handle self reference - $class = getClosestNode($node, Node\Stmt\Class_::class); + $class = getClosestNode($node->type, Node\Stmt\Class_::class); if ($class !== null) { return new Types\Object_(new Fqsen('\\' . $class->name)); } diff --git a/tests/Server/ServerTestCase.php b/tests/Server/ServerTestCase.php index 61507be..4eb5752 100644 --- a/tests/Server/ServerTestCase.php +++ b/tests/Server/ServerTestCase.php @@ -85,9 +85,10 @@ abstract class ServerTestCase extends TestCase 'TestClass::testMethod()' => new Location($globalSymbolsUri, new Range(new Position(57, 4), new Position(60, 5))), 'test_function()' => new Location($globalSymbolsUri, new Range(new Position(78, 0), new Position(81, 1))), 'whatever()' => new Location($globalReferencesUri, new Range(new Position(21, 0), new Position(23, 1))), - 'Something' => new Location($globalSymbolsUri, new Range(new Position(109, 0), new Position(121, 1))), + 'Something' => new Location($globalSymbolsUri, new Range(new Position(109, 0), new Position(125, 1))), 'Something::getInstance()' => new Location($globalSymbolsUri, new Range(new Position(111, 4), new Position(113, 5))), 'Something::hello()' => new Location($globalSymbolsUri, new Range(new Position(118, 4), new Position(120, 5))), + 'Something::selfParamTest()' => new Location($globalSymbolsUri, new Range(new Position(122, 4), new Position(124, 5))), // Namespaced 'TestNamespace' => new Location($symbolsUri, new Range(new Position( 2, 10), new Position( 2, 23))), @@ -219,7 +220,8 @@ abstract class ServerTestCase extends TestCase 1 => new Location($globalReferencesUri, new Range(new Position(31, 13), new Position(31, 40))) ], 'Something' => [ - 0 => new Location($globalReferencesUri, new Range(new Position(45, 0), new Position(56, 9))) // Something::getInstance()->hello() + 0 => new Location($globalReferencesUri, new Range(new Position(45, 0), new Position(56, 9))), // Something::getInstance()->hello() + 1 => new Location($globalSymbolsUri, new Range(new Position(123, 8), new Position(123, 18))) // $something->hello(); ], 'Something::getInstance()' => [ 0 => new Location($globalReferencesUri, new Range(new Position(45, 0), new Position(45, 24))) // Something::getInstance()->hello() diff --git a/tests/Server/TextDocument/HoverTest.php b/tests/Server/TextDocument/HoverTest.php index 7b4925c..0b32e38 100644 --- a/tests/Server/TextDocument/HoverTest.php +++ b/tests/Server/TextDocument/HoverTest.php @@ -46,6 +46,20 @@ class HoverTest extends ServerTestCase ], $reference->range), $result); } + public function testHoverForSelfParamTypeDefinition() + { + // class Something + // get hover for Something::getInstance() (returns a instance of Something) + $reference = $this->getReferenceLocations('Something')[1]; + $result = $this->textDocument->hover( + new TextDocumentIdentifier($reference->uri), + $reference->range->end + )->wait(); + $this->assertEquals(new Hover([ + new MarkedString('php', "range), $result); + } + public function testHoverForClassLikeDefinition() { // class TestClass implements TestInterface diff --git a/tests/Server/Workspace/SymbolTest.php b/tests/Server/Workspace/SymbolTest.php index 209e569..3ef4300 100644 --- a/tests/Server/Workspace/SymbolTest.php +++ b/tests/Server/Workspace/SymbolTest.php @@ -62,6 +62,7 @@ class SymbolTest extends ServerTestCase new SymbolInformation('Something', SymbolKind::CLASS_, $this->getDefinitionLocation('Something'), ''), new SymbolInformation('getInstance', SymbolKind::METHOD, $this->getDefinitionLocation('Something::getInstance()'), 'Something'), new SymbolInformation('hello', SymbolKind::METHOD, $this->getDefinitionLocation('Something::hello()'), 'Something'), + new SymbolInformation('selfParamTest', SymbolKind::METHOD, $this->getDefinitionLocation('Something::selfParamTest()'), 'Something'), new SymbolInformation('whatever', SymbolKind::FUNCTION, $this->getDefinitionLocation('whatever()'), ''), new SymbolInformation('SecondTestNamespace', SymbolKind::NAMESPACE, $this->getDefinitionLocation('SecondTestNamespace'), '')