1
0
Fork 0

improved param counting

pull/438/head
Ivan Bozhanov 2017-07-15 03:07:53 +03:00
parent b2056c1f87
commit 1c714f98b7
3 changed files with 46 additions and 0 deletions

View File

@ -0,0 +1,15 @@
<?php
class HelpClass5
{
public function method(string $param = "", int $count = 0, bool $test = null)
{
}
public function test()
{
$this->method();
}
}
$a = new HelpClass5;
$a->method("asdf", 123, true);

View File

@ -46,12 +46,14 @@ class SignatureHelpProvider
public function provideSignature(PhpDocument $doc, Position $pos) : SignatureHelp public function provideSignature(PhpDocument $doc, Position $pos) : SignatureHelp
{ {
$node = $doc->getNodeAtPosition($pos); $node = $doc->getNodeAtPosition($pos);
$nodes = [$node];
while ($node && while ($node &&
!($node instanceof ArgumentExpressionList) && !($node instanceof ArgumentExpressionList) &&
!($node instanceof CallExpression) && !($node instanceof CallExpression) &&
$node->parent $node->parent
) { ) {
$node = $node->parent; $node = $node->parent;
$nodes[] = $node;
} }
if (!($node instanceof ArgumentExpressionList) && if (!($node instanceof ArgumentExpressionList) &&
!($node instanceof CallExpression) !($node instanceof CallExpression)
@ -62,6 +64,9 @@ class SignatureHelpProvider
if ($node instanceof ArgumentExpressionList) { if ($node instanceof ArgumentExpressionList) {
$count = 0; $count = 0;
foreach ($node->getElements() as $param) { foreach ($node->getElements() as $param) {
if (in_array($param, $nodes)) {
break;
}
$count ++; $count ++;
} }
while ($node && !($node instanceof CallExpression) && $node->parent) { while ($node && !($node instanceof CallExpression) && $node->parent) {

View File

@ -219,4 +219,30 @@ class SignatureHelpTest extends TestCase
] ]
), $result); ), $result);
} }
public function testMethodActiveParam()
{
$completionUri = pathToUri(__DIR__ . '/../../../fixtures/signature/methodActiveParam.php');
$this->loader->open($completionUri, file_get_contents($completionUri));
$result = $this->textDocument->signatureHelp(
new TextDocumentIdentifier($completionUri),
new Position(14, 21)
)->wait();
$this->assertEquals(new SignatureHelp(
[
new SignatureInformation(
'method(string $param = "", int $count = 0, bool $test = null)',
null,
[
new ParameterInformation('string $param = ""'),
new ParameterInformation('int $count = 0'),
new ParameterInformation('bool $test = null')
]
)
],
0,
1
), $result);
}
} }