200 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			200 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			PHP
		
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								declare(strict_types = 1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace LanguageServer\Tests\Server\TextDocument;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use PHPUnit\Framework\TestCase;
							 | 
						||
| 
								 | 
							
								use LanguageServer\Tests\MockProtocolStream;
							 | 
						||
| 
								 | 
							
								use LanguageServer\{
							 | 
						||
| 
								 | 
							
								    Server, LanguageClient, PhpDocumentLoader, DefinitionResolver
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								use LanguageServer\Index\{Index, ProjectIndex, DependenciesIndex};
							 | 
						||
| 
								 | 
							
								use LanguageServer\ContentRetriever\FileSystemContentRetriever;
							 | 
						||
| 
								 | 
							
								use LanguageServer\Protocol\{
							 | 
						||
| 
								 | 
							
								    TextDocumentIdentifier,
							 | 
						||
| 
								 | 
							
								    TextEdit,
							 | 
						||
| 
								 | 
							
								    Range,
							 | 
						||
| 
								 | 
							
								    Position,
							 | 
						||
| 
								 | 
							
								    SignatureHelp,
							 | 
						||
| 
								 | 
							
								    SignatureInformation,
							 | 
						||
| 
								 | 
							
								    ParameterInformation
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								use function LanguageServer\pathToUri;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class SignatureHelpTest extends TestCase
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @var Server\TextDocument
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    private $textDocument;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @var PhpDocumentLoader
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    private $loader;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function setUp()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $client = new LanguageClient(new MockProtocolStream, new MockProtocolStream);
							 | 
						||
| 
								 | 
							
								        $index = new Index();
							 | 
						||
| 
								 | 
							
								        $projectIndex = new ProjectIndex($index, new DependenciesIndex);
							 | 
						||
| 
								 | 
							
								        $definitionResolver = new DefinitionResolver($projectIndex);
							 | 
						||
| 
								 | 
							
								        $contentRetriever = new FileSystemContentRetriever;
							 | 
						||
| 
								 | 
							
								        $this->loader = new PhpDocumentLoader($contentRetriever, $projectIndex, $definitionResolver);
							 | 
						||
| 
								 | 
							
								        $this->textDocument = new Server\TextDocument($this->loader, $definitionResolver, $client, $projectIndex);
							 | 
						||
| 
								 | 
							
								        $index->setComplete();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @dataProvider signatureHelpProvider
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function testSignatureHelp(Position $position, SignatureHelp $expectedSignature)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $callsUri = pathToUri(__DIR__ . '/../../../fixtures/signature_help/calls.php');
							 | 
						||
| 
								 | 
							
								        $this->loader->open($callsUri, file_get_contents($callsUri));
							 | 
						||
| 
								 | 
							
								        $signatureHelp = $this->textDocument->signatureHelp(
							 | 
						||
| 
								 | 
							
								            new TextDocumentIdentifier($callsUri),
							 | 
						||
| 
								 | 
							
								            $position
							 | 
						||
| 
								 | 
							
								        )->wait();
							 | 
						||
| 
								 | 
							
								        $this->assertEquals($expectedSignature, $signatureHelp);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function signatureHelpProvider(): array
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return [
							 | 
						||
| 
								 | 
							
								            'member call' => [
							 | 
						||
| 
								 | 
							
								                new Position(50, 9),
							 | 
						||
| 
								 | 
							
								                new SignatureHelp(
							 | 
						||
| 
								 | 
							
								                    [
							 | 
						||
| 
								 | 
							
								                        new SignatureInformation(
							 | 
						||
| 
								 | 
							
								                            '(\\Foo\\SomethingElse $a, int|null $b = null)',
							 | 
						||
| 
								 | 
							
								                            [
							 | 
						||
| 
								 | 
							
								                                new ParameterInformation('\\Foo\\SomethingElse $a', 'A param with a different doc type'),
							 | 
						||
| 
								 | 
							
								                                new ParameterInformation('int|null $b = null', 'Param with default value'),
							 | 
						||
| 
								 | 
							
								                            ],
							 | 
						||
| 
								 | 
							
								                            'Function doc'
							 | 
						||
| 
								 | 
							
								                        )
							 | 
						||
| 
								 | 
							
								                    ],
							 | 
						||
| 
								 | 
							
								                    0,
							 | 
						||
| 
								 | 
							
								                    0
							 | 
						||
| 
								 | 
							
								                ),
							 | 
						||
| 
								 | 
							
								            ],
							 | 
						||
| 
								 | 
							
								            'member call 2nd param active' => [
							 | 
						||
| 
								 | 
							
								                new Position(51, 12),
							 | 
						||
| 
								 | 
							
								                new SignatureHelp(
							 | 
						||
| 
								 | 
							
								                    [
							 | 
						||
| 
								 | 
							
								                        new SignatureInformation(
							 | 
						||
| 
								 | 
							
								                            '(\\Foo\\SomethingElse $a, int|null $b = null)',
							 | 
						||
| 
								 | 
							
								                            [
							 | 
						||
| 
								 | 
							
								                                new ParameterInformation('\\Foo\\SomethingElse $a', 'A param with a different doc type'),
							 | 
						||
| 
								 | 
							
								                                new ParameterInformation('int|null $b = null', 'Param with default value'),
							 | 
						||
| 
								 | 
							
								                            ],
							 | 
						||
| 
								 | 
							
								                            'Function doc'
							 | 
						||
| 
								 | 
							
								                        )
							 | 
						||
| 
								 | 
							
								                    ],
							 | 
						||
| 
								 | 
							
								                    0,
							 | 
						||
| 
								 | 
							
								                    1
							 | 
						||
| 
								 | 
							
								                ),
							 | 
						||
| 
								 | 
							
								            ],
							 | 
						||
| 
								 | 
							
								            'member call 2nd param active and closing )' => [
							 | 
						||
| 
								 | 
							
								                new Position(52, 11),
							 | 
						||
| 
								 | 
							
								                new SignatureHelp(
							 | 
						||
| 
								 | 
							
								                    [
							 | 
						||
| 
								 | 
							
								                        new SignatureInformation(
							 | 
						||
| 
								 | 
							
								                            '(\\Foo\\SomethingElse $a, int|null $b = null)',
							 | 
						||
| 
								 | 
							
								                            [
							 | 
						||
| 
								 | 
							
								                                new ParameterInformation('\\Foo\\SomethingElse $a', 'A param with a different doc type'),
							 | 
						||
| 
								 | 
							
								                                new ParameterInformation('int|null $b = null', 'Param with default value'),
							 | 
						||
| 
								 | 
							
								                            ],
							 | 
						||
| 
								 | 
							
								                            'Function doc'
							 | 
						||
| 
								 | 
							
								                        )
							 | 
						||
| 
								 | 
							
								                    ],
							 | 
						||
| 
								 | 
							
								                    0,
							 | 
						||
| 
								 | 
							
								                    1
							 | 
						||
| 
								 | 
							
								                ),
							 | 
						||
| 
								 | 
							
								            ],
							 | 
						||
| 
								 | 
							
								            'method with no params' => [
							 | 
						||
| 
								 | 
							
								                new Position(53, 9),
							 | 
						||
| 
								 | 
							
								                new SignatureHelp([new SignatureInformation('()', [], 'Method with no params', 0, 0)]),
							 | 
						||
| 
								 | 
							
								            ],
							 | 
						||
| 
								 | 
							
								            'constructor' => [
							 | 
						||
| 
								 | 
							
								                new Position(48, 14),
							 | 
						||
| 
								 | 
							
								                new SignatureHelp(
							 | 
						||
| 
								 | 
							
								                    [
							 | 
						||
| 
								 | 
							
								                        new SignatureInformation(
							 | 
						||
| 
								 | 
							
								                            '(string $first, int $second, \Foo\Test $third)',
							 | 
						||
| 
								 | 
							
								                            [
							 | 
						||
| 
								 | 
							
								                                new ParameterInformation('string $first', 'First param'),
							 | 
						||
| 
								 | 
							
								                                new ParameterInformation('int $second', 'Second param'),
							 | 
						||
| 
								 | 
							
								                                new ParameterInformation('\Foo\Test $third', 'Third param with a longer description'),
							 | 
						||
| 
								 | 
							
								                            ],
							 | 
						||
| 
								 | 
							
								                            'Constructor comment goes here'
							 | 
						||
| 
								 | 
							
								                        )
							 | 
						||
| 
								 | 
							
								                    ],
							 | 
						||
| 
								 | 
							
								                    0,
							 | 
						||
| 
								 | 
							
								                    0
							 | 
						||
| 
								 | 
							
								                ),
							 | 
						||
| 
								 | 
							
								            ],
							 | 
						||
| 
								 | 
							
								            'constructor argument expression list' => [
							 | 
						||
| 
								 | 
							
								                new Position(49, 16),
							 | 
						||
| 
								 | 
							
								                new SignatureHelp(
							 | 
						||
| 
								 | 
							
								                    [
							 | 
						||
| 
								 | 
							
								                        new SignatureInformation(
							 | 
						||
| 
								 | 
							
								                            '(string $first, int $second, \Foo\Test $third)',
							 | 
						||
| 
								 | 
							
								                            [
							 | 
						||
| 
								 | 
							
								                                new ParameterInformation('string $first', 'First param'),
							 | 
						||
| 
								 | 
							
								                                new ParameterInformation('int $second', 'Second param'),
							 | 
						||
| 
								 | 
							
								                                new ParameterInformation('\Foo\Test $third', 'Third param with a longer description'),
							 | 
						||
| 
								 | 
							
								                            ],
							 | 
						||
| 
								 | 
							
								                            'Constructor comment goes here'
							 | 
						||
| 
								 | 
							
								                        )
							 | 
						||
| 
								 | 
							
								                    ],
							 | 
						||
| 
								 | 
							
								                    0,
							 | 
						||
| 
								 | 
							
								                    1
							 | 
						||
| 
								 | 
							
								                ),
							 | 
						||
| 
								 | 
							
								            ],
							 | 
						||
| 
								 | 
							
								            'global function' => [
							 | 
						||
| 
								 | 
							
								                new Position(57, 15),
							 | 
						||
| 
								 | 
							
								                new SignatureHelp(
							 | 
						||
| 
								 | 
							
								                    [
							 | 
						||
| 
								 | 
							
								                        new SignatureInformation(
							 | 
						||
| 
								 | 
							
								                            '(int $i, bool $b = false, \Foo\Test|null ...$things = null)',
							 | 
						||
| 
								 | 
							
								                            [
							 | 
						||
| 
								 | 
							
								                                new ParameterInformation('int $i', 'Global function param one'),
							 | 
						||
| 
								 | 
							
								                                new ParameterInformation('bool $b = false', 'Default false param'),
							 | 
						||
| 
								 | 
							
								                                new ParameterInformation('\Foo\Test|null ...$things = null', 'Test things'),
							 | 
						||
| 
								 | 
							
								                            ]
							 | 
						||
| 
								 | 
							
								                        ),
							 | 
						||
| 
								 | 
							
								                    ],
							 | 
						||
| 
								 | 
							
								                    0,
							 | 
						||
| 
								 | 
							
								                    2
							 | 
						||
| 
								 | 
							
								                )
							 | 
						||
| 
								 | 
							
								            ],
							 | 
						||
| 
								 | 
							
								            'static method' => [
							 | 
						||
| 
								 | 
							
								                new Position(60, 10),
							 | 
						||
| 
								 | 
							
								                new SignatureHelp(
							 | 
						||
| 
								 | 
							
								                    [new SignatureInformation('(mixed $a)', [new ParameterInformation('mixed $a')])],
							 | 
						||
| 
								 | 
							
								                    0,
							 | 
						||
| 
								 | 
							
								                    0
							 | 
						||
| 
								 | 
							
								                ),
							 | 
						||
| 
								 | 
							
								            ],
							 | 
						||
| 
								 | 
							
								            'no signature help' => [
							 | 
						||
| 
								 | 
							
								                new Position(0, 0),
							 | 
						||
| 
								 | 
							
								                new SignatureHelp([]),
							 | 
						||
| 
								 | 
							
								            ],
							 | 
						||
| 
								 | 
							
								            'construct from non fqn (not supported)' => [
							 | 
						||
| 
								 | 
							
								                new Position(62, 9),
							 | 
						||
| 
								 | 
							
								                new SignatureHelp([]),
							 | 
						||
| 
								 | 
							
								            ],
							 | 
						||
| 
								 | 
							
								            'construct from non fqn (not supported) argument expression' => [
							 | 
						||
| 
								 | 
							
								                new Position(63, 11),
							 | 
						||
| 
								 | 
							
								                new SignatureHelp([]),
							 | 
						||
| 
								 | 
							
								            ],
							 | 
						||
| 
								 | 
							
								            'invalid var' => [
							 | 
						||
| 
								 | 
							
								                new Position(65, 13),
							 | 
						||
| 
								 | 
							
								                new SignatureHelp([]),
							 | 
						||
| 
								 | 
							
								            ],
							 | 
						||
| 
								 | 
							
								        ];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |