WIP resolve return self better
parent
78316545a8
commit
50de9bb28e
|
@ -0,0 +1,11 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
class FooClass {
|
||||||
|
public function foo(): self {
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$fc = new FooClass();
|
||||||
|
$foo = $fc->foo();
|
||||||
|
$foo->
|
|
@ -1,7 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
class FooClass {
|
class FooClass {
|
||||||
public static function staticFoo(): FooClass {
|
public static function staticFoo(): self {
|
||||||
return new FooClass();
|
return new FooClass();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -699,7 +699,7 @@ class DefinitionResolver
|
||||||
foreach ($classDef->getAncestorDefinitions($this->index, true) as $fqn => $def) {
|
foreach ($classDef->getAncestorDefinitions($this->index, true) as $fqn => $def) {
|
||||||
$def = $this->index->getDefinition($fqn . $add);
|
$def = $this->index->getDefinition($fqn . $add);
|
||||||
if ($def !== null) {
|
if ($def !== null) {
|
||||||
if ($def->type instanceof Types\This) {
|
if ($def->type instanceof Types\This || $def->type instanceof Types\Self_) {
|
||||||
return new Types\Object_(new Fqsen('\\' . $classFqn));
|
return new Types\Object_(new Fqsen('\\' . $classFqn));
|
||||||
}
|
}
|
||||||
return $def->type;
|
return $def->type;
|
||||||
|
@ -727,6 +727,9 @@ class DefinitionResolver
|
||||||
if ($def === null) {
|
if ($def === null) {
|
||||||
return new Types\Mixed_;
|
return new Types\Mixed_;
|
||||||
}
|
}
|
||||||
|
if ($def->type instanceof Types\Self_) {
|
||||||
|
return new Types\Object_($classType->getFqsen());
|
||||||
|
}
|
||||||
return $def->type;
|
return $def->type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1060,6 +1063,8 @@ class DefinitionResolver
|
||||||
if ($node->returnType instanceof PhpParser\Token) {
|
if ($node->returnType instanceof PhpParser\Token) {
|
||||||
// Resolve a string like "bool" to a type object
|
// Resolve a string like "bool" to a type object
|
||||||
return $this->typeResolver->resolve($node->returnType->getText($node->getFileContents()));
|
return $this->typeResolver->resolve($node->returnType->getText($node->getFileContents()));
|
||||||
|
} elseif ($node->returnType->getResolvedName() === 'self') {
|
||||||
|
return new Types\Self_();
|
||||||
}
|
}
|
||||||
return new Types\Object_(new Fqsen('\\' . (string)$node->returnType->getResolvedName()));
|
return new Types\Object_(new Fqsen('\\' . (string)$node->returnType->getResolvedName()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -576,6 +576,28 @@ class CompletionTest extends TestCase
|
||||||
], true), $items);
|
], true), $items);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testMethodReturnSelf()
|
||||||
|
{
|
||||||
|
$completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/method_return_self.php');
|
||||||
|
$this->loader->open($completionUri, file_get_contents($completionUri));
|
||||||
|
$items = $this->textDocument->completion(
|
||||||
|
new TextDocumentIdentifier($completionUri),
|
||||||
|
new Position(10, 6)
|
||||||
|
)->wait();
|
||||||
|
$this->assertCompletionsListSubset(new CompletionList([
|
||||||
|
new CompletionItem(
|
||||||
|
'foo',
|
||||||
|
CompletionItemKind::METHOD,
|
||||||
|
'self',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
)
|
||||||
|
], true), $items);
|
||||||
|
}
|
||||||
|
|
||||||
public function testStaticMethodReturnType()
|
public function testStaticMethodReturnType()
|
||||||
{
|
{
|
||||||
$completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/static_method_return_type.php');
|
$completionUri = pathToUri(__DIR__ . '/../../../fixtures/completion/static_method_return_type.php');
|
||||||
|
|
Loading…
Reference in New Issue