1
0
Fork 0

fix tests

pull/746/head
Robert Lu 2019-06-18 16:59:40 +08:00
parent 60ed930a50
commit a5433b211a
24 changed files with 2013 additions and 1770 deletions

View File

@ -1,43 +1,48 @@
<?php <?php
declare(strict_types = 1); declare(strict_types=1);
namespace LanguageServer\Tests; namespace LanguageServer\Tests;
use PHPUnit\Framework\TestCase;
use LanguageServer\ClientHandler;
use LanguageServer\Message;
use AdvancedJsonRpc; use AdvancedJsonRpc;
use Sabre\Event\Loop; use Amp\Loop;
use LanguageServer\ClientHandler;
use LanguageServer\Event\MessageEvent;
use LanguageServer\Message;
use PHPUnit\Framework\TestCase;
class ClientHandlerTest extends TestCase class ClientHandlerTest extends TestCase
{ {
public function testRequest() public function testRequest()
{ {
$reader = new MockProtocolStream; Loop::run(function () {
$writer = new MockProtocolStream; $reader = new MockProtocolStream;
$handler = new ClientHandler($reader, $writer); $writer = new MockProtocolStream;
$writer->once('message', function (Message $msg) use ($reader) { $handler = new ClientHandler($reader, $writer);
// Respond to request $writer->addOneTimeListener('message', function (MessageEvent $messageEvent) use ($reader) {
Loop\setTimeout(function () use ($reader, $msg) { $msg = $messageEvent->getMessage();
$reader->write(new Message(new AdvancedJsonRpc\SuccessResponse($msg->body->id, 'pong'))); // Respond to request
}, 0); Loop::defer(function () use ($reader, $msg) {
}); yield from $reader->write(new Message(new AdvancedJsonRpc\SuccessResponse($msg->body->id, 'pong')));
$handler->request('testMethod', ['ping'])->then(function ($result) { });
});
$result = yield from $handler->request('testMethod', ['ping']);
$this->assertEquals('pong', $result); $this->assertEquals('pong', $result);
})->wait(); // No event listeners
// No event listeners $this->assertEquals([], $reader->getListeners('message'));
$this->assertEquals([], $reader->listeners('message')); $this->assertEquals([], $writer->getListeners('message'));
$this->assertEquals([], $writer->listeners('message')); });
} }
public function testNotify() public function testNotify()
{ {
$reader = new MockProtocolStream; Loop::run(function () {
$writer = new MockProtocolStream; $reader = new MockProtocolStream;
$handler = new ClientHandler($reader, $writer); $writer = new MockProtocolStream;
$handler->notify('testMethod', ['ping'])->wait(); $handler = new ClientHandler($reader, $writer);
// No event listeners yield from $handler->notify('testMethod', ['ping']);
$this->assertEquals([], $reader->listeners('message')); // No event listeners
$this->assertEquals([], $writer->listeners('message')); $this->assertEquals([], $reader->getListeners('message'));
$this->assertEquals([], $writer->getListeners('message'));
});
} }
} }

View File

@ -1,122 +1,132 @@
<?php <?php
declare(strict_types = 1); declare(strict_types=1);
namespace LanguageServer\Tests; namespace LanguageServer\Tests;
use PHPUnit\Framework\TestCase; use AdvancedJsonRpc;
use Amp\Deferred;
use Amp\Loop;
use Exception;
use LanguageServer\Event\MessageEvent;
use LanguageServer\LanguageServer; use LanguageServer\LanguageServer;
use LanguageServer\Message; use LanguageServer\Message;
use LanguageServerProtocol\{ use LanguageServerProtocol\{ClientCapabilities,
ClientCapabilities,
TextDocumentSyncKind,
MessageType,
TextDocumentItem,
TextDocumentIdentifier,
InitializeResult,
ServerCapabilities,
CompletionOptions, CompletionOptions,
SignatureHelpOptions InitializeResult,
}; MessageType,
use AdvancedJsonRpc; ServerCapabilities,
SignatureHelpOptions,
TextDocumentIdentifier,
TextDocumentItem,
TextDocumentSyncKind};
use PHPUnit\Framework\TestCase;
use Webmozart\Glob\Glob; use Webmozart\Glob\Glob;
use Webmozart\PathUtil\Path; use Webmozart\PathUtil\Path;
use Sabre\Event\Promise;
use Exception;
use function LanguageServer\pathToUri; use function LanguageServer\pathToUri;
class LanguageServerTest extends TestCase class LanguageServerTest extends TestCase
{ {
public function testInitialize() public function testInitialize()
{ {
$server = new LanguageServer(new MockProtocolStream, new MockProtocolStream); Loop::run(function () {
$result = $server->initialize(new ClientCapabilities, __DIR__, getmypid())->wait(); $server = new LanguageServer(new MockProtocolStream, new MockProtocolStream);
$result = yield $server->initialize(new ClientCapabilities, __DIR__, getmypid());
$serverCapabilities = new ServerCapabilities(); $serverCapabilities = new ServerCapabilities();
$serverCapabilities->textDocumentSync = TextDocumentSyncKind::FULL; $serverCapabilities->textDocumentSync = TextDocumentSyncKind::FULL;
$serverCapabilities->documentSymbolProvider = true; $serverCapabilities->documentSymbolProvider = true;
$serverCapabilities->workspaceSymbolProvider = true; $serverCapabilities->workspaceSymbolProvider = true;
$serverCapabilities->definitionProvider = true; $serverCapabilities->definitionProvider = true;
$serverCapabilities->referencesProvider = true; $serverCapabilities->referencesProvider = true;
$serverCapabilities->hoverProvider = true; $serverCapabilities->hoverProvider = true;
$serverCapabilities->completionProvider = new CompletionOptions; $serverCapabilities->completionProvider = new CompletionOptions;
$serverCapabilities->completionProvider->resolveProvider = false; $serverCapabilities->completionProvider->resolveProvider = false;
$serverCapabilities->completionProvider->triggerCharacters = ['$', '>']; $serverCapabilities->completionProvider->triggerCharacters = ['$', '>'];
$serverCapabilities->signatureHelpProvider = new SignatureHelpOptions; $serverCapabilities->signatureHelpProvider = new SignatureHelpOptions;
$serverCapabilities->signatureHelpProvider->triggerCharacters = ['(', ',']; $serverCapabilities->signatureHelpProvider->triggerCharacters = ['(', ','];
$serverCapabilities->xworkspaceReferencesProvider = true; $serverCapabilities->xworkspaceReferencesProvider = true;
$serverCapabilities->xdefinitionProvider = true; $serverCapabilities->xdefinitionProvider = true;
$serverCapabilities->xdependenciesProvider = true; $serverCapabilities->xdependenciesProvider = true;
$this->assertEquals(new InitializeResult($serverCapabilities), $result); $this->assertEquals(new InitializeResult($serverCapabilities), $result);
});
} }
public function testIndexingWithDirectFileAccess() public function testIndexingWithDirectFileAccess()
{ {
$promise = new Promise; Loop::run(function () {
$input = new MockProtocolStream; $deferred = new Deferred();
$output = new MockProtocolStream; $input = new MockProtocolStream;
$output->on('message', function (Message $msg) use ($promise) { $output = new MockProtocolStream;
if ($msg->body->method === 'window/logMessage' && $promise->state === Promise::PENDING) { $output->addListener('message', function (MessageEvent $messageEvent) use ($deferred) {
if ($msg->body->params->type === MessageType::ERROR) { $msg = $messageEvent->getMessage();
$promise->reject(new Exception($msg->body->params->message)); Loop::defer(function () use ($deferred, $msg) {
} else if (preg_match('/All \d+ PHP files parsed/', $msg->body->params->message)) { if ($msg->body->method === 'window/logMessage') {
$promise->fulfill(); if ($msg->body->params->type === MessageType::ERROR) {
} $deferred->fail(new Exception($msg->body->params->message));
} } else if (preg_match('/All \d+ PHP files parsed/', $msg->body->params->message)) {
$deferred->resolve(true);
}
}
});
});
$server = new LanguageServer($input, $output);
$capabilities = new ClientCapabilities;
yield $server->initialize($capabilities, realpath(__DIR__ . '/../fixtures'), getmypid());
$this->assertTrue(yield $deferred->promise());
}); });
$server = new LanguageServer($input, $output);
$capabilities = new ClientCapabilities;
$server->initialize($capabilities, realpath(__DIR__ . '/../fixtures'), getmypid());
$promise->wait();
} }
public function testIndexingWithFilesAndContentRequests() public function testIndexingWithFilesAndContentRequests()
{ {
$promise = new Promise; Loop::run(function () {
$filesCalled = false; $deferred = new Deferred();
$contentCalled = false; $filesCalled = false;
$rootPath = realpath(__DIR__ . '/../fixtures'); $contentCalled = false;
$input = new MockProtocolStream; $rootPath = realpath(__DIR__ . '/../fixtures');
$output = new MockProtocolStream; $input = new MockProtocolStream;
$run = 1; $output = new MockProtocolStream;
$output->on('message', function (Message $msg) use ($promise, $input, $rootPath, &$filesCalled, &$contentCalled, &$run) { $run = 1;
if ($msg->body->method === 'textDocument/xcontent') { $output->addListener('message', function (MessageEvent $messageEvent) use ($deferred, $input, $rootPath, &$filesCalled, &$contentCalled, &$run) {
// Document content requested $msg = $messageEvent->getMessage();
$contentCalled = true; Loop::defer(function () use ($msg, $deferred, $input, $rootPath, &$filesCalled, &$contentCalled, &$run) {
$textDocumentItem = new TextDocumentItem; if ($msg->body->method === 'textDocument/xcontent') {
$textDocumentItem->uri = $msg->body->params->textDocument->uri; // Document content requested
$textDocumentItem->version = 1; $contentCalled = true;
$textDocumentItem->languageId = 'php'; $textDocumentItem = new TextDocumentItem;
$textDocumentItem->text = file_get_contents($msg->body->params->textDocument->uri); $textDocumentItem->uri = $msg->body->params->textDocument->uri;
$input->write(new Message(new AdvancedJsonRpc\SuccessResponse($msg->body->id, $textDocumentItem))); $textDocumentItem->version = 1;
} else if ($msg->body->method === 'workspace/xfiles') { $textDocumentItem->languageId = 'php';
// Files requested $textDocumentItem->text = file_get_contents($msg->body->params->textDocument->uri);
$filesCalled = true; yield from $input->write(new Message(new AdvancedJsonRpc\SuccessResponse($msg->body->id, $textDocumentItem)));
$pattern = Path::makeAbsolute('**/*.php', $msg->body->params->base ?? $rootPath); } else if ($msg->body->method === 'workspace/xfiles') {
$files = []; // Files requested
foreach (Glob::glob($pattern) as $path) { $filesCalled = true;
$files[] = new TextDocumentIdentifier(pathToUri($path)); $pattern = Path::makeAbsolute('**/*.php', $msg->body->params->base ?? $rootPath);
} $files = [];
$input->write(new Message(new AdvancedJsonRpc\SuccessResponse($msg->body->id, $files))); foreach (Glob::glob($pattern) as $path) {
} else if ($msg->body->method === 'window/logMessage') { $files[] = new TextDocumentIdentifier(pathToUri($path));
// Message logged }
if ($msg->body->params->type === MessageType::ERROR) { yield from $input->write(new Message(new AdvancedJsonRpc\SuccessResponse($msg->body->id, $files)));
// Error happened during indexing, fail test } else if ($msg->body->method === 'window/logMessage') {
if ($promise->state === Promise::PENDING) { // Message logged
$promise->reject(new Exception($msg->body->params->message)); if ($msg->body->params->type === MessageType::ERROR) {
// Error happened during indexing, fail test
$deferred->fail(new Exception($msg->body->params->message));
} else if (preg_match('/All \d+ PHP files parsed/', $msg->body->params->message)) {
$deferred->resolve(true);
}
} }
} else if (preg_match('/All \d+ PHP files parsed/', $msg->body->params->message)) { });
$promise->fulfill(); });
} $server = new LanguageServer($input, $output);
} $capabilities = new ClientCapabilities;
$capabilities->xfilesProvider = true;
$capabilities->xcontentProvider = true;
yield $server->initialize($capabilities, $rootPath, getmypid());
yield $deferred->promise();
$this->assertTrue($filesCalled);
$this->assertTrue($contentCalled);
}); });
$server = new LanguageServer($input, $output);
$capabilities = new ClientCapabilities;
$capabilities->xfilesProvider = true;
$capabilities->xcontentProvider = true;
$server->initialize($capabilities, $rootPath, getmypid());
$promise->wait();
$this->assertTrue($filesCalled);
$this->assertTrue($contentCalled);
} }
} }

View File

@ -1,11 +1,15 @@
<?php <?php
declare(strict_types = 1); declare(strict_types=1);
namespace LanguageServer\Tests; namespace LanguageServer\Tests;
use LanguageServer\{ProtocolReader, ProtocolWriter}; use Amp\Deferred;
use Amp\Delayed;
use Amp\Loop;
use LanguageServer\{Event\MessageEvent, ProtocolReader, ProtocolWriter};
use LanguageServer\Message; use LanguageServer\Message;
use Sabre\Event\{Loop, Emitter, Promise}; use League\Event\Emitter;
use League\Event\Event;
/** /**
* A fake duplex protocol stream * A fake duplex protocol stream
@ -18,11 +22,11 @@ class MockProtocolStream extends Emitter implements ProtocolReader, ProtocolWrit
* @param Message $msg * @param Message $msg
* @return void * @return void
*/ */
public function write(Message $msg): Promise public function write(Message $msg): \Generator
{ {
Loop\nextTick(function () use ($msg) { Loop::defer(function () use ($msg) {
$this->emit('message', [Message::parse((string)$msg)]); $this->emit(new MessageEvent('message', Message::parse((string)$msg)));
}); });
return Promise\resolve(null); yield new Delayed(0);
} }
} }

View File

@ -1,8 +1,9 @@
<?php <?php
declare(strict_types = 1); declare(strict_types=1);
namespace LanguageServer\Tests\Server; namespace LanguageServer\Tests\Server;
use Amp\Loop;
use LanguageServer\{ use LanguageServer\{
PhpDocument, PhpDocumentLoader, Project, DefinitionResolver PhpDocument, PhpDocumentLoader, Project, DefinitionResolver
}; };
@ -32,10 +33,12 @@ class PhpDocumentLoaderTest extends TestCase
public function testGetOrLoadLoadsDocument() public function testGetOrLoadLoadsDocument()
{ {
$document = $this->loader->getOrLoad(pathToUri(__FILE__))->wait(); Loop::run(function () {
$document = yield from $this->loader->getOrLoad(pathToUri(__FILE__));
$this->assertNotNull($document); $this->assertNotNull($document);
$this->assertInstanceOf(PhpDocument::class, $document); $this->assertInstanceOf(PhpDocument::class, $document);
});
} }
public function testGetReturnsOpenedInstance() public function testGetReturnsOpenedInstance()

View File

@ -1,32 +1,49 @@
<?php <?php
declare(strict_types = 1); declare(strict_types=1);
namespace LanguageServer\Tests; namespace LanguageServer\Tests;
use PHPUnit\Framework\TestCase; use AdvancedJsonRpc\{Request as RequestBody};
use LanguageServer\{LanguageServer, ProtocolStreamReader, ProtocolStreamWriter}; use Amp\ByteStream\ResourceInputStream;
use Amp\ByteStream\ResourceOutputStream;
use Amp\Deferred;
use Amp\Loop;
use LanguageServer\{Event\MessageEvent, ProtocolStreamReader};
use LanguageServer\Message; use LanguageServer\Message;
use AdvancedJsonRpc\{Request as RequestBody, Response as ResponseBody}; use PHPUnit\Framework\TestCase;
use Sabre\Event\Loop;
class ProtocolStreamReaderTest extends TestCase class ProtocolStreamReaderTest extends TestCase
{ {
public function getStreamPair()
{
$domain = \stripos(PHP_OS, "win") === 0 ? STREAM_PF_INET : STREAM_PF_UNIX;
list($left, $right) = @\stream_socket_pair($domain, \STREAM_SOCK_STREAM, \STREAM_IPPROTO_IP);
$a = new ResourceOutputStream($left);
$b = new ResourceInputStream($right);
return [$a, $b];
}
public function testParsingWorksAndListenerIsCalled() public function testParsingWorksAndListenerIsCalled()
{ {
$tmpfile = tempnam('', ''); Loop::run(function () {
$writeHandle = fopen($tmpfile, 'w'); /** @var ResourceOutputStream $outputStream */
$reader = new ProtocolStreamReader(fopen($tmpfile, 'r')); /** @var ResourceInputStream $inputStream */
$msg = null; list($outputStream, $inputStream) = $this->getStreamPair();
$reader->on('message', function (Message $message) use (&$msg) {
$msg = $message; $reader = new ProtocolStreamReader($inputStream);
$deferred = new Deferred();
$reader->addListener('message', function (MessageEvent $messageEvent) use (&$deferred) {
$deferred->resolve($messageEvent->getMessage());
});
yield $outputStream->write((string)new Message(new RequestBody(1, 'aMethod', ['arg' => 'Hello World'])));
$msg = yield $deferred->promise();
$this->assertNotNull($msg);
$this->assertInstanceOf(Message::class, $msg);
$this->assertInstanceOf(RequestBody::class, $msg->body);
$this->assertEquals(1, $msg->body->id);
$this->assertEquals('aMethod', $msg->body->method);
$this->assertEquals((object)['arg' => 'Hello World'], $msg->body->params);
}); });
$ret = fwrite($writeHandle, (string)new Message(new RequestBody(1, 'aMethod', ['arg' => 'Hello World'])));
Loop\tick();
$this->assertNotNull($msg);
$this->assertInstanceOf(Message::class, $msg);
$this->assertInstanceOf(RequestBody::class, $msg->body);
$this->assertEquals(1, $msg->body->id);
$this->assertEquals('aMethod', $msg->body->method);
$this->assertEquals((object)['arg' => 'Hello World'], $msg->body->params);
} }
} }

View File

@ -1,35 +0,0 @@
<?php
declare(strict_types = 1);
namespace LanguageServer\Tests;
use PHPUnit\Framework\TestCase;
use LanguageServer\ProtocolStreamWriter;
use LanguageServer\Message;
use AdvancedJsonRpc\{Request as RequestBody};
use Sabre\Event\Loop;
class ProtocolStreamWriterTest extends TestCase
{
public function testLargeMessageIsSent()
{
$tmpfile = tempnam('', '');
$writeHandle = fopen($tmpfile, 'w');
stream_set_blocking($writeHandle, false);
$writer = new ProtocolStreamWriter($writeHandle);
$msg = new Message(new RequestBody(1, 'aMethod', ['arg' => str_repeat('X', 100000)]));
$msgString = (string)$msg;
$promise = $writer->write($msg);
Loop\tick();
$promise->wait();
fclose($writeHandle);
$this->assertEquals(strlen($msgString), filesize($tmpfile));
}
}

View File

@ -1,8 +1,9 @@
<?php <?php
declare(strict_types = 1); declare(strict_types=1);
namespace LanguageServer\Tests\Server; namespace LanguageServer\Tests\Server;
use Amp\Loop;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use LanguageServer\Tests\MockProtocolStream; use LanguageServer\Tests\MockProtocolStream;
use LanguageServer\{ use LanguageServer\{
@ -46,185 +47,187 @@ abstract class ServerTestCase extends TestCase
public function setUp() public function setUp()
{ {
$sourceIndex = new Index; Loop::run(function () {
$dependenciesIndex = new DependenciesIndex; $sourceIndex = new Index;
$projectIndex = new ProjectIndex($sourceIndex, $dependenciesIndex); $dependenciesIndex = new DependenciesIndex;
$projectIndex->setComplete(); $projectIndex = new ProjectIndex($sourceIndex, $dependenciesIndex);
$projectIndex->setComplete();
$definitionResolver = new DefinitionResolver($projectIndex); $definitionResolver = new DefinitionResolver($projectIndex);
$client = new LanguageClient(new MockProtocolStream, new MockProtocolStream); $client = new LanguageClient(new MockProtocolStream, new MockProtocolStream);
$this->documentLoader = new PhpDocumentLoader(new FileSystemContentRetriever, $projectIndex, $definitionResolver); $this->documentLoader = new PhpDocumentLoader(new FileSystemContentRetriever, $projectIndex, $definitionResolver);
$this->textDocument = new Server\TextDocument($this->documentLoader, $definitionResolver, $client, $projectIndex); $this->textDocument = new Server\TextDocument($this->documentLoader, $definitionResolver, $client, $projectIndex);
$this->workspace = new Server\Workspace($client, $projectIndex, $dependenciesIndex, $sourceIndex, null, $this->documentLoader); $this->workspace = new Server\Workspace($client, $projectIndex, $dependenciesIndex, $sourceIndex, null, $this->documentLoader);
$globalSymbolsUri = pathToUri(realpath(__DIR__ . '/../../fixtures/global_symbols.php')); $globalSymbolsUri = pathToUri(realpath(__DIR__ . '/../../fixtures/global_symbols.php'));
$globalReferencesUri = pathToUri(realpath(__DIR__ . '/../../fixtures/global_references.php')); $globalReferencesUri = pathToUri(realpath(__DIR__ . '/../../fixtures/global_references.php'));
$symbolsUri = pathToUri(realpath(__DIR__ . '/../../fixtures/symbols.php')); $symbolsUri = pathToUri(realpath(__DIR__ . '/../../fixtures/symbols.php'));
$referencesUri = pathToUri(realpath(__DIR__ . '/../../fixtures/references.php')); $referencesUri = pathToUri(realpath(__DIR__ . '/../../fixtures/references.php'));
$useUri = pathToUri(realpath(__DIR__ . '/../../fixtures/use.php')); $useUri = pathToUri(realpath(__DIR__ . '/../../fixtures/use.php'));
$this->documentLoader->load($symbolsUri)->wait(); yield from $this->documentLoader->load($symbolsUri);
$this->documentLoader->load($referencesUri)->wait(); yield from $this->documentLoader->load($referencesUri);
$this->documentLoader->load($globalSymbolsUri)->wait(); yield from $this->documentLoader->load($globalSymbolsUri);
$this->documentLoader->load($globalReferencesUri)->wait(); yield from $this->documentLoader->load($globalReferencesUri);
$this->documentLoader->load($useUri)->wait(); yield from $this->documentLoader->load($useUri);
// @codingStandardsIgnoreStart // @codingStandardsIgnoreStart
$this->definitionLocations = [ $this->definitionLocations = [
// Global // Global
'TEST_DEFINE_CONSTANT' => new Location($globalSymbolsUri, new Range(new Position(104, 0), new Position(104, 37))), 'TEST_DEFINE_CONSTANT' => new Location($globalSymbolsUri, new Range(new Position(104, 0), new Position(104, 37))),
'TEST_CONST' => new Location($globalSymbolsUri, new Range(new Position( 9, 6), new Position( 9, 22))), 'TEST_CONST' => new Location($globalSymbolsUri, new Range(new Position(9, 6), new Position(9, 22))),
'TestClass' => new Location($globalSymbolsUri, new Range(new Position(20, 0), new Position(61, 1))), 'TestClass' => new Location($globalSymbolsUri, new Range(new Position(20, 0), new Position(61, 1))),
'ChildClass' => new Location($globalSymbolsUri, new Range(new Position(99, 0), new Position(99, 37))), 'ChildClass' => new Location($globalSymbolsUri, new Range(new Position(99, 0), new Position(99, 37))),
'TestTrait' => new Location($globalSymbolsUri, new Range(new Position(63, 0), new Position(66, 1))), 'TestTrait' => new Location($globalSymbolsUri, new Range(new Position(63, 0), new Position(66, 1))),
'TestInterface' => new Location($globalSymbolsUri, new Range(new Position(68, 0), new Position(71, 1))), 'TestInterface' => new Location($globalSymbolsUri, new Range(new Position(68, 0), new Position(71, 1))),
'TestClass::TEST_CLASS_CONST' => new Location($globalSymbolsUri, new Range(new Position(27, 10), new Position(27, 32))), 'TestClass::TEST_CLASS_CONST' => new Location($globalSymbolsUri, new Range(new Position(27, 10), new Position(27, 32))),
'TestClass::testProperty' => new Location($globalSymbolsUri, new Range(new Position(41, 11), new Position(41, 24))), 'TestClass::testProperty' => new Location($globalSymbolsUri, new Range(new Position(41, 11), new Position(41, 24))),
'TestClass::staticTestProperty' => new Location($globalSymbolsUri, new Range(new Position(34, 18), new Position(34, 37))), 'TestClass::staticTestProperty' => new Location($globalSymbolsUri, new Range(new Position(34, 18), new Position(34, 37))),
'TestClass::staticTestMethod()' => new Location($globalSymbolsUri, new Range(new Position(46, 4), new Position(49, 5))), 'TestClass::staticTestMethod()' => new Location($globalSymbolsUri, new Range(new Position(46, 4), new Position(49, 5))),
'TestClass::testMethod()' => new Location($globalSymbolsUri, new Range(new Position(57, 4), new Position(60, 5))), '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))), 'test_function()' => new Location($globalSymbolsUri, new Range(new Position(78, 0), new Position(81, 1))),
'UnusedClass' => new Location($globalSymbolsUri, new Range(new Position(111, 0), new Position(118, 1))), 'UnusedClass' => new Location($globalSymbolsUri, new Range(new Position(111, 0), new Position(118, 1))),
'UnusedClass::unusedProperty' => new Location($globalSymbolsUri, new Range(new Position(113,11), new Position(113, 26))), 'UnusedClass::unusedProperty' => new Location($globalSymbolsUri, new Range(new Position(113, 11), new Position(113, 26))),
'UnusedClass::unusedMethod' => new Location($globalSymbolsUri, new Range(new Position(115, 4), new Position(117, 5))), 'UnusedClass::unusedMethod' => new Location($globalSymbolsUri, new Range(new Position(115, 4), new Position(117, 5))),
'whatever()' => new Location($globalReferencesUri, new Range(new Position(21, 0), new Position(23, 1))), 'whatever()' => new Location($globalReferencesUri, new Range(new Position(21, 0), new Position(23, 1))),
// Namespaced // Namespaced
'TestNamespace' => new Location($symbolsUri, new Range(new Position( 2, 0), new Position( 2, 24))), 'TestNamespace' => new Location($symbolsUri, new Range(new Position(2, 0), new Position(2, 24))),
'SecondTestNamespace' => new Location($useUri, new Range(new Position( 2, 0), new Position( 2, 30))), 'SecondTestNamespace' => new Location($useUri, new Range(new Position(2, 0), new Position(2, 30))),
'TestNamespace\\TEST_CONST' => new Location($symbolsUri, new Range(new Position( 9, 6), new Position( 9, 22))), 'TestNamespace\\TEST_CONST' => new Location($symbolsUri, new Range(new Position(9, 6), new Position(9, 22))),
'TestNamespace\\TestClass' => new Location($symbolsUri, new Range(new Position(20, 0), new Position(61, 1))), 'TestNamespace\\TestClass' => new Location($symbolsUri, new Range(new Position(20, 0), new Position(61, 1))),
'TestNamespace\\ChildClass' => new Location($symbolsUri, new Range(new Position(99, 0), new Position(99, 37))), 'TestNamespace\\ChildClass' => new Location($symbolsUri, new Range(new Position(99, 0), new Position(99, 37))),
'TestNamespace\\TestTrait' => new Location($symbolsUri, new Range(new Position(63, 0), new Position(66, 1))), 'TestNamespace\\TestTrait' => new Location($symbolsUri, new Range(new Position(63, 0), new Position(66, 1))),
'TestNamespace\\TestInterface' => new Location($symbolsUri, new Range(new Position(68, 0), new Position(71, 1))), 'TestNamespace\\TestInterface' => new Location($symbolsUri, new Range(new Position(68, 0), new Position(71, 1))),
'TestNamespace\\TestClass::TEST_CLASS_CONST' => new Location($symbolsUri, new Range(new Position(27, 10), new Position(27, 32))), 'TestNamespace\\TestClass::TEST_CLASS_CONST' => new Location($symbolsUri, new Range(new Position(27, 10), new Position(27, 32))),
'TestNamespace\\TestClass::testProperty' => new Location($symbolsUri, new Range(new Position(41, 11), new Position(41, 24))), 'TestNamespace\\TestClass::testProperty' => new Location($symbolsUri, new Range(new Position(41, 11), new Position(41, 24))),
'TestNamespace\\TestClass::staticTestProperty' => new Location($symbolsUri, new Range(new Position(34, 18), new Position(34, 37))), 'TestNamespace\\TestClass::staticTestProperty' => new Location($symbolsUri, new Range(new Position(34, 18), new Position(34, 37))),
'TestNamespace\\TestClass::staticTestMethod()' => new Location($symbolsUri, new Range(new Position(46, 4), new Position(49, 5))), 'TestNamespace\\TestClass::staticTestMethod()' => new Location($symbolsUri, new Range(new Position(46, 4), new Position(49, 5))),
'TestNamespace\\TestClass::testMethod()' => new Location($symbolsUri, new Range(new Position(57, 4), new Position(60, 5))), 'TestNamespace\\TestClass::testMethod()' => new Location($symbolsUri, new Range(new Position(57, 4), new Position(60, 5))),
'TestNamespace\\test_function()' => new Location($symbolsUri, new Range(new Position(78, 0), new Position(81, 1))), 'TestNamespace\\test_function()' => new Location($symbolsUri, new Range(new Position(78, 0), new Position(81, 1))),
'TestNamespace\\whatever()' => new Location($referencesUri, new Range(new Position(21, 0), new Position(23, 1))), 'TestNamespace\\whatever()' => new Location($referencesUri, new Range(new Position(21, 0), new Position(23, 1))),
'TestNamespace\\Example' => new Location($symbolsUri, new Range(new Position(101, 0), new Position(104, 1))), 'TestNamespace\\Example' => new Location($symbolsUri, new Range(new Position(101, 0), new Position(104, 1))),
'TestNamespace\\Example::__construct' => new Location($symbolsUri, new Range(new Position(102, 4), new Position(102, 36))), 'TestNamespace\\Example::__construct' => new Location($symbolsUri, new Range(new Position(102, 4), new Position(102, 36))),
'TestNamespace\\Example::__destruct' => new Location($symbolsUri, new Range(new Position(103, 4), new Position(103, 35))), 'TestNamespace\\Example::__destruct' => new Location($symbolsUri, new Range(new Position(103, 4), new Position(103, 35))),
'TestNamespace\\InnerNamespace' => new Location($symbolsUri, new Range(new Position(106, 0), new Position(106, 39))), 'TestNamespace\\InnerNamespace' => new Location($symbolsUri, new Range(new Position(106, 0), new Position(106, 39))),
'TestNamespace\\InnerNamespace\\InnerClass' => new Location($symbolsUri, new Range(new Position(108, 0), new Position(109, 1))), 'TestNamespace\\InnerNamespace\\InnerClass' => new Location($symbolsUri, new Range(new Position(108, 0), new Position(109, 1))),
]; ];
$this->referenceLocations = [ $this->referenceLocations = [
// Namespaced // Namespaced
'TestNamespace' => [ 'TestNamespace' => [
0 => new Location($referencesUri, new Range(new Position(31, 13), new Position(31, 40))), // use function TestNamespace\test_function; 0 => new Location($referencesUri, new Range(new Position(31, 13), new Position(31, 40))), // use function TestNamespace\test_function;
1 => new Location($useUri, new Range(new Position( 4, 4), new Position( 4, 27))), // use TestNamespace\TestClass; 1 => new Location($useUri, new Range(new Position(4, 4), new Position(4, 27))), // use TestNamespace\TestClass;
2 => new Location($useUri, new Range(new Position( 5, 4), new Position( 5, 18))) // use TestNamespace\{TestTrait, TestInterface}; 2 => new Location($useUri, new Range(new Position(5, 4), new Position(5, 18))) // use TestNamespace\{TestTrait, TestInterface};
], ],
'TestNamespace\\TEST_CONST' => [ 'TestNamespace\\TEST_CONST' => [
0 => new Location($referencesUri, new Range(new Position(29, 5), new Position(29, 15))) 0 => new Location($referencesUri, new Range(new Position(29, 5), new Position(29, 15)))
], ],
'TestNamespace\\TestClass' => [ 'TestNamespace\\TestClass' => [
0 => new Location($symbolsUri, new Range(new Position(48, 13), new Position(48, 17))), // echo self::TEST_CLASS_CONST; 0 => new Location($symbolsUri, new Range(new Position(48, 13), new Position(48, 17))), // echo self::TEST_CLASS_CONST;
1 => new Location($symbolsUri , new Range(new Position(99, 25), new Position(99, 34))), // class ChildClass extends TestClass {} 1 => new Location($symbolsUri, new Range(new Position(99, 25), new Position(99, 34))), // class ChildClass extends TestClass {}
2 => new Location($referencesUri, new Range(new Position( 4, 11), new Position( 4, 20))), // $obj = new TestClass(); 2 => new Location($referencesUri, new Range(new Position(4, 11), new Position(4, 20))), // $obj = new TestClass();
3 => new Location($referencesUri, new Range(new Position( 7, 0), new Position( 7, 9))), // TestClass::staticTestMethod(); 3 => new Location($referencesUri, new Range(new Position(7, 0), new Position(7, 9))), // TestClass::staticTestMethod();
4 => new Location($referencesUri, new Range(new Position( 8, 5), new Position( 8, 14))), // echo TestClass::$staticTestProperty; 4 => new Location($referencesUri, new Range(new Position(8, 5), new Position(8, 14))), // echo TestClass::$staticTestProperty;
5 => new Location($referencesUri, new Range(new Position( 9, 5), new Position( 9, 14))), // TestClass::TEST_CLASS_CONST; 5 => new Location($referencesUri, new Range(new Position(9, 5), new Position(9, 14))), // TestClass::TEST_CLASS_CONST;
6 => new Location($referencesUri, new Range(new Position(21, 18), new Position(21, 27))), // function whatever(TestClass $param) 6 => new Location($referencesUri, new Range(new Position(21, 18), new Position(21, 27))), // function whatever(TestClass $param)
7 => new Location($referencesUri, new Range(new Position(21, 37), new Position(21, 46))), // function whatever(TestClass $param): TestClass 7 => new Location($referencesUri, new Range(new Position(21, 37), new Position(21, 46))), // function whatever(TestClass $param): TestClass
8 => new Location($referencesUri, new Range(new Position(39, 0), new Position(39, 9))), // TestClass::$staticTestProperty[123]->testProperty; 8 => new Location($referencesUri, new Range(new Position(39, 0), new Position(39, 9))), // TestClass::$staticTestProperty[123]->testProperty;
9 => new Location($useUri, new Range(new Position( 4, 4), new Position( 4, 27))), // use TestNamespace\TestClass; 9 => new Location($useUri, new Range(new Position(4, 4), new Position(4, 27))), // use TestNamespace\TestClass;
], ],
'TestNamespace\\TestChild' => [ 'TestNamespace\\TestChild' => [
0 => new Location($referencesUri, new Range(new Position(42, 5), new Position(42, 25))), // echo $child->testProperty; 0 => new Location($referencesUri, new Range(new Position(42, 5), new Position(42, 25))), // echo $child->testProperty;
], ],
'TestNamespace\\TestInterface' => [ 'TestNamespace\\TestInterface' => [
0 => new Location($symbolsUri, new Range(new Position(20, 27), new Position(20, 40))), // class TestClass implements TestInterface 0 => new Location($symbolsUri, new Range(new Position(20, 27), new Position(20, 40))), // class TestClass implements TestInterface
1 => new Location($symbolsUri, new Range(new Position(57, 48), new Position(57, 61))), // public function testMethod($testParameter): TestInterface 1 => new Location($symbolsUri, new Range(new Position(57, 48), new Position(57, 61))), // public function testMethod($testParameter): TestInterface
2 => new Location($referencesUri, new Range(new Position(33, 20), new Position(33, 33))) // if ($abc instanceof TestInterface) 2 => new Location($referencesUri, new Range(new Position(33, 20), new Position(33, 33))) // if ($abc instanceof TestInterface)
], ],
'TestNamespace\\TestClass::TEST_CLASS_CONST' => [ 'TestNamespace\\TestClass::TEST_CLASS_CONST' => [
0 => new Location($symbolsUri, new Range(new Position(48, 13), new Position(48, 35))), // echo self::TEST_CLASS_CONSTANT 0 => new Location($symbolsUri, new Range(new Position(48, 13), new Position(48, 35))), // echo self::TEST_CLASS_CONSTANT
1 => new Location($referencesUri, new Range(new Position( 9, 5), new Position( 9, 32))) 1 => new Location($referencesUri, new Range(new Position(9, 5), new Position(9, 32)))
], ],
'TestNamespace\\TestClass::testProperty' => [ 'TestNamespace\\TestClass::testProperty' => [
0 => new Location($symbolsUri, new Range(new Position(59, 8), new Position(59, 27))), // $this->testProperty = $testParameter; 0 => new Location($symbolsUri, new Range(new Position(59, 8), new Position(59, 27))), // $this->testProperty = $testParameter;
1 => new Location($referencesUri, new Range(new Position( 6, 5), new Position( 6, 23))), // echo $obj->testProperty; 1 => new Location($referencesUri, new Range(new Position(6, 5), new Position(6, 23))), // echo $obj->testProperty;
2 => new Location($referencesUri, new Range(new Position(38, 0), new Position(38, 18))), // $obj->testProperty->testMethod(); 2 => new Location($referencesUri, new Range(new Position(38, 0), new Position(38, 18))), // $obj->testProperty->testMethod();
3 => new Location($referencesUri, new Range(new Position(39, 0), new Position(39, 49))) // TestClass::$staticTestProperty[123]->testProperty; 3 => new Location($referencesUri, new Range(new Position(39, 0), new Position(39, 49))) // TestClass::$staticTestProperty[123]->testProperty;
], ],
'TestNamespace\\TestClass::staticTestProperty' => [ 'TestNamespace\\TestClass::staticTestProperty' => [
0 => new Location($referencesUri, new Range(new Position( 8, 16), new Position( 8, 35))), // echo TestClass::$staticTestProperty; 0 => new Location($referencesUri, new Range(new Position(8, 16), new Position(8, 35))), // echo TestClass::$staticTestProperty;
1 => new Location($referencesUri, new Range(new Position(39, 11), new Position(39, 30))) // TestClass::$staticTestProperty[123]->testProperty; 1 => new Location($referencesUri, new Range(new Position(39, 11), new Position(39, 30))) // TestClass::$staticTestProperty[123]->testProperty;
], ],
'TestNamespace\\TestClass::staticTestMethod()' => [ 'TestNamespace\\TestClass::staticTestMethod()' => [
0 => new Location($referencesUri, new Range(new Position( 7, 0), new Position( 7, 27))) 0 => new Location($referencesUri, new Range(new Position(7, 0), new Position(7, 27)))
], ],
'TestNamespace\\TestClass::testMethod()' => [ 'TestNamespace\\TestClass::testMethod()' => [
0 => new Location($referencesUri, new Range(new Position( 5, 0), new Position( 5, 16))), // $obj->testMethod(); 0 => new Location($referencesUri, new Range(new Position(5, 0), new Position(5, 16))), // $obj->testMethod();
1 => new Location($referencesUri, new Range(new Position(38, 0), new Position(38, 30))), // $obj->testProperty->testMethod(); 1 => new Location($referencesUri, new Range(new Position(38, 0), new Position(38, 30))), // $obj->testProperty->testMethod();
2 => new Location($referencesUri, new Range(new Position(42, 5), new Position(42, 23))) // $child->testMethod(); 2 => new Location($referencesUri, new Range(new Position(42, 5), new Position(42, 23))) // $child->testMethod();
], ],
'TestNamespace\\test_function()' => [ 'TestNamespace\\test_function()' => [
0 => new Location($referencesUri, new Range(new Position(10, 0), new Position(10, 13))), 0 => new Location($referencesUri, new Range(new Position(10, 0), new Position(10, 13))),
1 => new Location($referencesUri, new Range(new Position(31, 13), new Position(31, 40))) 1 => new Location($referencesUri, new Range(new Position(31, 13), new Position(31, 40)))
], ],
// Global // Global
'TEST_DEFINE_CONSTANT' => [ 'TEST_DEFINE_CONSTANT' => [
0 => new Location($globalSymbolsUri, new Range(new Position(106, 6), new Position(106, 26))) 0 => new Location($globalSymbolsUri, new Range(new Position(106, 6), new Position(106, 26)))
], ],
'TEST_CONST' => [ 'TEST_CONST' => [
0 => new Location($referencesUri, new Range(new Position(29, 5), new Position(29, 15))), 0 => new Location($referencesUri, new Range(new Position(29, 5), new Position(29, 15))),
1 => new Location($globalReferencesUri, new Range(new Position(29, 5), new Position(29, 15))) 1 => new Location($globalReferencesUri, new Range(new Position(29, 5), new Position(29, 15)))
], ],
'TestClass' => [ 'TestClass' => [
0 => new Location($globalSymbolsUri, new Range(new Position(48, 13), new Position(48, 17))), // echo self::TEST_CLASS_CONST; 0 => new Location($globalSymbolsUri, new Range(new Position(48, 13), new Position(48, 17))), // echo self::TEST_CLASS_CONST;
1 => new Location($globalSymbolsUri, new Range(new Position(99, 25), new Position(99, 34))), // class ChildClass extends TestClass {} 1 => new Location($globalSymbolsUri, new Range(new Position(99, 25), new Position(99, 34))), // class ChildClass extends TestClass {}
2 => new Location($globalReferencesUri, new Range(new Position( 4, 11), new Position( 4, 20))), // $obj = new TestClass(); 2 => new Location($globalReferencesUri, new Range(new Position(4, 11), new Position(4, 20))), // $obj = new TestClass();
3 => new Location($globalReferencesUri, new Range(new Position( 7, 0), new Position( 7, 9))), // TestClass::staticTestMethod(); 3 => new Location($globalReferencesUri, new Range(new Position(7, 0), new Position(7, 9))), // TestClass::staticTestMethod();
4 => new Location($globalReferencesUri, new Range(new Position( 8, 5), new Position( 8, 14))), // echo TestClass::$staticTestProperty; 4 => new Location($globalReferencesUri, new Range(new Position(8, 5), new Position(8, 14))), // echo TestClass::$staticTestProperty;
5 => new Location($globalReferencesUri, new Range(new Position( 9, 5), new Position( 9, 14))), // TestClass::TEST_CLASS_CONST; 5 => new Location($globalReferencesUri, new Range(new Position(9, 5), new Position(9, 14))), // TestClass::TEST_CLASS_CONST;
6 => new Location($globalReferencesUri, new Range(new Position(21, 18), new Position(21, 27))), // function whatever(TestClass $param) 6 => new Location($globalReferencesUri, new Range(new Position(21, 18), new Position(21, 27))), // function whatever(TestClass $param)
7 => new Location($globalReferencesUri, new Range(new Position(21, 37), new Position(21, 46))), // function whatever(TestClass $param): TestClass 7 => new Location($globalReferencesUri, new Range(new Position(21, 37), new Position(21, 46))), // function whatever(TestClass $param): TestClass
8 => new Location($globalReferencesUri, new Range(new Position(39, 0), new Position(39, 9))), // TestClass::$staticTestProperty[123]->testProperty; 8 => new Location($globalReferencesUri, new Range(new Position(39, 0), new Position(39, 9))), // TestClass::$staticTestProperty[123]->testProperty;
], ],
'TestChild' => [ 'TestChild' => [
0 => new Location($globalReferencesUri, new Range(new Position(42, 5), new Position(42, 25))), // echo $child->testProperty; 0 => new Location($globalReferencesUri, new Range(new Position(42, 5), new Position(42, 25))), // echo $child->testProperty;
], ],
'TestInterface' => [ 'TestInterface' => [
0 => new Location($globalSymbolsUri, new Range(new Position(20, 27), new Position(20, 40))), // class TestClass implements TestInterface 0 => new Location($globalSymbolsUri, new Range(new Position(20, 27), new Position(20, 40))), // class TestClass implements TestInterface
1 => new Location($globalSymbolsUri, new Range(new Position(57, 49), new Position(57, 61))), // public function testMethod($testParameter) : TestInterface 1 => new Location($globalSymbolsUri, new Range(new Position(57, 49), new Position(57, 61))), // public function testMethod($testParameter) : TestInterface
2 => new Location($globalReferencesUri, new Range(new Position(33, 20), new Position(33, 33))) // if ($abc instanceof TestInterface) 2 => new Location($globalReferencesUri, new Range(new Position(33, 20), new Position(33, 33))) // if ($abc instanceof TestInterface)
], ],
'TestClass::TEST_CLASS_CONST' => [ 'TestClass::TEST_CLASS_CONST' => [
0 => new Location($globalSymbolsUri, new Range(new Position(48, 13), new Position(48, 35))), // echo self::TEST_CLASS_CONSTANT 0 => new Location($globalSymbolsUri, new Range(new Position(48, 13), new Position(48, 35))), // echo self::TEST_CLASS_CONSTANT
1 => new Location($globalReferencesUri, new Range(new Position( 9, 5), new Position( 9, 32))) 1 => new Location($globalReferencesUri, new Range(new Position(9, 5), new Position(9, 32)))
], ],
'TestClass::testProperty' => [ 'TestClass::testProperty' => [
0 => new Location($globalSymbolsUri, new Range(new Position(59, 8), new Position(59, 27))), // $this->testProperty = $testParameter; 0 => new Location($globalSymbolsUri, new Range(new Position(59, 8), new Position(59, 27))), // $this->testProperty = $testParameter;
1 => new Location($globalReferencesUri, new Range(new Position( 6, 5), new Position( 6, 23))), // echo $obj->testProperty; 1 => new Location($globalReferencesUri, new Range(new Position(6, 5), new Position(6, 23))), // echo $obj->testProperty;
2 => new Location($globalReferencesUri, new Range(new Position(38, 0), new Position(38, 18))), // $obj->testProperty->testMethod(); 2 => new Location($globalReferencesUri, new Range(new Position(38, 0), new Position(38, 18))), // $obj->testProperty->testMethod();
3 => new Location($globalReferencesUri, new Range(new Position(39, 0), new Position(39, 49))) // TestClass::$staticTestProperty[123]->testProperty; 3 => new Location($globalReferencesUri, new Range(new Position(39, 0), new Position(39, 49))) // TestClass::$staticTestProperty[123]->testProperty;
], ],
'TestClass::staticTestProperty' => [ 'TestClass::staticTestProperty' => [
0 => new Location($globalReferencesUri, new Range(new Position( 8, 16), new Position( 8, 35))), // echo TestClass::$staticTestProperty; 0 => new Location($globalReferencesUri, new Range(new Position(8, 16), new Position(8, 35))), // echo TestClass::$staticTestProperty;
1 => new Location($globalReferencesUri, new Range(new Position(39, 11), new Position(39, 30))) // TestClass::$staticTestProperty[123]->testProperty; 1 => new Location($globalReferencesUri, new Range(new Position(39, 11), new Position(39, 30))) // TestClass::$staticTestProperty[123]->testProperty;
], ],
'TestClass::staticTestMethod()' => [ 'TestClass::staticTestMethod()' => [
0 => new Location($globalReferencesUri, new Range(new Position( 7, 0), new Position( 7, 27))) 0 => new Location($globalReferencesUri, new Range(new Position(7, 0), new Position(7, 27)))
], ],
'TestClass::testMethod()' => [ 'TestClass::testMethod()' => [
0 => new Location($globalReferencesUri, new Range(new Position( 5, 0), new Position( 5, 16))), // $obj->testMethod(); 0 => new Location($globalReferencesUri, new Range(new Position(5, 0), new Position(5, 16))), // $obj->testMethod();
1 => new Location($globalReferencesUri, new Range(new Position(38, 0), new Position(38, 30))), // $obj->testProperty->testMethod(); 1 => new Location($globalReferencesUri, new Range(new Position(38, 0), new Position(38, 30))), // $obj->testProperty->testMethod();
2 => new Location($globalReferencesUri, new Range(new Position(42, 5), new Position(42, 23))) // $child->testMethod(); 2 => new Location($globalReferencesUri, new Range(new Position(42, 5), new Position(42, 23))) // $child->testMethod();
], ],
'test_function()' => [ 'test_function()' => [
0 => new Location($globalReferencesUri, new Range(new Position(10, 0), new Position(10, 13))), 0 => new Location($globalReferencesUri, new Range(new Position(10, 0), new Position(10, 13))),
1 => new Location($globalReferencesUri, new Range(new Position(31, 13), new Position(31, 40))) 1 => new Location($globalReferencesUri, new Range(new Position(31, 13), new Position(31, 40)))
] ]
]; ];
// @codingStandardsIgnoreEnd // @codingStandardsIgnoreEnd
});
} }
protected function getDefinitionLocation(string $fqn): Location protected function getDefinitionLocation(string $fqn): Location

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +1,9 @@
<?php <?php
declare(strict_types = 1); declare(strict_types=1);
namespace LanguageServer\Tests\Server\TextDocument\Definition; namespace LanguageServer\Tests\Server\TextDocument\Definition;
use Amp\Loop;
use LanguageServer\Tests\MockProtocolStream; use LanguageServer\Tests\MockProtocolStream;
use LanguageServer\Tests\Server\ServerTestCase; use LanguageServer\Tests\Server\ServerTestCase;
use LanguageServer\{ use LanguageServer\{
@ -29,34 +30,40 @@ class GlobalFallbackTest extends ServerTestCase
public function testClassDoesNotFallback() public function testClassDoesNotFallback()
{ {
// $obj = new TestClass(); Loop::run(function () {
// Get definition for TestClass should not fall back to global // $obj = new TestClass();
$result = $this->textDocument->definition( // Get definition for TestClass should not fall back to global
new TextDocumentIdentifier('global_fallback'), $result = yield $this->textDocument->definition(
new Position(9, 16) new TextDocumentIdentifier('global_fallback'),
)->wait(); new Position(9, 16)
$this->assertEquals([], $result); );
$this->assertEquals([], $result);
});
} }
public function testFallsBackForConstants() public function testFallsBackForConstants()
{ {
// echo TEST_CONST; Loop::run(function () {
// Get definition for TEST_CONST // echo TEST_CONST;
$result = $this->textDocument->definition( // Get definition for TEST_CONST
new TextDocumentIdentifier('global_fallback'), $result = yield $this->textDocument->definition(
new Position(6, 10) new TextDocumentIdentifier('global_fallback'),
)->wait(); new Position(6, 10)
$this->assertEquals(new Location('global_symbols', new Range(new Position(9, 6), new Position(9, 22))), $result); );
$this->assertEquals(new Location('global_symbols', new Range(new Position(9, 6), new Position(9, 22))), $result);
});
} }
public function testFallsBackForFunctions() public function testFallsBackForFunctions()
{ {
// test_function(); Loop::run(function () {
// Get definition for test_function // test_function();
$result = $this->textDocument->definition( // Get definition for test_function
new TextDocumentIdentifier('global_fallback'), $result = yield $this->textDocument->definition(
new Position(5, 6) new TextDocumentIdentifier('global_fallback'),
)->wait(); new Position(5, 6)
$this->assertEquals(new Location('global_symbols', new Range(new Position(78, 0), new Position(81, 1))), $result); );
$this->assertEquals(new Location('global_symbols', new Range(new Position(78, 0), new Position(81, 1))), $result);
});
} }
} }

View File

@ -1,8 +1,9 @@
<?php <?php
declare(strict_types = 1); declare(strict_types=1);
namespace LanguageServer\Tests\Server\TextDocument\Definition; namespace LanguageServer\Tests\Server\TextDocument\Definition;
use Amp\Loop;
use LanguageServer\Tests\Server\ServerTestCase; use LanguageServer\Tests\Server\ServerTestCase;
use LanguageServerProtocol\{TextDocumentIdentifier, Position, Location, Range}; use LanguageServerProtocol\{TextDocumentIdentifier, Position, Location, Range};
use function LanguageServer\pathToUri; use function LanguageServer\pathToUri;
@ -11,333 +12,389 @@ class GlobalTest extends ServerTestCase
{ {
public function testDefinitionFileBeginning() public function testDefinitionFileBeginning()
{ {
// |<?php Loop::run(function () {
$result = $this->textDocument->definition( // |<?php
new TextDocumentIdentifier(pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php'))), $result = yield $this->textDocument->definition(
new Position(0, 0) new TextDocumentIdentifier(pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php'))),
)->wait(); new Position(0, 0)
$this->assertEquals([], $result); );
$this->assertEquals([], $result);
});
} }
public function testDefinitionEmptyResult() public function testDefinitionEmptyResult()
{ {
// namespace keyword Loop::run(function () {
$result = $this->textDocument->definition( // namespace keyword
new TextDocumentIdentifier(pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php'))), $result = yield $this->textDocument->definition(
new Position(1, 0) new TextDocumentIdentifier(pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php'))),
)->wait(); new Position(1, 0)
$this->assertEquals([], $result); );
$this->assertEquals([], $result);
});
} }
public function testDefinitionForSelfKeyword() public function testDefinitionForSelfKeyword()
{ {
// echo self::TEST_CLASS_CONST; Loop::run(function () {
// Get definition for self // echo self::TEST_CLASS_CONST;
$reference = $this->getReferenceLocations('TestClass')[0]; // Get definition for self
$result = $this->textDocument->definition( $reference = $this->getReferenceLocations('TestClass')[0];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->definition(
$reference->range->start new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->start
$this->assertEquals($this->getDefinitionLocation('TestClass'), $result); );
$this->assertEquals($this->getDefinitionLocation('TestClass'), $result);
});
} }
public function testDefinitionForClassLike() public function testDefinitionForClassLike()
{ {
// $obj = new TestClass(); Loop::run(function () {
// Get definition for TestClass // $obj = new TestClass();
$reference = $this->getReferenceLocations('TestClass')[1]; // Get definition for TestClass
$result = $this->textDocument->definition( $reference = $this->getReferenceLocations('TestClass')[1];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->definition(
$reference->range->start new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->start
$this->assertEquals($this->getDefinitionLocation('TestClass'), $result); );
$this->assertEquals($this->getDefinitionLocation('TestClass'), $result);
});
} }
public function testDefinitionForClassOnStaticMethodCall() public function testDefinitionForClassOnStaticMethodCall()
{ {
// TestClass::staticTestMethod(); Loop::run(function () {
// Get definition for TestClass // TestClass::staticTestMethod();
$reference = $this->getReferenceLocations('TestClass')[2]; // Get definition for TestClass
$result = $this->textDocument->definition( $reference = $this->getReferenceLocations('TestClass')[2];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->definition(
$reference->range->start new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->start
$this->assertEquals($this->getDefinitionLocation('TestClass'), $result); );
$this->assertEquals($this->getDefinitionLocation('TestClass'), $result);
});
} }
public function testDefinitionForClassOnStaticPropertyFetch() public function testDefinitionForClassOnStaticPropertyFetch()
{ {
// echo TestClass::$staticTestProperty; Loop::run(function () {
// Get definition for TestClass // echo TestClass::$staticTestProperty;
$reference = $this->getReferenceLocations('TestClass')[3]; // Get definition for TestClass
$result = $this->textDocument->definition( $reference = $this->getReferenceLocations('TestClass')[3];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->definition(
$reference->range->start new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->start
$this->assertEquals($this->getDefinitionLocation('TestClass'), $result); );
$this->assertEquals($this->getDefinitionLocation('TestClass'), $result);
});
} }
public function testDefinitionForClassOnConstFetch() public function testDefinitionForClassOnConstFetch()
{ {
// TestClass::TEST_CLASS_CONST; Loop::run(function () {
// Get definition for TestClass // TestClass::TEST_CLASS_CONST;
$reference = $this->getReferenceLocations('TestClass')[4]; // Get definition for TestClass
$result = $this->textDocument->definition( $reference = $this->getReferenceLocations('TestClass')[4];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->definition(
$reference->range->start new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->start
$this->assertEquals($this->getDefinitionLocation('TestClass'), $result); );
$this->assertEquals($this->getDefinitionLocation('TestClass'), $result);
});
} }
public function testDefinitionForImplements() public function testDefinitionForImplements()
{ {
// class TestClass implements TestInterface Loop::run(function () {
// Get definition for TestInterface // class TestClass implements TestInterface
$reference = $this->getReferenceLocations('TestInterface')[0]; // Get definition for TestInterface
$result = $this->textDocument->definition( $reference = $this->getReferenceLocations('TestInterface')[0];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->definition(
$reference->range->start new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->start
$this->assertEquals($this->getDefinitionLocation('TestInterface'), $result); );
$this->assertEquals($this->getDefinitionLocation('TestInterface'), $result);
});
} }
public function testDefinitionForClassConstants() public function testDefinitionForClassConstants()
{ {
// echo TestClass::TEST_CLASS_CONST; Loop::run(function () {
// Get definition for TEST_CLASS_CONST // echo TestClass::TEST_CLASS_CONST;
$reference = $this->getReferenceLocations('TestClass::TEST_CLASS_CONST')[1]; // Get definition for TEST_CLASS_CONST
$result = $this->textDocument->definition( $reference = $this->getReferenceLocations('TestClass::TEST_CLASS_CONST')[1];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->definition(
$reference->range->end new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->end
$this->assertEquals($this->getDefinitionLocation('TestClass::TEST_CLASS_CONST'), $result); );
$this->assertEquals($this->getDefinitionLocation('TestClass::TEST_CLASS_CONST'), $result);
});
} }
public function testDefinitionForClassConstantsOnSelf() public function testDefinitionForClassConstantsOnSelf()
{ {
// echo self::TEST_CLASS_CONST; Loop::run(function () {
// Get definition for TEST_CLASS_CONST // echo self::TEST_CLASS_CONST;
$reference = $this->getReferenceLocations('TestClass::TEST_CLASS_CONST')[0]; // Get definition for TEST_CLASS_CONST
$result = $this->textDocument->definition( $reference = $this->getReferenceLocations('TestClass::TEST_CLASS_CONST')[0];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->definition(
$reference->range->end new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->end
$this->assertEquals($this->getDefinitionLocation('TestClass::TEST_CLASS_CONST'), $result); );
$this->assertEquals($this->getDefinitionLocation('TestClass::TEST_CLASS_CONST'), $result);
});
} }
public function testDefinitionForConstants() public function testDefinitionForConstants()
{ {
// echo TEST_CONST; Loop::run(function () {
// Get definition for TEST_CONST // echo TEST_CONST;
$reference = $this->getReferenceLocations('TEST_CONST')[1]; // Get definition for TEST_CONST
$result = $this->textDocument->definition( $reference = $this->getReferenceLocations('TEST_CONST')[1];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->definition(
$reference->range->start new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->start
$this->assertEquals($this->getDefinitionLocation('TEST_CONST'), $result); );
$this->assertEquals($this->getDefinitionLocation('TEST_CONST'), $result);
});
} }
public function testDefinitionForStaticMethods() public function testDefinitionForStaticMethods()
{ {
// TestClass::staticTestMethod(); Loop::run(function () {
// Get definition for staticTestMethod // TestClass::staticTestMethod();
$reference = $this->getReferenceLocations('TestClass::staticTestMethod()')[0]; // Get definition for staticTestMethod
$result = $this->textDocument->definition( $reference = $this->getReferenceLocations('TestClass::staticTestMethod()')[0];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->definition(
$reference->range->end new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->end
$this->assertEquals($this->getDefinitionLocation('TestClass::staticTestMethod()'), $result); );
$this->assertEquals($this->getDefinitionLocation('TestClass::staticTestMethod()'), $result);
});
} }
public function testDefinitionForStaticProperties() public function testDefinitionForStaticProperties()
{ {
// echo TestClass::$staticTestProperty; Loop::run(function () {
// Get definition for staticTestProperty // echo TestClass::$staticTestProperty;
$reference = $this->getReferenceLocations('TestClass::staticTestProperty')[0]; // Get definition for staticTestProperty
$result = $this->textDocument->definition( $reference = $this->getReferenceLocations('TestClass::staticTestProperty')[0];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->definition(
$reference->range->end new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->end
$this->assertEquals($this->getDefinitionLocation('TestClass::staticTestProperty'), $result); );
$this->assertEquals($this->getDefinitionLocation('TestClass::staticTestProperty'), $result);
});
} }
public function testDefinitionForMethods() public function testDefinitionForMethods()
{ {
// $obj->testMethod(); Loop::run(function () {
// Get definition for testMethod // $obj->testMethod();
$reference = $this->getReferenceLocations('TestClass::testMethod()')[0]; // Get definition for testMethod
$result = $this->textDocument->definition( $reference = $this->getReferenceLocations('TestClass::testMethod()')[0];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->definition(
$reference->range->end new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->end
$this->assertEquals($this->getDefinitionLocation('TestClass::testMethod()'), $result); );
$this->assertEquals($this->getDefinitionLocation('TestClass::testMethod()'), $result);
});
} }
public function testDefinitionForMethodOnChildClass() public function testDefinitionForMethodOnChildClass()
{ {
// $child->testMethod(); Loop::run(function () {
// Get definition for testMethod // $child->testMethod();
$reference = $this->getReferenceLocations('TestClass::testMethod()')[2]; // Get definition for testMethod
$result = $this->textDocument->definition( $reference = $this->getReferenceLocations('TestClass::testMethod()')[2];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->definition(
$reference->range->end new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->end
$this->assertEquals($this->getDefinitionLocation('TestClass::testMethod()'), $result); );
$this->assertEquals($this->getDefinitionLocation('TestClass::testMethod()'), $result);
});
} }
public function testDefinitionForProperties() public function testDefinitionForProperties()
{ {
// echo $obj->testProperty; Loop::run(function () {
// Get definition for testProperty // echo $obj->testProperty;
$reference = $this->getReferenceLocations('TestClass::testProperty')[1]; // Get definition for testProperty
$result = $this->textDocument->definition( $reference = $this->getReferenceLocations('TestClass::testProperty')[1];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->definition(
$reference->range->end new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->end
$this->assertEquals($this->getDefinitionLocation('TestClass::testProperty'), $result); );
$this->assertEquals($this->getDefinitionLocation('TestClass::testProperty'), $result);
});
} }
public function testDefinitionForPropertiesOnThis() public function testDefinitionForPropertiesOnThis()
{ {
// $this->testProperty = $testParameter; Loop::run(function () {
// Get definition for testProperty // $this->testProperty = $testParameter;
$reference = $this->getReferenceLocations('TestClass::testProperty')[0]; // Get definition for testProperty
$result = $this->textDocument->definition( $reference = $this->getReferenceLocations('TestClass::testProperty')[0];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->definition(
$reference->range->end new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->end
$this->assertEquals($this->getDefinitionLocation('TestClass::testProperty'), $result); );
$this->assertEquals($this->getDefinitionLocation('TestClass::testProperty'), $result);
});
} }
public function testDefinitionForVariables() public function testDefinitionForVariables()
{ {
// echo $var; Loop::run(function () {
// Get definition for $var // echo $var;
$uri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php')); // Get definition for $var
$result = $this->textDocument->definition( $uri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php'));
new TextDocumentIdentifier($uri), $result = yield $this->textDocument->definition(
new Position(13, 7) new TextDocumentIdentifier($uri),
)->wait(); new Position(13, 7)
$this->assertEquals(new Location($uri, new Range(new Position(12, 0), new Position(12, 10))), $result); );
$this->assertEquals(new Location($uri, new Range(new Position(12, 0), new Position(12, 10))), $result);
});
} }
public function testDefinitionForParamTypeHints() public function testDefinitionForParamTypeHints()
{ {
// function whatever(TestClass $param) { Loop::run(function () {
// Get definition for TestClass // function whatever(TestClass $param) {
$reference = $this->getReferenceLocations('TestClass')[5]; // Get definition for TestClass
$result = $this->textDocument->definition( $reference = $this->getReferenceLocations('TestClass')[5];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->definition(
$reference->range->start new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->start
$this->assertEquals($this->getDefinitionLocation('TestClass'), $result); );
$this->assertEquals($this->getDefinitionLocation('TestClass'), $result);
});
} }
public function testDefinitionForReturnTypeHints() public function testDefinitionForReturnTypeHints()
{ {
// function whatever(TestClass $param): TestClass { Loop::run(function () {
// Get definition for TestClass // function whatever(TestClass $param): TestClass {
$reference = $this->getReferenceLocations('TestClass')[6]; // Get definition for TestClass
$result = $this->textDocument->definition( $reference = $this->getReferenceLocations('TestClass')[6];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->definition(
$reference->range->start new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->start
$this->assertEquals($this->getDefinitionLocation('TestClass'), $result); );
$this->assertEquals($this->getDefinitionLocation('TestClass'), $result);
});
} }
public function testDefinitionForMethodReturnTypeHints() public function testDefinitionForMethodReturnTypeHints()
{ {
// public function testMethod($testParameter): TestInterface Loop::run(function () {
// Get definition for TestInterface // public function testMethod($testParameter): TestInterface
$reference = $this->getReferenceLocations('TestInterface')[1]; // Get definition for TestInterface
$result = $this->textDocument->definition( $reference = $this->getReferenceLocations('TestInterface')[1];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->definition(
$reference->range->start new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->start
$this->assertEquals($this->getDefinitionLocation('TestInterface'), $result); );
$this->assertEquals($this->getDefinitionLocation('TestInterface'), $result);
});
} }
public function testDefinitionForParams() public function testDefinitionForParams()
{ {
// echo $param; Loop::run(function () {
// Get definition for $param // echo $param;
$uri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php')); // Get definition for $param
$result = $this->textDocument->definition( $uri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php'));
new TextDocumentIdentifier($uri), $result = yield $this->textDocument->definition(
new Position(22, 13) new TextDocumentIdentifier($uri),
)->wait(); new Position(22, 13)
$this->assertEquals(new Location($uri, new Range(new Position(21, 18), new Position(21, 34))), $result); );
$this->assertEquals(new Location($uri, new Range(new Position(21, 18), new Position(21, 34))), $result);
});
} }
public function testDefinitionForUsedVariables() public function testDefinitionForUsedVariables()
{ {
// echo $var; Loop::run(function () {
// Get definition for $var // echo $var;
$uri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php')); // Get definition for $var
$result = $this->textDocument->definition( $uri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php'));
new TextDocumentIdentifier($uri), $result = yield $this->textDocument->definition(
new Position(26, 11) new TextDocumentIdentifier($uri),
)->wait(); new Position(26, 11)
$this->assertEquals(new Location($uri, new Range(new Position(25, 22), new Position(25, 26))), $result); );
$this->assertEquals(new Location($uri, new Range(new Position(25, 22), new Position(25, 26))), $result);
});
} }
public function testDefinitionForFunctions() public function testDefinitionForFunctions()
{ {
// test_function(); Loop::run(function () {
// Get definition for test_function // test_function();
$reference = $this->getReferenceLocations('test_function()')[0]; // Get definition for test_function
$result = $this->textDocument->definition( $reference = $this->getReferenceLocations('test_function()')[0];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->definition(
$reference->range->start new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->start
$this->assertEquals($this->getDefinitionLocation('test_function()'), $result); );
$this->assertEquals($this->getDefinitionLocation('test_function()'), $result);
});
} }
public function testDefinitionForUseFunctions() public function testDefinitionForUseFunctions()
{ {
// use function test_function; Loop::run(function () {
// Get definition for test_function // use function test_function;
$reference = $this->getReferenceLocations('test_function()')[1]; // Get definition for test_function
$result = $this->textDocument->definition( $reference = $this->getReferenceLocations('test_function()')[1];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->definition(
$reference->range->start new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->start
$this->assertEquals($this->getDefinitionLocation('test_function()'), $result); );
$this->assertEquals($this->getDefinitionLocation('test_function()'), $result);
});
} }
public function testDefinitionForInstanceOf() public function testDefinitionForInstanceOf()
{ {
// if ($abc instanceof TestInterface) { Loop::run(function () {
// Get definition for TestInterface // if ($abc instanceof TestInterface) {
$reference = $this->getReferenceLocations('TestInterface')[2]; // Get definition for TestInterface
$result = $this->textDocument->definition( $reference = $this->getReferenceLocations('TestInterface')[2];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->definition(
$reference->range->start new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->start
$this->assertEquals($this->getDefinitionLocation('TestInterface'), $result); );
$this->assertEquals($this->getDefinitionLocation('TestInterface'), $result);
});
} }
public function testDefinitionForNestedMethodCall() public function testDefinitionForNestedMethodCall()
{ {
// $obj->testProperty->testMethod(); Loop::run(function () {
// Get definition for testMethod // $obj->testProperty->testMethod();
$reference = $this->getReferenceLocations('TestClass::testMethod()')[1]; // Get definition for testMethod
$result = $this->textDocument->definition( $reference = $this->getReferenceLocations('TestClass::testMethod()')[1];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->definition(
$reference->range->end new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->end
$this->assertEquals($this->getDefinitionLocation('TestClass::testMethod()'), $result); );
$this->assertEquals($this->getDefinitionLocation('TestClass::testMethod()'), $result);
});
} }
public function testDefinitionForPropertyFetchOnArrayDimFetch() public function testDefinitionForPropertyFetchOnArrayDimFetch()
{ {
// TestClass::$staticTestProperty[123]->testProperty; Loop::run(function () {
// Get definition for testProperty // TestClass::$staticTestProperty[123]->testProperty;
$reference = $this->getReferenceLocations('TestClass::testProperty')[3]; // Get definition for testProperty
$result = $this->textDocument->definition( $reference = $this->getReferenceLocations('TestClass::testProperty')[3];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->definition(
$reference->range->end new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->end
$this->assertEquals($this->getDefinitionLocation('TestClass::testProperty'), $result); );
$this->assertEquals($this->getDefinitionLocation('TestClass::testProperty'), $result);
});
} }
} }

View File

@ -1,8 +1,9 @@
<?php <?php
declare(strict_types = 1); declare(strict_types=1);
namespace LanguageServer\Tests\Server\TextDocument\Definition; namespace LanguageServer\Tests\Server\TextDocument\Definition;
use Amp\Loop;
use LanguageServerProtocol\{TextDocumentIdentifier, Location}; use LanguageServerProtocol\{TextDocumentIdentifier, Location};
use function LanguageServer\pathToUri; use function LanguageServer\pathToUri;
@ -20,37 +21,43 @@ class NamespacedTest extends GlobalTest
public function testDefinitionForConstants() public function testDefinitionForConstants()
{ {
// echo TEST_CONST; Loop::run(function () {
// Get definition for TEST_CONST // echo TEST_CONST;
$reference = $this->getReferenceLocations('TEST_CONST')[0]; // Get definition for TEST_CONST
$result = $this->textDocument->definition( $reference = $this->getReferenceLocations('TEST_CONST')[0];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->definition(
$reference->range->start new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->start
$this->assertEquals($this->getDefinitionLocation('TEST_CONST'), $result); );
$this->assertEquals($this->getDefinitionLocation('TEST_CONST'), $result);
});
} }
public function testDefinitionForClassLikeUseStatement() public function testDefinitionForClassLikeUseStatement()
{ {
// use TestNamespace\TestClass; Loop::run(function () {
// Get definition for TestClass // use TestNamespace\TestClass;
$reference = $this->getReferenceLocations('TestClass')[7]; // Get definition for TestClass
$result = $this->textDocument->definition( $reference = $this->getReferenceLocations('TestClass')[7];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->definition(
$reference->range->start new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->start
$this->assertEquals($this->getDefinitionLocation('TestClass'), $result); );
$this->assertEquals($this->getDefinitionLocation('TestClass'), $result);
});
} }
public function testDefinitionForClassLikeGroupUseStatement() public function testDefinitionForClassLikeGroupUseStatement()
{ {
// use TestNamespace\{TestTrait, TestInterface}; Loop::run(function () {
// Get definition for TestInterface // use TestNamespace\{TestTrait, TestInterface};
$reference = $this->getReferenceLocations('TestClass')[1]; // Get definition for TestInterface
$result = $this->textDocument->definition( $reference = $this->getReferenceLocations('TestClass')[1];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->definition(
$reference->range->start new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->start
$this->assertEquals($this->getDefinitionLocation('TestClass'), $result); );
$this->assertEquals($this->getDefinitionLocation('TestClass'), $result);
});
} }
} }

View File

@ -1,8 +1,9 @@
<?php <?php
declare(strict_types = 1); declare(strict_types=1);
namespace LanguageServer\Tests\Server\TextDocument; namespace LanguageServer\Tests\Server\TextDocument;
use Amp\Loop;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use LanguageServer\Tests\MockProtocolStream; use LanguageServer\Tests\MockProtocolStream;
use LanguageServer\{ use LanguageServer\{
@ -21,21 +22,23 @@ class DidChangeTest extends TestCase
{ {
public function test() public function test()
{ {
$projectIndex = new ProjectIndex(new Index, new DependenciesIndex); Loop::run(function () {
$client = new LanguageClient(new MockProtocolStream, new MockProtocolStream); $projectIndex = new ProjectIndex(new Index, new DependenciesIndex);
$definitionResolver = new DefinitionResolver($projectIndex); $client = new LanguageClient(new MockProtocolStream, new MockProtocolStream);
$loader = new PhpDocumentLoader(new FileSystemContentRetriever, $projectIndex, $definitionResolver); $definitionResolver = new DefinitionResolver($projectIndex);
$textDocument = new Server\TextDocument($loader, $definitionResolver, $client, $projectIndex); $loader = new PhpDocumentLoader(new FileSystemContentRetriever, $projectIndex, $definitionResolver);
$phpDocument = $loader->open('whatever', "<?php\necho 'Hello, World'\n"); $textDocument = new Server\TextDocument($loader, $definitionResolver, $client, $projectIndex);
$phpDocument = $loader->open('whatever', "<?php\necho 'Hello, World'\n");
$identifier = new VersionedTextDocumentIdentifier('whatever'); $identifier = new VersionedTextDocumentIdentifier('whatever');
$changeEvent = new TextDocumentContentChangeEvent(); $changeEvent = new TextDocumentContentChangeEvent();
$changeEvent->range = new Range(new Position(0, 0), new Position(9999, 9999)); $changeEvent->range = new Range(new Position(0, 0), new Position(9999, 9999));
$changeEvent->rangeLength = 9999; $changeEvent->rangeLength = 9999;
$changeEvent->text = "<?php\necho 'Goodbye, World'\n"; $changeEvent->text = "<?php\necho 'Goodbye, World'\n";
$textDocument->didChange($identifier, [$changeEvent]); yield $textDocument->didChange($identifier, [$changeEvent]);
$this->assertEquals("<?php\necho 'Goodbye, World'\n", $phpDocument->getContent()); $this->assertEquals("<?php\necho 'Goodbye, World'\n", $phpDocument->getContent());
});
} }
} }

View File

@ -1,8 +1,9 @@
<?php <?php
declare(strict_types = 1); declare(strict_types=1);
namespace LanguageServer\Tests\Server\TextDocument; namespace LanguageServer\Tests\Server\TextDocument;
use Amp\Loop;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use LanguageServer\Tests\MockProtocolStream; use LanguageServer\Tests\MockProtocolStream;
use LanguageServer\{ use LanguageServer\{
@ -16,22 +17,24 @@ class DidCloseTest extends TestCase
{ {
public function test() public function test()
{ {
$projectIndex = new ProjectIndex(new Index, new DependenciesIndex); Loop::run(function () {
$client = new LanguageClient(new MockProtocolStream, new MockProtocolStream); $projectIndex = new ProjectIndex(new Index, new DependenciesIndex);
$definitionResolver = new DefinitionResolver($projectIndex); $client = new LanguageClient(new MockProtocolStream, new MockProtocolStream);
$loader = new PhpDocumentLoader(new FileSystemContentRetriever, $projectIndex, $definitionResolver); $definitionResolver = new DefinitionResolver($projectIndex);
$textDocument = new Server\TextDocument($loader, $definitionResolver, $client, $projectIndex); $loader = new PhpDocumentLoader(new FileSystemContentRetriever, $projectIndex, $definitionResolver);
$phpDocument = $loader->open('whatever', "<?php\necho 'Hello, World'\n"); $textDocument = new Server\TextDocument($loader, $definitionResolver, $client, $projectIndex);
$phpDocument = $loader->open('whatever', "<?php\necho 'Hello, World'\n");
$textDocumentItem = new TextDocumentItem(); $textDocumentItem = new TextDocumentItem();
$textDocumentItem->uri = 'whatever'; $textDocumentItem->uri = 'whatever';
$textDocumentItem->languageId = 'php'; $textDocumentItem->languageId = 'php';
$textDocumentItem->version = 1; $textDocumentItem->version = 1;
$textDocumentItem->text = 'hello world'; $textDocumentItem->text = 'hello world';
$textDocument->didOpen($textDocumentItem); $textDocument->didOpen($textDocumentItem);
$textDocument->didClose(new TextDocumentIdentifier($textDocumentItem->uri)); $textDocument->didClose(new TextDocumentIdentifier($textDocumentItem->uri));
$this->assertFalse($loader->isOpen($textDocumentItem->uri)); $this->assertFalse($loader->isOpen($textDocumentItem->uri));
});
} }
} }

View File

@ -1,8 +1,9 @@
<?php <?php
declare(strict_types = 1); declare(strict_types=1);
namespace LanguageServer\Tests\Server\TextDocument; namespace LanguageServer\Tests\Server\TextDocument;
use Amp\Loop;
use LanguageServer\Tests\Server\ServerTestCase; use LanguageServer\Tests\Server\ServerTestCase;
use LanguageServer\Tests\MockProtocolStream; use LanguageServer\Tests\MockProtocolStream;
use LanguageServer\{Server, LanguageClient, Project}; use LanguageServer\{Server, LanguageClient, Project};
@ -13,29 +14,31 @@ class DocumentSymbolTest extends ServerTestCase
{ {
public function test() public function test()
{ {
// Request symbols Loop::run(function () {
$uri = pathToUri(realpath(__DIR__ . '/../../../fixtures/symbols.php')); // Request symbols
$result = $this->textDocument->documentSymbol(new TextDocumentIdentifier($uri))->wait(); $uri = pathToUri(realpath(__DIR__ . '/../../../fixtures/symbols.php'));
// @codingStandardsIgnoreStart $result = yield $this->textDocument->documentSymbol(new TextDocumentIdentifier($uri));
$this->assertEquals([ // @codingStandardsIgnoreStart
new SymbolInformation('TestNamespace', SymbolKind::NAMESPACE, $this->getDefinitionLocation('TestNamespace'), ''), $this->assertEquals([
new SymbolInformation('TEST_CONST', SymbolKind::CONSTANT, $this->getDefinitionLocation('TestNamespace\\TEST_CONST'), 'TestNamespace'), new SymbolInformation('TestNamespace', SymbolKind::NAMESPACE, $this->getDefinitionLocation('TestNamespace'), ''),
new SymbolInformation('TestClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\TestClass'), 'TestNamespace'), new SymbolInformation('TEST_CONST', SymbolKind::CONSTANT, $this->getDefinitionLocation('TestNamespace\\TEST_CONST'), 'TestNamespace'),
new SymbolInformation('TEST_CLASS_CONST', SymbolKind::CONSTANT, $this->getDefinitionLocation('TestNamespace\\TestClass::TEST_CLASS_CONST'), 'TestNamespace\\TestClass'), new SymbolInformation('TestClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\TestClass'), 'TestNamespace'),
new SymbolInformation('staticTestProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('TestNamespace\\TestClass::staticTestProperty'), 'TestNamespace\\TestClass'), new SymbolInformation('TEST_CLASS_CONST', SymbolKind::CONSTANT, $this->getDefinitionLocation('TestNamespace\\TestClass::TEST_CLASS_CONST'), 'TestNamespace\\TestClass'),
new SymbolInformation('testProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('TestNamespace\\TestClass::testProperty'), 'TestNamespace\\TestClass'), new SymbolInformation('staticTestProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('TestNamespace\\TestClass::staticTestProperty'), 'TestNamespace\\TestClass'),
new SymbolInformation('staticTestMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestNamespace\\TestClass::staticTestMethod()'), 'TestNamespace\\TestClass'), new SymbolInformation('testProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('TestNamespace\\TestClass::testProperty'), 'TestNamespace\\TestClass'),
new SymbolInformation('testMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestNamespace\\TestClass::testMethod()'), 'TestNamespace\\TestClass'), new SymbolInformation('staticTestMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestNamespace\\TestClass::staticTestMethod()'), 'TestNamespace\\TestClass'),
new SymbolInformation('TestTrait', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\TestTrait'), 'TestNamespace'), new SymbolInformation('testMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestNamespace\\TestClass::testMethod()'), 'TestNamespace\\TestClass'),
new SymbolInformation('TestInterface', SymbolKind::INTERFACE, $this->getDefinitionLocation('TestNamespace\\TestInterface'), 'TestNamespace'), new SymbolInformation('TestTrait', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\TestTrait'), 'TestNamespace'),
new SymbolInformation('test_function', SymbolKind::FUNCTION, $this->getDefinitionLocation('TestNamespace\\test_function()'), 'TestNamespace'), new SymbolInformation('TestInterface', SymbolKind::INTERFACE, $this->getDefinitionLocation('TestNamespace\\TestInterface'), 'TestNamespace'),
new SymbolInformation('ChildClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\ChildClass'), 'TestNamespace'), new SymbolInformation('test_function', SymbolKind::FUNCTION, $this->getDefinitionLocation('TestNamespace\\test_function()'), 'TestNamespace'),
new SymbolInformation('Example', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\Example'), 'TestNamespace'), new SymbolInformation('ChildClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\ChildClass'), 'TestNamespace'),
new SymbolInformation('__construct', SymbolKind::CONSTRUCTOR, $this->getDefinitionLocation('TestNamespace\\Example::__construct'), 'TestNamespace\\Example'), new SymbolInformation('Example', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\Example'), 'TestNamespace'),
new SymbolInformation('__destruct', SymbolKind::CONSTRUCTOR, $this->getDefinitionLocation('TestNamespace\\Example::__destruct'), 'TestNamespace\\Example'), new SymbolInformation('__construct', SymbolKind::CONSTRUCTOR, $this->getDefinitionLocation('TestNamespace\\Example::__construct'), 'TestNamespace\\Example'),
new SymbolInformation('TestNamespace\\InnerNamespace', SymbolKind::NAMESPACE, $this->getDefinitionLocation('TestNamespace\\InnerNamespace'), 'TestNamespace'), new SymbolInformation('__destruct', SymbolKind::CONSTRUCTOR, $this->getDefinitionLocation('TestNamespace\\Example::__destruct'), 'TestNamespace\\Example'),
new SymbolInformation('InnerClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\InnerNamespace\\InnerClass'), 'TestNamespace\\InnerNamespace'), new SymbolInformation('TestNamespace\\InnerNamespace', SymbolKind::NAMESPACE, $this->getDefinitionLocation('TestNamespace\\InnerNamespace'), 'TestNamespace'),
], $result); new SymbolInformation('InnerClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\InnerNamespace\\InnerClass'), 'TestNamespace\\InnerNamespace'),
// @codingStandardsIgnoreEnd ], $result);
// @codingStandardsIgnoreEnd
});
} }
} }

View File

@ -1,8 +1,9 @@
<?php <?php
declare(strict_types = 1); declare(strict_types=1);
namespace LanguageServer\Tests\Server\TextDocument; namespace LanguageServer\Tests\Server\TextDocument;
use Amp\Loop;
use LanguageServer\Tests\MockProtocolStream; use LanguageServer\Tests\MockProtocolStream;
use LanguageServer\Tests\Server\ServerTestCase; use LanguageServer\Tests\Server\ServerTestCase;
use LanguageServer\{Server, LanguageClient, Project}; use LanguageServer\{Server, LanguageClient, Project};
@ -13,206 +14,241 @@ class HoverTest extends ServerTestCase
{ {
public function testHoverForClassLike() public function testHoverForClassLike()
{ {
// $obj = new TestClass(); Loop::run(function () {
// Get hover for TestClass // $obj = new TestClass();
$reference = $this->getReferenceLocations('TestClass')[1]; // Get hover for TestClass
$result = $this->textDocument->hover( $reference = $this->getReferenceLocations('TestClass')[1];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->hover(
$reference->range->start new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->start
$this->assertEquals(new Hover([ );
new MarkedString('php', "<?php\nclass TestClass implements TestInterface"), $this->assertEquals(new Hover([
'Pariatur ut laborum tempor voluptate consequat ea deserunt.' . "\n\n" . new MarkedString('php', "<?php\nclass TestClass implements TestInterface"),
'Deserunt enim minim sunt sint ea nisi. Deserunt excepteur tempor id nostrud' . "\n" . 'Pariatur ut laborum tempor voluptate consequat ea deserunt.' . "\n\n" .
'laboris commodo ad commodo velit mollit qui non officia id. Nulla duis veniam' . "\n" . 'Deserunt enim minim sunt sint ea nisi. Deserunt excepteur tempor id nostrud' . "\n" .
'veniam officia deserunt et non dolore mollit ea quis eiusmod sit non. Occaecat' . "\n" . 'laboris commodo ad commodo velit mollit qui non officia id. Nulla duis veniam' . "\n" .
'consequat sunt culpa exercitation pariatur id reprehenderit nisi incididunt Lorem' . "\n" . 'veniam officia deserunt et non dolore mollit ea quis eiusmod sit non. Occaecat' . "\n" .
'sint. Officia culpa pariatur laborum nostrud cupidatat consequat mollit.' 'consequat sunt culpa exercitation pariatur id reprehenderit nisi incididunt Lorem' . "\n" .
], $reference->range), $result); 'sint. Officia culpa pariatur laborum nostrud cupidatat consequat mollit.'
], $reference->range), $result);
});
} }
public function testHoverForClassLikeDefinition() public function testHoverForClassLikeDefinition()
{ {
// class TestClass implements TestInterface Loop::run(function () {
// Get hover for TestClass // class TestClass implements TestInterface
$definition = $this->getDefinitionLocation('TestClass'); // Get hover for TestClass
$result = $this->textDocument->hover( $definition = $this->getDefinitionLocation('TestClass');
new TextDocumentIdentifier($definition->uri), $result = yield $this->textDocument->hover(
$definition->range->start new TextDocumentIdentifier($definition->uri),
)->wait(); $definition->range->start
$this->assertEquals(new Hover([ );
new MarkedString('php', "<?php\nclass TestClass implements TestInterface"), $this->assertEquals(new Hover([
'Pariatur ut laborum tempor voluptate consequat ea deserunt.' . "\n\n" . new MarkedString('php', "<?php\nclass TestClass implements TestInterface"),
'Deserunt enim minim sunt sint ea nisi. Deserunt excepteur tempor id nostrud' . "\n" . 'Pariatur ut laborum tempor voluptate consequat ea deserunt.' . "\n\n" .
'laboris commodo ad commodo velit mollit qui non officia id. Nulla duis veniam' . "\n" . 'Deserunt enim minim sunt sint ea nisi. Deserunt excepteur tempor id nostrud' . "\n" .
'veniam officia deserunt et non dolore mollit ea quis eiusmod sit non. Occaecat' . "\n" . 'laboris commodo ad commodo velit mollit qui non officia id. Nulla duis veniam' . "\n" .
'consequat sunt culpa exercitation pariatur id reprehenderit nisi incididunt Lorem' . "\n" . 'veniam officia deserunt et non dolore mollit ea quis eiusmod sit non. Occaecat' . "\n" .
'sint. Officia culpa pariatur laborum nostrud cupidatat consequat mollit.' 'consequat sunt culpa exercitation pariatur id reprehenderit nisi incididunt Lorem' . "\n" .
], $definition->range), $result); 'sint. Officia culpa pariatur laborum nostrud cupidatat consequat mollit.'
], $definition->range), $result);
});
} }
public function testHoverForMethod() public function testHoverForMethod()
{ {
// $obj->testMethod(); Loop::run(function () {
// Get hover for testMethod // $obj->testMethod();
$reference = $this->getReferenceLocations('TestClass::testMethod()')[0]; // Get hover for testMethod
$result = $this->textDocument->hover( $reference = $this->getReferenceLocations('TestClass::testMethod()')[0];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->hover(
$reference->range->end new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->end
$this->assertEquals(new Hover([ );
new MarkedString('php', "<?php\npublic function testMethod(\$testParameter): TestInterface"), $this->assertEquals(new Hover([
'Non culpa nostrud mollit esse sunt laboris in irure ullamco cupidatat amet.' new MarkedString('php', "<?php\npublic function testMethod(\$testParameter): TestInterface"),
], $reference->range), $result); 'Non culpa nostrud mollit esse sunt laboris in irure ullamco cupidatat amet.'
], $reference->range), $result);
});
} }
public function testHoverForProperty() public function testHoverForProperty()
{ {
// echo $obj->testProperty; Loop::run(function () {
// Get hover for testProperty // echo $obj->testProperty;
$reference = $this->getReferenceLocations('TestClass::testProperty')[0]; // Get hover for testProperty
$result = $this->textDocument->hover( $reference = $this->getReferenceLocations('TestClass::testProperty')[0];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->hover(
$reference->range->end new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->end
$this->assertEquals(new Hover([ );
new MarkedString('php', "<?php\npublic \$testProperty;"), $this->assertEquals(new Hover([
'Reprehenderit magna velit mollit ipsum do.' new MarkedString('php', "<?php\npublic \$testProperty;"),
], $reference->range), $result); 'Reprehenderit magna velit mollit ipsum do.'
], $reference->range), $result);
});
} }
public function testHoverForStaticMethod() public function testHoverForStaticMethod()
{ {
// TestClass::staticTestMethod(); Loop::run(function () {
// Get hover for staticTestMethod // TestClass::staticTestMethod();
$reference = $this->getReferenceLocations('TestClass::staticTestMethod()')[0]; // Get hover for staticTestMethod
$result = $this->textDocument->hover( $reference = $this->getReferenceLocations('TestClass::staticTestMethod()')[0];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->hover(
$reference->range->end new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->end
$this->assertEquals(new Hover([ );
new MarkedString('php', "<?php\npublic static function staticTestMethod()"), $this->assertEquals(new Hover([
'Do magna consequat veniam minim proident eiusmod incididunt aute proident.' new MarkedString('php', "<?php\npublic static function staticTestMethod()"),
], $reference->range), $result); 'Do magna consequat veniam minim proident eiusmod incididunt aute proident.'
], $reference->range), $result);
});
} }
public function testHoverForStaticProperty() public function testHoverForStaticProperty()
{ {
// echo TestClass::staticTestProperty; Loop::run(function () {
// Get hover for staticTestProperty // echo TestClass::staticTestProperty;
$reference = $this->getReferenceLocations('TestClass::staticTestProperty')[0]; // Get hover for staticTestProperty
$result = $this->textDocument->hover( $reference = $this->getReferenceLocations('TestClass::staticTestProperty')[0];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->hover(
$reference->range->end new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->end
$this->assertEquals(new Hover([ );
new MarkedString('php', "<?php\npublic static \$staticTestProperty;"), $this->assertEquals(new Hover([
'Lorem excepteur officia sit anim velit veniam enim.' new MarkedString('php', "<?php\npublic static \$staticTestProperty;"),
], $reference->range), $result); 'Lorem excepteur officia sit anim velit veniam enim.'
], $reference->range), $result);
});
} }
public function testHoverForClassConstant() public function testHoverForClassConstant()
{ {
// echo TestClass::TEST_CLASS_CONST; Loop::run(function () {
// Get hover for TEST_CLASS_CONST // echo TestClass::TEST_CLASS_CONST;
$reference = $this->getReferenceLocations('TestClass::TEST_CLASS_CONST')[0]; // Get hover for TEST_CLASS_CONST
$result = $this->textDocument->hover( $reference = $this->getReferenceLocations('TestClass::TEST_CLASS_CONST')[0];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->hover(
$reference->range->end new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->end
$this->assertEquals(new Hover([ );
new MarkedString('php', "<?php\nconst TEST_CLASS_CONST = 123;"), $this->assertEquals(new Hover([
'Anim labore veniam consectetur laboris minim quis aute aute esse nulla ad.' new MarkedString('php', "<?php\nconst TEST_CLASS_CONST = 123;"),
], $reference->range), $result); 'Anim labore veniam consectetur laboris minim quis aute aute esse nulla ad.'
], $reference->range), $result);
});
} }
public function testHoverForFunction() public function testHoverForFunction()
{ {
// test_function(); Loop::run(function () {
// Get hover for test_function // test_function();
$reference = $this->getReferenceLocations('test_function()')[0]; // Get hover for test_function
$result = $this->textDocument->hover( $reference = $this->getReferenceLocations('test_function()')[0];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->hover(
$reference->range->end new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->end
$this->assertEquals(new Hover([ );
new MarkedString('php', "<?php\nfunction test_function()"), $this->assertEquals(new Hover([
'Officia aliquip adipisicing et nulla et laboris dolore labore.' new MarkedString('php', "<?php\nfunction test_function()"),
], $reference->range), $result); 'Officia aliquip adipisicing et nulla et laboris dolore labore.'
], $reference->range), $result);
});
} }
public function testHoverForConstant() public function testHoverForConstant()
{ {
// echo TEST_CONST; Loop::run(function () {
// Get hover for TEST_CONST // echo TEST_CONST;
$reference = $this->getReferenceLocations('TEST_CONST')[0]; // Get hover for TEST_CONST
$result = $this->textDocument->hover( $reference = $this->getReferenceLocations('TEST_CONST')[0];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->hover(
$reference->range->end new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->end
$this->assertEquals(new Hover([ );
new MarkedString('php', "<?php\nconst TEST_CONST = 123;"), $this->assertEquals(new Hover([
'Esse commodo excepteur pariatur Lorem est aute incididunt reprehenderit.' new MarkedString('php', "<?php\nconst TEST_CONST = 123;"),
], $reference->range), $result); 'Esse commodo excepteur pariatur Lorem est aute incididunt reprehenderit.'
], $reference->range), $result);
});
} }
public function testHoverForGlobalConstant() public function testHoverForGlobalConstant()
{ {
// print TEST_DEFINE_CONSTANT ? 'true' : 'false'; Loop::run(function () {
// Get hover for TEST_DEFINE_CONSTANT // print TEST_DEFINE_CONSTANT ? 'true' : 'false';
$reference = $this->getReferenceLocations('TEST_DEFINE_CONSTANT')[0]; // Get hover for TEST_DEFINE_CONSTANT
$result = $this->textDocument->hover( $reference = $this->getReferenceLocations('TEST_DEFINE_CONSTANT')[0];
new TextDocumentIdentifier($reference->uri), $result = yield $this->textDocument->hover(
$reference->range->end new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->end
// TODO - should pretty print with fqns, like \define, \false. Not yet supported by tolerant-php-parser );
$this->assertEquals(new Hover([ // TODO - should pretty print with fqns, like \define, \false. Not yet supported by tolerant-php-parser
new MarkedString('php', "<?php\ndefine('TEST_DEFINE_CONSTANT', false)"), $this->assertEquals(new Hover([
'Lorem ipsum dolor sit amet, consectetur.' new MarkedString('php', "<?php\ndefine('TEST_DEFINE_CONSTANT', false)"),
], $reference->range), $result); 'Lorem ipsum dolor sit amet, consectetur.'
], $reference->range), $result);
});
} }
public function testHoverForVariable() public function testHoverForVariable()
{ {
// echo $var; Loop::run(function () {
// Get hover for $var // echo $var;
$uri = pathToUri(realpath(__DIR__ . '/../../../fixtures/references.php')); // Get hover for $var
$result = $this->textDocument->hover(new TextDocumentIdentifier($uri), new Position(13, 7))->wait(); $uri = pathToUri(realpath(__DIR__ . '/../../../fixtures/references.php'));
$this->assertEquals(new Hover( $result = yield $this->textDocument->hover(
[new MarkedString('php', "<?php\n\$var = 123")], new TextDocumentIdentifier($uri),
new Range(new Position(13, 5), new Position(13, 9)) new Position(13, 7)
), $result); );
$this->assertEquals(new Hover(
[new MarkedString('php', "<?php\n\$var = 123")],
new Range(new Position(13, 5), new Position(13, 9))
), $result);
});
} }
public function testHoverForParam() public function testHoverForParam()
{ {
// echo $param; Loop::run(function () {
// Get hover for $param // echo $param;
$uri = pathToUri(realpath(__DIR__ . '/../../../fixtures/references.php')); // Get hover for $param
$result = $this->textDocument->hover(new TextDocumentIdentifier($uri), new Position(22, 11))->wait(); $uri = pathToUri(realpath(__DIR__ . '/../../../fixtures/references.php'));
$this->assertEquals(new Hover( $result = yield $this->textDocument->hover(
[ new TextDocumentIdentifier($uri),
new MarkedString('php', "<?php\nTestClass \$param"), new Position(22, 11)
'Adipisicing non non cillum sint incididunt cillum enim mollit.' );
], $this->assertEquals(new Hover(
new Range(new Position(22, 9), new Position(22, 15)) [
), $result); new MarkedString('php', "<?php\nTestClass \$param"),
'Adipisicing non non cillum sint incididunt cillum enim mollit.'
],
new Range(new Position(22, 9), new Position(22, 15))
), $result);
});
} }
public function testHoverForThis() public function testHoverForThis()
{ {
// $this; Loop::run(function () {
// Get hover for $this // $this;
$uri = pathToUri(realpath(__DIR__ . '/../../../fixtures/global_symbols.php')); // Get hover for $this
$result = $this->textDocument->hover(new TextDocumentIdentifier($uri), new Position(59, 11))->wait(); $uri = pathToUri(realpath(__DIR__ . '/../../../fixtures/global_symbols.php'));
$this->assertEquals(new Hover([ $result = yield $this->textDocument->hover(
new MarkedString('php', "<?php\nclass TestClass implements TestInterface"), new TextDocumentIdentifier($uri),
'Pariatur ut laborum tempor voluptate consequat ea deserunt.' . "\n\n" . new Position(59, 11)
'Deserunt enim minim sunt sint ea nisi. Deserunt excepteur tempor id nostrud' . "\n" . );
'laboris commodo ad commodo velit mollit qui non officia id. Nulla duis veniam' . "\n" . $this->assertEquals(new Hover([
'veniam officia deserunt et non dolore mollit ea quis eiusmod sit non. Occaecat' . "\n" . new MarkedString('php', "<?php\nclass TestClass implements TestInterface"),
'consequat sunt culpa exercitation pariatur id reprehenderit nisi incididunt Lorem' . "\n" . 'Pariatur ut laborum tempor voluptate consequat ea deserunt.' . "\n\n" .
'sint. Officia culpa pariatur laborum nostrud cupidatat consequat mollit.' 'Deserunt enim minim sunt sint ea nisi. Deserunt excepteur tempor id nostrud' . "\n" .
], new Range(new Position(59, 8), new Position(59, 13))), $result); 'laboris commodo ad commodo velit mollit qui non officia id. Nulla duis veniam' . "\n" .
'veniam officia deserunt et non dolore mollit ea quis eiusmod sit non. Occaecat' . "\n" .
'consequat sunt culpa exercitation pariatur id reprehenderit nisi incididunt Lorem' . "\n" .
'sint. Officia culpa pariatur laborum nostrud cupidatat consequat mollit.'
], new Range(new Position(59, 8), new Position(59, 13))), $result);
});
} }
} }

View File

@ -1,18 +1,18 @@
<?php <?php
declare(strict_types = 1); declare(strict_types=1);
namespace LanguageServer\Tests\Server\TextDocument; namespace LanguageServer\Tests\Server\TextDocument;
use PHPUnit\Framework\TestCase; use Amp\Deferred;
use LanguageServer\Tests\MockProtocolStream; use Amp\Delayed;
use LanguageServer\{ use Amp\Loop;
Server, Client, LanguageClient, ClientHandler, PhpDocumentLoader, DefinitionResolver
};
use LanguageServer\Index\{Index, ProjectIndex, DependenciesIndex};
use LanguageServer\ContentRetriever\FileSystemContentRetriever;
use LanguageServerProtocol\{TextDocumentItem, DiagnosticSeverity};
use Sabre\Event\Promise;
use JsonMapper; use JsonMapper;
use LanguageServer\{Client, ClientHandler, DefinitionResolver, LanguageClient, PhpDocumentLoader, Server};
use LanguageServer\ContentRetriever\FileSystemContentRetriever;
use LanguageServer\Index\{DependenciesIndex, Index, ProjectIndex};
use LanguageServer\Tests\MockProtocolStream;
use LanguageServerProtocol\{DiagnosticSeverity, TextDocumentItem};
use PHPUnit\Framework\TestCase;
class ParseErrorsTest extends TestCase class ParseErrorsTest extends TestCase
{ {
@ -21,22 +21,31 @@ class ParseErrorsTest extends TestCase
*/ */
private $textDocument; private $textDocument;
/**
* @var Deferred
*/
private $args; private $args;
public function setUp() public function setUp()
{ {
$client = new LanguageClient(new MockProtocolStream, new MockProtocolStream); $client = new LanguageClient(new MockProtocolStream, new MockProtocolStream);
$client->textDocument = new class($this->args) extends Client\TextDocument { $this->args = new Deferred();
$client->textDocument = new class($this->args) extends Client\TextDocument
{
/** @var Deferred */
private $args; private $args;
public function __construct(&$args)
public function __construct($args)
{ {
parent::__construct(new ClientHandler(new MockProtocolStream, new MockProtocolStream), new JsonMapper); parent::__construct(new ClientHandler(new MockProtocolStream, new MockProtocolStream), new JsonMapper);
$this->args = &$args; $this->args = $args;
} }
public function publishDiagnostics(string $uri, array $diagnostics): Promise
public function publishDiagnostics(string $uri, array $diagnostics): \Generator
{ {
$this->args = func_get_args(); $this->args->resolve(func_get_args());
return Promise\resolve(null); yield new Delayed(0);
return null;
} }
}; };
$projectIndex = new ProjectIndex(new Index, new DependenciesIndex); $projectIndex = new ProjectIndex(new Index, new DependenciesIndex);
@ -57,98 +66,102 @@ class ParseErrorsTest extends TestCase
public function testParseErrorsArePublishedAsDiagnostics() public function testParseErrorsArePublishedAsDiagnostics()
{ {
$this->openFile(__DIR__ . '/../../../fixtures/invalid_file.php'); Loop::run(function () {
$this->assertEquals([ $this->openFile(__DIR__ . '/../../../fixtures/invalid_file.php');
'whatever', $this->assertEquals([
[[ 'whatever',
'range' => [ [[
'start' => [ 'range' => [
'line' => 2, 'start' => [
'character' => 9 'line' => 2,
'character' => 9
],
'end' => [
'line' => 2,
'character' => 9
]
], ],
'end' => [ 'severity' => DiagnosticSeverity::ERROR,
'line' => 2, 'code' => null,
'character' => 9 'source' => 'php',
] 'message' => "'Name' expected."
], ],
'severity' => DiagnosticSeverity::ERROR, [
'code' => null, 'range' => [
'source' => 'php', 'start' => [
'message' => "'Name' expected." 'line' => 2,
], 'character' => 9
[ ],
'range' => [ 'end' => [
'start' => [ 'line' => 2,
'line' => 2, 'character' => 9
'character' => 9 ]
],
'severity' => DiagnosticSeverity::ERROR,
'code' => null,
'source' => 'php',
'message' => "'{' expected."
], ],
'end' => [ [
'line' => 2, 'range' => [
'character' => 9 'start' => [
] 'line' => 2,
], 'character' => 9
'severity' => DiagnosticSeverity::ERROR, ],
'code' => null, 'end' => [
'source' => 'php', 'line' => 2,
'message' => "'{' expected." 'character' => 9
], ]
[ ],
'range' => [ 'severity' => DiagnosticSeverity::ERROR,
'start' => [ 'code' => null,
'line' => 2, 'source' => 'php',
'character' => 9 'message' => "'}' expected."
], ],
'end' => [ [
'line' => 2, 'range' => [
'character' => 9 'start' => [
] 'line' => 2,
], 'character' => 15
'severity' => DiagnosticSeverity::ERROR, ],
'code' => null, 'end' => [
'source' => 'php', 'line' => 2,
'message' => "'}' expected." 'character' => 15
], ]
[ ],
'range' => [ 'severity' => DiagnosticSeverity::ERROR,
'start' => [ 'code' => null,
'line' => 2, 'source' => 'php',
'character' => 15 'message' => "'Name' expected."
], ]]
'end' => [ ], json_decode(json_encode(yield $this->args->promise()), true));
'line' => 2, });
'character' => 15
]
],
'severity' => DiagnosticSeverity::ERROR,
'code' => null,
'source' => 'php',
'message' => "'Name' expected."
]]
], json_decode(json_encode($this->args), true));
} }
public function testParseErrorsWithOnlyStartLine() public function testParseErrorsWithOnlyStartLine()
{ {
$this->markTestIncomplete('This diagnostic not yet implemented in tolerant-php-parser'); Loop::run(function () {
$this->openFile(__DIR__ . '/../../../fixtures/namespace_not_first.php'); $this->markTestIncomplete('This diagnostic not yet implemented in tolerant-php-parser');
$this->assertEquals([ yield $this->openFile(__DIR__ . '/../../../fixtures/namespace_not_first.php');
'whatever', $this->assertEquals([
[[ 'whatever',
'range' => [ [[
'start' => [ 'range' => [
'line' => 4, 'start' => [
'character' => 0 'line' => 4,
'character' => 0
],
'end' => [
'line' => 4,
'character' => 0
]
], ],
'end' => [ 'severity' => DiagnosticSeverity::ERROR,
'line' => 4, 'code' => null,
'character' => 0 'source' => 'php',
] 'message' => "Namespace declaration statement has to be the very first statement in the script"
], ]]
'severity' => DiagnosticSeverity::ERROR, ], json_decode(json_encode(yield $this->args->promise()), true));
'code' => null, });
'source' => 'php',
'message' => "Namespace declaration statement has to be the very first statement in the script"
]]
], json_decode(json_encode($this->args), true));
} }
} }

View File

@ -1,8 +1,9 @@
<?php <?php
declare(strict_types = 1); declare(strict_types=1);
namespace LanguageServer\Tests\Server\TextDocument\References; namespace LanguageServer\Tests\Server\TextDocument\References;
use Amp\Loop;
use LanguageServer\{ use LanguageServer\{
LanguageClient, PhpDocumentLoader, Server, DefinitionResolver LanguageClient, PhpDocumentLoader, Server, DefinitionResolver
}; };
@ -20,49 +21,55 @@ class GlobalFallbackTest extends ServerTestCase
{ {
public function setUp() public function setUp()
{ {
$projectIndex = new ProjectIndex(new Index, new DependenciesIndex); $projectIndex = new ProjectIndex(new Index, new DependenciesIndex);
$projectIndex->setComplete(); $projectIndex->setComplete();
$definitionResolver = new DefinitionResolver($projectIndex); $definitionResolver = new DefinitionResolver($projectIndex);
$client = new LanguageClient(new MockProtocolStream, new MockProtocolStream); $client = new LanguageClient(new MockProtocolStream, new MockProtocolStream);
$this->documentLoader = new PhpDocumentLoader(new FileSystemContentRetriever, $projectIndex, $definitionResolver); $this->documentLoader = new PhpDocumentLoader(new FileSystemContentRetriever, $projectIndex, $definitionResolver);
$this->textDocument = new Server\TextDocument($this->documentLoader, $definitionResolver, $client, $projectIndex); $this->textDocument = new Server\TextDocument($this->documentLoader, $definitionResolver, $client, $projectIndex);
$this->documentLoader->open('global_fallback', file_get_contents(__DIR__ . '/../../../../fixtures/global_fallback.php')); $this->documentLoader->open('global_fallback', file_get_contents(__DIR__ . '/../../../../fixtures/global_fallback.php'));
$this->documentLoader->open('global_symbols', file_get_contents(__DIR__ . '/../../../../fixtures/global_symbols.php')); $this->documentLoader->open('global_symbols', file_get_contents(__DIR__ . '/../../../../fixtures/global_symbols.php'));
} }
public function testClassDoesNotFallback() public function testClassDoesNotFallback()
{ {
// class TestClass implements TestInterface Loop::run(function () {
// Get references for TestClass // class TestClass implements TestInterface
$result = $this->textDocument->references( // Get references for TestClass
new ReferenceContext, $result = yield $this->textDocument->references(
new TextDocumentIdentifier('global_symbols'), new ReferenceContext,
new Position(6, 9) new TextDocumentIdentifier('global_symbols'),
)->wait(); new Position(6, 9)
$this->assertEquals([], $result); );
$this->assertEquals([], $result);
});
} }
public function testFallsBackForConstants() public function testFallsBackForConstants()
{ {
// const TEST_CONST = 123; Loop::run(function () {
// Get references for TEST_CONST // const TEST_CONST = 123;
$result = $this->textDocument->references( // Get references for TEST_CONST
new ReferenceContext, $result = yield $this->textDocument->references(
new TextDocumentIdentifier('global_symbols'), new ReferenceContext,
new Position(9, 13) new TextDocumentIdentifier('global_symbols'),
)->wait(); new Position(9, 13)
$this->assertEquals([new Location('global_fallback', new Range(new Position(6, 5), new Position(6, 15)))], $result); );
$this->assertEquals([new Location('global_fallback', new Range(new Position(6, 5), new Position(6, 15)))], $result);
});
} }
public function testFallsBackForFunctions() public function testFallsBackForFunctions()
{ {
// function test_function() Loop::run(function () {
// Get references for test_function // function test_function()
$result = $this->textDocument->references( // Get references for test_function
new ReferenceContext, $result = yield $this->textDocument->references(
new TextDocumentIdentifier('global_symbols'), new ReferenceContext,
new Position(78, 16) new TextDocumentIdentifier('global_symbols'),
)->wait(); new Position(78, 16)
$this->assertEquals([new Location('global_fallback', new Range(new Position(5, 0), new Position(5, 13)))], $result); );
$this->assertEquals([new Location('global_fallback', new Range(new Position(5, 0), new Position(5, 13)))], $result);
});
} }
} }

View File

@ -1,8 +1,9 @@
<?php <?php
declare(strict_types = 1); declare(strict_types=1);
namespace LanguageServer\Tests\Server\TextDocument\References; namespace LanguageServer\Tests\Server\TextDocument\References;
use Amp\Loop;
use LanguageServerProtocol\{TextDocumentIdentifier, Position, ReferenceContext, Location, Range}; use LanguageServerProtocol\{TextDocumentIdentifier, Position, ReferenceContext, Location, Range};
use LanguageServer\Tests\Server\ServerTestCase; use LanguageServer\Tests\Server\ServerTestCase;
use function LanguageServer\pathToUri; use function LanguageServer\pathToUri;
@ -11,191 +12,219 @@ class GlobalTest extends ServerTestCase
{ {
public function testReferencesForClassLike() public function testReferencesForClassLike()
{ {
// class TestClass implements TestInterface Loop::run(function () {
// Get references for TestClass // class TestClass implements TestInterface
$definition = $this->getDefinitionLocation('TestClass'); // Get references for TestClass
$result = $this->textDocument->references( $definition = $this->getDefinitionLocation('TestClass');
new ReferenceContext, $result = yield $this->textDocument->references(
new TextDocumentIdentifier($definition->uri), new ReferenceContext,
$definition->range->start new TextDocumentIdentifier($definition->uri),
)->wait(); $definition->range->start
$this->assertEquals($this->getReferenceLocations('TestClass'), $result); );
$this->assertEquals($this->getReferenceLocations('TestClass'), $result);
});
} }
public function testReferencesForClassConstants() public function testReferencesForClassConstants()
{ {
// const TEST_CLASS_CONST = 123; Loop::run(function () {
// Get references for TEST_CLASS_CONST // const TEST_CLASS_CONST = 123;
$definition = $this->getDefinitionLocation('TestClass::TEST_CLASS_CONST'); // Get references for TEST_CLASS_CONST
$result = $this->textDocument->references( $definition = $this->getDefinitionLocation('TestClass::TEST_CLASS_CONST');
new ReferenceContext, $result = yield $this->textDocument->references(
new TextDocumentIdentifier($definition->uri), new ReferenceContext,
$definition->range->start new TextDocumentIdentifier($definition->uri),
)->wait(); $definition->range->start
$this->assertEquals($this->getReferenceLocations('TestClass::TEST_CLASS_CONST'), $result); );
$this->assertEquals($this->getReferenceLocations('TestClass::TEST_CLASS_CONST'), $result);
});
} }
public function testReferencesForConstants() public function testReferencesForConstants()
{ {
// const TEST_CONST = 123; Loop::run(function () {
// Get references for TEST_CONST // const TEST_CONST = 123;
$definition = $this->getDefinitionLocation('TEST_CONST'); // Get references for TEST_CONST
$result = $this->textDocument->references( $definition = $this->getDefinitionLocation('TEST_CONST');
new ReferenceContext, $result = yield $this->textDocument->references(
new TextDocumentIdentifier($definition->uri), new ReferenceContext,
$definition->range->start new TextDocumentIdentifier($definition->uri),
)->wait(); $definition->range->start
$this->assertEquals($this->getReferenceLocations('TEST_CONST'), $result); );
$this->assertEquals($this->getReferenceLocations('TEST_CONST'), $result);
});
} }
public function testReferencesForStaticMethods() public function testReferencesForStaticMethods()
{ {
// public static function staticTestMethod() Loop::run(function () {
// Get references for staticTestMethod // public static function staticTestMethod()
$definition = $this->getDefinitionLocation('TestClass::staticTestMethod()'); // Get references for staticTestMethod
$result = $this->textDocument->references( $definition = $this->getDefinitionLocation('TestClass::staticTestMethod()');
new ReferenceContext, $result = yield $this->textDocument->references(
new TextDocumentIdentifier($definition->uri), new ReferenceContext,
$definition->range->start new TextDocumentIdentifier($definition->uri),
)->wait(); $definition->range->start
$this->assertEquals($this->getReferenceLocations('TestClass::staticTestMethod()'), $result); );
$this->assertEquals($this->getReferenceLocations('TestClass::staticTestMethod()'), $result);
});
} }
public function testReferencesForStaticProperties() public function testReferencesForStaticProperties()
{ {
// public static $staticTestProperty; Loop::run(function () {
// Get references for $staticTestProperty // public static $staticTestProperty;
$definition = $this->getDefinitionLocation('TestClass::staticTestProperty'); // Get references for $staticTestProperty
$result = $this->textDocument->references( $definition = $this->getDefinitionLocation('TestClass::staticTestProperty');
new ReferenceContext, $result = yield $this->textDocument->references(
new TextDocumentIdentifier($definition->uri), new ReferenceContext,
$definition->range->start new TextDocumentIdentifier($definition->uri),
)->wait(); $definition->range->start
$this->assertEquals($this->getReferenceLocations('TestClass::staticTestProperty'), $result); );
$this->assertEquals($this->getReferenceLocations('TestClass::staticTestProperty'), $result);
});
} }
public function testReferencesForMethods() public function testReferencesForMethods()
{ {
// public function testMethod($testParameter) Loop::run(function () {
// Get references for testMethod // public function testMethod($testParameter)
$definition = $this->getDefinitionLocation('TestClass::testMethod()'); // Get references for testMethod
$result = $this->textDocument->references( $definition = $this->getDefinitionLocation('TestClass::testMethod()');
new ReferenceContext, $result = yield $this->textDocument->references(
new TextDocumentIdentifier($definition->uri), new ReferenceContext,
$definition->range->start new TextDocumentIdentifier($definition->uri),
)->wait(); $definition->range->start
$this->assertEquals($this->getReferenceLocations('TestClass::testMethod()'), $result); );
$this->assertEquals($this->getReferenceLocations('TestClass::testMethod()'), $result);
});
} }
public function testReferencesForProperties() public function testReferencesForProperties()
{ {
// public $testProperty; Loop::run(function () {
// Get references for testProperty // public $testProperty;
$definition = $this->getDefinitionLocation('TestClass::testProperty'); // Get references for testProperty
$result = $this->textDocument->references( $definition = $this->getDefinitionLocation('TestClass::testProperty');
new ReferenceContext, $result = yield $this->textDocument->references(
new TextDocumentIdentifier($definition->uri), new ReferenceContext,
$definition->range->start new TextDocumentIdentifier($definition->uri),
)->wait(); $definition->range->start
$this->assertEquals($this->getReferenceLocations('TestClass::testProperty'), $result); );
$this->assertEquals($this->getReferenceLocations('TestClass::testProperty'), $result);
});
} }
public function testReferencesForVariables() public function testReferencesForVariables()
{ {
// $var = 123; Loop::run(function () {
// Get definition for $var // $var = 123;
$uri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php')); // Get definition for $var
$result = $this->textDocument->references( $uri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php'));
new ReferenceContext, $result = yield $this->textDocument->references(
new TextDocumentIdentifier($uri), new ReferenceContext,
new Position(12, 3) new TextDocumentIdentifier($uri),
)->wait(); new Position(12, 3)
$this->assertEquals([ );
new Location($uri, new Range(new Position(12, 0), new Position(12, 4))), $this->assertEquals([
new Location($uri, new Range(new Position(13, 5), new Position(13, 9))), new Location($uri, new Range(new Position(12, 0), new Position(12, 4))),
new Location($uri, new Range(new Position(26, 9), new Position(26, 13))) new Location($uri, new Range(new Position(13, 5), new Position(13, 9))),
], $result); new Location($uri, new Range(new Position(26, 9), new Position(26, 13)))
], $result);
});
} }
public function testReferencesForFunctionParams() public function testReferencesForFunctionParams()
{ {
// function whatever(TestClass $param): TestClass Loop::run(function () {
// Get references for $param // function whatever(TestClass $param): TestClass
$uri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php')); // Get references for $param
$result = $this->textDocument->references( $uri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php'));
new ReferenceContext, $result = yield $this->textDocument->references(
new TextDocumentIdentifier($uri), new ReferenceContext,
new Position(21, 32) new TextDocumentIdentifier($uri),
)->wait(); new Position(21, 32)
$this->assertEquals([new Location($uri, new Range(new Position(22, 9), new Position(22, 15)))], $result); );
$this->assertEquals([new Location($uri, new Range(new Position(22, 9), new Position(22, 15)))], $result);
});
} }
public function testReferencesForFunctions() public function testReferencesForFunctions()
{ {
// function test_function() Loop::run(function () {
// Get references for test_function // function test_function()
$referencesUri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php')); // Get references for test_function
$symbolsUri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/symbols.php')); $referencesUri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/references.php'));
$result = $this->textDocument->references( $symbolsUri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/symbols.php'));
new ReferenceContext, $result = yield $this->textDocument->references(
new TextDocumentIdentifier($symbolsUri), new ReferenceContext,
new Position(78, 16) new TextDocumentIdentifier($symbolsUri),
)->wait(); new Position(78, 16)
$this->assertEquals([ );
new Location($referencesUri, new Range(new Position(10, 0), new Position(10, 13))), $this->assertEquals([
new Location($referencesUri, new Range(new Position(31, 13), new Position(31, 40))) new Location($referencesUri, new Range(new Position(10, 0), new Position(10, 13))),
], $result); new Location($referencesUri, new Range(new Position(31, 13), new Position(31, 40)))
], $result);
});
} }
public function testReferencesForReference() public function testReferencesForReference()
{ {
// $obj = new TestClass(); Loop::run(function () {
// Get references for TestClass // $obj = new TestClass();
$reference = $this->getReferenceLocations('TestClass')[1]; // Get references for TestClass
$result = $this->textDocument->references( $reference = $this->getReferenceLocations('TestClass')[1];
new ReferenceContext, $result = yield $this->textDocument->references(
new TextDocumentIdentifier($reference->uri), new ReferenceContext,
$reference->range->start new TextDocumentIdentifier($reference->uri),
)->wait(); $reference->range->start
$this->assertEquals($this->getReferenceLocations('TestClass'), $result); );
$this->assertEquals($this->getReferenceLocations('TestClass'), $result);
});
} }
public function testReferencesForUnusedClass() public function testReferencesForUnusedClass()
{ {
// class UnusedClass Loop::run(function () {
// Get references for UnusedClass // class UnusedClass
$symbolsUri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/global_symbols.php')); // Get references for UnusedClass
$result = $this->textDocument->references( $symbolsUri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/global_symbols.php'));
new ReferenceContext, $result = yield $this->textDocument->references(
new TextDocumentIdentifier($symbolsUri), new ReferenceContext,
new Position(111, 10) new TextDocumentIdentifier($symbolsUri),
)->wait(); new Position(111, 10)
$this->assertEquals([], $result); );
$this->assertEquals([], $result);
});
} }
public function testReferencesForUnusedProperty() public function testReferencesForUnusedProperty()
{ {
// public $unusedProperty Loop::run(function () {
// Get references for unusedProperty // public $unusedProperty
$symbolsUri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/global_symbols.php')); // Get references for unusedProperty
$result = $this->textDocument->references( $symbolsUri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/global_symbols.php'));
new ReferenceContext, $result = yield $this->textDocument->references(
new TextDocumentIdentifier($symbolsUri), new ReferenceContext,
new Position(113, 18) new TextDocumentIdentifier($symbolsUri),
)->wait(); new Position(113, 18)
$this->assertEquals([], $result); );
$this->assertEquals([], $result);
});
} }
public function testReferencesForUnusedMethod() public function testReferencesForUnusedMethod()
{ {
// public function unusedMethod() Loop::run(function () {
// Get references for unusedMethod // public function unusedMethod()
$symbolsUri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/global_symbols.php')); // Get references for unusedMethod
$result = $this->textDocument->references( $symbolsUri = pathToUri(realpath(__DIR__ . '/../../../../fixtures/global_symbols.php'));
new ReferenceContext, $result = yield $this->textDocument->references(
new TextDocumentIdentifier($symbolsUri), new ReferenceContext,
new Position(115, 26) new TextDocumentIdentifier($symbolsUri),
)->wait(); new Position(115, 26)
$this->assertEquals([], $result); );
$this->assertEquals([], $result);
});
} }
} }

View File

@ -1,8 +1,9 @@
<?php <?php
declare(strict_types = 1); declare(strict_types=1);
namespace LanguageServer\Tests\Server\TextDocument\References; namespace LanguageServer\Tests\Server\TextDocument\References;
use Amp\Loop;
use LanguageServerProtocol\{TextDocumentIdentifier, Position, ReferenceContext, Location, Range}; use LanguageServerProtocol\{TextDocumentIdentifier, Position, ReferenceContext, Location, Range};
use function LanguageServer\pathToUri; use function LanguageServer\pathToUri;
@ -20,14 +21,16 @@ class NamespacedTest extends GlobalTest
public function testReferencesForNamespaces() public function testReferencesForNamespaces()
{ {
// namespace TestNamespace; Loop::run(function () {
// Get references for TestNamespace // namespace TestNamespace;
$definition = parent::getDefinitionLocation('TestNamespace'); // Get references for TestNamespace
$result = $this->textDocument->references( $definition = parent::getDefinitionLocation('TestNamespace');
new ReferenceContext, $result = yield $this->textDocument->references(
new TextDocumentIdentifier($definition->uri), new ReferenceContext,
$definition->range->end new TextDocumentIdentifier($definition->uri),
)->wait(); $definition->range->end
$this->assertEquals(parent::getReferenceLocations('TestNamespace'), $result); );
$this->assertEquals(parent::getReferenceLocations('TestNamespace'), $result);
});
} }
} }

View File

@ -1,8 +1,9 @@
<?php <?php
declare(strict_types = 1); declare(strict_types=1);
namespace LanguageServer\Tests\Server\TextDocument; namespace LanguageServer\Tests\Server\TextDocument;
use Amp\Loop;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use LanguageServer\Tests\MockProtocolStream; use LanguageServer\Tests\MockProtocolStream;
use LanguageServer\{ use LanguageServer\{
@ -50,13 +51,15 @@ class SignatureHelpTest extends TestCase
*/ */
public function testSignatureHelp(Position $position, SignatureHelp $expectedSignature) public function testSignatureHelp(Position $position, SignatureHelp $expectedSignature)
{ {
$callsUri = pathToUri(__DIR__ . '/../../../fixtures/signature_help/calls.php'); Loop::run(function () use ($position, $expectedSignature) {
$this->loader->open($callsUri, file_get_contents($callsUri)); $callsUri = pathToUri(__DIR__ . '/../../../fixtures/signature_help/calls.php');
$signatureHelp = $this->textDocument->signatureHelp( $this->loader->open($callsUri, file_get_contents($callsUri));
new TextDocumentIdentifier($callsUri), $signatureHelp = yield $this->textDocument->signatureHelp(
$position new TextDocumentIdentifier($callsUri),
)->wait(); $position
$this->assertEquals($expectedSignature, $signatureHelp); );
$this->assertEquals($expectedSignature, $signatureHelp);
});
} }
public function signatureHelpProvider(): array public function signatureHelpProvider(): array

View File

@ -1,42 +1,46 @@
<?php <?php
declare(strict_types = 1); declare(strict_types=1);
namespace LanguageServer\Tests\Server\Workspace; namespace LanguageServer\Tests\Server\Workspace;
use Amp\Deferred;
use Amp\Loop;
use LanguageServer\ContentRetriever\FileSystemContentRetriever; use LanguageServer\ContentRetriever\FileSystemContentRetriever;
use LanguageServer\{DefinitionResolver, LanguageClient, PhpDocumentLoader, Server}; use LanguageServer\{DefinitionResolver, Event\MessageEvent, LanguageClient, PhpDocumentLoader, Server};
use LanguageServer\Index\{DependenciesIndex, Index, ProjectIndex}; use LanguageServer\Index\{DependenciesIndex, Index, ProjectIndex};
use LanguageServerProtocol\{FileChangeType, FileEvent}; use LanguageServerProtocol\{FileChangeType, FileEvent};
use LanguageServer\Message; use LanguageServer\Message;
use LanguageServer\Tests\MockProtocolStream; use LanguageServer\Tests\MockProtocolStream;
use LanguageServer\Tests\Server\ServerTestCase; use LanguageServer\Tests\Server\ServerTestCase;
use LanguageServer\Server\Workspace; use LanguageServer\Server\Workspace;
use Sabre\Event\Loop;
class DidChangeWatchedFilesTest extends ServerTestCase class DidChangeWatchedFilesTest extends ServerTestCase
{ {
public function testDeletingFileClearsAllDiagnostics() public function testDeletingFileClearsAllDiagnostics()
{ {
$client = new LanguageClient(new MockProtocolStream(), $writer = new MockProtocolStream()); Loop::run(function () {
$projectIndex = new ProjectIndex($sourceIndex = new Index(), $dependenciesIndex = new DependenciesIndex()); $client = new LanguageClient(new MockProtocolStream(), $writer = new MockProtocolStream());
$definitionResolver = new DefinitionResolver($projectIndex); $projectIndex = new ProjectIndex($sourceIndex = new Index(), $dependenciesIndex = new DependenciesIndex());
$loader = new PhpDocumentLoader(new FileSystemContentRetriever(), $projectIndex, $definitionResolver); $definitionResolver = new DefinitionResolver($projectIndex);
$workspace = new Server\Workspace($client, $projectIndex, $dependenciesIndex, $sourceIndex, null, $loader, null); $loader = new PhpDocumentLoader(new FileSystemContentRetriever(), $projectIndex, $definitionResolver);
$workspace = new Server\Workspace($client, $projectIndex, $dependenciesIndex, $sourceIndex, null, $loader, null);
$fileEvent = new FileEvent('my uri', FileChangeType::DELETED); $fileEvent = new FileEvent('my uri', FileChangeType::DELETED);
$isDiagnosticsCleared = false; $isDiagnosticsCleared = false;
$writer->on('message', function (Message $message) use ($fileEvent, &$isDiagnosticsCleared) { $deferred = new Deferred();
if ($message->body->method === "textDocument/publishDiagnostics") { $writer->addListener('message', function (MessageEvent $messageEvent) use ($deferred, $fileEvent, &$isDiagnosticsCleared) {
$this->assertEquals($message->body->params->uri, $fileEvent->uri); $message = $messageEvent->getMessage();
$this->assertEquals($message->body->params->diagnostics, []); if ($message->body->method === "textDocument/publishDiagnostics") {
$isDiagnosticsCleared = true; $this->assertEquals($message->body->params->uri, $fileEvent->uri);
} $this->assertEquals($message->body->params->diagnostics, []);
$deferred->resolve(true);
}
});
$workspace->didChangeWatchedFiles([$fileEvent]);
$this->assertTrue(yield $deferred->promise(), "Deleting file should clear all diagnostics.");
}); });
$workspace->didChangeWatchedFiles([$fileEvent]);
Loop\tick(true);
$this->assertTrue($isDiagnosticsCleared, "Deleting file should clear all diagnostics.");
} }
} }

View File

@ -1,8 +1,9 @@
<?php <?php
declare(strict_types = 1); declare(strict_types=1);
namespace LanguageServer\Tests\Server\Workspace; namespace LanguageServer\Tests\Server\Workspace;
use Amp\Loop;
use LanguageServer\Tests\MockProtocolStream; use LanguageServer\Tests\MockProtocolStream;
use LanguageServer\Tests\Server\ServerTestCase; use LanguageServer\Tests\Server\ServerTestCase;
use LanguageServer\{Server, Client, LanguageClient, Project, PhpDocument}; use LanguageServer\{Server, Client, LanguageClient, Project, PhpDocument};
@ -24,65 +25,69 @@ class SymbolTest extends ServerTestCase
{ {
public function testEmptyQueryReturnsAllSymbols() public function testEmptyQueryReturnsAllSymbols()
{ {
// Request symbols Loop::run(function () {
$result = $this->workspace->symbol('')->wait(); // Request symbols
$referencesUri = pathToUri(realpath(__DIR__ . '/../../../fixtures/references.php')); $result = yield $this->workspace->symbol('');
$referencesUri = pathToUri(realpath(__DIR__ . '/../../../fixtures/references.php'));
// @codingStandardsIgnoreStart // @codingStandardsIgnoreStart
$this->assertEquals([ $this->assertEquals([
new SymbolInformation('TestNamespace', SymbolKind::NAMESPACE, new Location($referencesUri, new Range(new Position(2, 0), new Position(2, 24))), ''), new SymbolInformation('TestNamespace', SymbolKind::NAMESPACE, new Location($referencesUri, new Range(new Position(2, 0), new Position(2, 24))), ''),
// Namespaced // Namespaced
new SymbolInformation('TEST_CONST', SymbolKind::CONSTANT, $this->getDefinitionLocation('TestNamespace\\TEST_CONST'), 'TestNamespace'), new SymbolInformation('TEST_CONST', SymbolKind::CONSTANT, $this->getDefinitionLocation('TestNamespace\\TEST_CONST'), 'TestNamespace'),
new SymbolInformation('TestClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\TestClass'), 'TestNamespace'), new SymbolInformation('TestClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\TestClass'), 'TestNamespace'),
new SymbolInformation('TEST_CLASS_CONST', SymbolKind::CONSTANT, $this->getDefinitionLocation('TestNamespace\\TestClass::TEST_CLASS_CONST'), 'TestNamespace\\TestClass'), new SymbolInformation('TEST_CLASS_CONST', SymbolKind::CONSTANT, $this->getDefinitionLocation('TestNamespace\\TestClass::TEST_CLASS_CONST'), 'TestNamespace\\TestClass'),
new SymbolInformation('staticTestProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('TestNamespace\\TestClass::staticTestProperty'), 'TestNamespace\\TestClass'), new SymbolInformation('staticTestProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('TestNamespace\\TestClass::staticTestProperty'), 'TestNamespace\\TestClass'),
new SymbolInformation('testProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('TestNamespace\\TestClass::testProperty'), 'TestNamespace\\TestClass'), new SymbolInformation('testProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('TestNamespace\\TestClass::testProperty'), 'TestNamespace\\TestClass'),
new SymbolInformation('staticTestMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestNamespace\\TestClass::staticTestMethod()'), 'TestNamespace\\TestClass'), new SymbolInformation('staticTestMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestNamespace\\TestClass::staticTestMethod()'), 'TestNamespace\\TestClass'),
new SymbolInformation('testMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestNamespace\\TestClass::testMethod()'), 'TestNamespace\\TestClass'), new SymbolInformation('testMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestNamespace\\TestClass::testMethod()'), 'TestNamespace\\TestClass'),
new SymbolInformation('TestTrait', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\TestTrait'), 'TestNamespace'), new SymbolInformation('TestTrait', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\TestTrait'), 'TestNamespace'),
new SymbolInformation('TestInterface', SymbolKind::INTERFACE, $this->getDefinitionLocation('TestNamespace\\TestInterface'), 'TestNamespace'), new SymbolInformation('TestInterface', SymbolKind::INTERFACE, $this->getDefinitionLocation('TestNamespace\\TestInterface'), 'TestNamespace'),
new SymbolInformation('test_function', SymbolKind::FUNCTION, $this->getDefinitionLocation('TestNamespace\\test_function()'), 'TestNamespace'), new SymbolInformation('test_function', SymbolKind::FUNCTION, $this->getDefinitionLocation('TestNamespace\\test_function()'), 'TestNamespace'),
new SymbolInformation('ChildClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\ChildClass'), 'TestNamespace'), new SymbolInformation('ChildClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\ChildClass'), 'TestNamespace'),
new SymbolInformation('Example', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\Example'), 'TestNamespace'), new SymbolInformation('Example', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\Example'), 'TestNamespace'),
new SymbolInformation('__construct', SymbolKind::CONSTRUCTOR, $this->getDefinitionLocation('TestNamespace\\Example::__construct'), 'TestNamespace\\Example'), new SymbolInformation('__construct', SymbolKind::CONSTRUCTOR, $this->getDefinitionLocation('TestNamespace\\Example::__construct'), 'TestNamespace\\Example'),
new SymbolInformation('__destruct', SymbolKind::CONSTRUCTOR, $this->getDefinitionLocation('TestNamespace\\Example::__destruct'), 'TestNamespace\\Example'), new SymbolInformation('__destruct', SymbolKind::CONSTRUCTOR, $this->getDefinitionLocation('TestNamespace\\Example::__destruct'), 'TestNamespace\\Example'),
new SymbolInformation('TestNamespace\\InnerNamespace', SymbolKind::NAMESPACE, $this->getDefinitionLocation('TestNamespace\\InnerNamespace'), 'TestNamespace'), new SymbolInformation('TestNamespace\\InnerNamespace', SymbolKind::NAMESPACE, $this->getDefinitionLocation('TestNamespace\\InnerNamespace'), 'TestNamespace'),
new SymbolInformation('InnerClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\InnerNamespace\\InnerClass'), 'TestNamespace\\InnerNamespace'), new SymbolInformation('InnerClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestNamespace\\InnerNamespace\\InnerClass'), 'TestNamespace\\InnerNamespace'),
new SymbolInformation('whatever', SymbolKind::FUNCTION, $this->getDefinitionLocation('TestNamespace\\whatever()'), 'TestNamespace'), new SymbolInformation('whatever', SymbolKind::FUNCTION, $this->getDefinitionLocation('TestNamespace\\whatever()'), 'TestNamespace'),
// Global // Global
new SymbolInformation('TEST_CONST', SymbolKind::CONSTANT, $this->getDefinitionLocation('TEST_CONST'), ''), new SymbolInformation('TEST_CONST', SymbolKind::CONSTANT, $this->getDefinitionLocation('TEST_CONST'), ''),
new SymbolInformation('TestClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestClass'), ''), new SymbolInformation('TestClass', SymbolKind::CLASS_, $this->getDefinitionLocation('TestClass'), ''),
new SymbolInformation('TEST_CLASS_CONST', SymbolKind::CONSTANT, $this->getDefinitionLocation('TestClass::TEST_CLASS_CONST'), 'TestClass'), new SymbolInformation('TEST_CLASS_CONST', SymbolKind::CONSTANT, $this->getDefinitionLocation('TestClass::TEST_CLASS_CONST'), 'TestClass'),
new SymbolInformation('staticTestProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('TestClass::staticTestProperty'), 'TestClass'), new SymbolInformation('staticTestProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('TestClass::staticTestProperty'), 'TestClass'),
new SymbolInformation('testProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('TestClass::testProperty'), 'TestClass'), new SymbolInformation('testProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('TestClass::testProperty'), 'TestClass'),
new SymbolInformation('staticTestMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestClass::staticTestMethod()'), 'TestClass'), new SymbolInformation('staticTestMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestClass::staticTestMethod()'), 'TestClass'),
new SymbolInformation('testMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestClass::testMethod()'), 'TestClass'), new SymbolInformation('testMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestClass::testMethod()'), 'TestClass'),
new SymbolInformation('TestTrait', SymbolKind::CLASS_, $this->getDefinitionLocation('TestTrait'), ''), new SymbolInformation('TestTrait', SymbolKind::CLASS_, $this->getDefinitionLocation('TestTrait'), ''),
new SymbolInformation('TestInterface', SymbolKind::INTERFACE, $this->getDefinitionLocation('TestInterface'), ''), new SymbolInformation('TestInterface', SymbolKind::INTERFACE, $this->getDefinitionLocation('TestInterface'), ''),
new SymbolInformation('test_function', SymbolKind::FUNCTION, $this->getDefinitionLocation('test_function()'), ''), new SymbolInformation('test_function', SymbolKind::FUNCTION, $this->getDefinitionLocation('test_function()'), ''),
new SymbolInformation('ChildClass', SymbolKind::CLASS_, $this->getDefinitionLocation('ChildClass'), ''), new SymbolInformation('ChildClass', SymbolKind::CLASS_, $this->getDefinitionLocation('ChildClass'), ''),
new SymbolInformation('TEST_DEFINE_CONSTANT', SymbolKind::CONSTANT, $this->getDefinitionLocation('TEST_DEFINE_CONSTANT'), ''), new SymbolInformation('TEST_DEFINE_CONSTANT', SymbolKind::CONSTANT, $this->getDefinitionLocation('TEST_DEFINE_CONSTANT'), ''),
new SymbolInformation('UnusedClass', SymbolKind::CLASS_, $this->getDefinitionLocation('UnusedClass'), ''), new SymbolInformation('UnusedClass', SymbolKind::CLASS_, $this->getDefinitionLocation('UnusedClass'), ''),
new SymbolInformation('unusedProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('UnusedClass::unusedProperty'), 'UnusedClass'), new SymbolInformation('unusedProperty', SymbolKind::PROPERTY, $this->getDefinitionLocation('UnusedClass::unusedProperty'), 'UnusedClass'),
new SymbolInformation('unusedMethod', SymbolKind::METHOD, $this->getDefinitionLocation('UnusedClass::unusedMethod'), 'UnusedClass'), new SymbolInformation('unusedMethod', SymbolKind::METHOD, $this->getDefinitionLocation('UnusedClass::unusedMethod'), 'UnusedClass'),
new SymbolInformation('whatever', SymbolKind::FUNCTION, $this->getDefinitionLocation('whatever()'), ''), new SymbolInformation('whatever', SymbolKind::FUNCTION, $this->getDefinitionLocation('whatever()'), ''),
new SymbolInformation('SecondTestNamespace', SymbolKind::NAMESPACE, $this->getDefinitionLocation('SecondTestNamespace'), ''), new SymbolInformation('SecondTestNamespace', SymbolKind::NAMESPACE, $this->getDefinitionLocation('SecondTestNamespace'), ''),
], $result); ], $result);
// @codingStandardsIgnoreEnd // @codingStandardsIgnoreEnd
});
} }
public function testQueryFiltersResults() public function testQueryFiltersResults()
{ {
// Request symbols Loop::run(function () {
$result = $this->workspace->symbol('testmethod')->wait(); // Request symbols
// @codingStandardsIgnoreStart $result = yield $this->workspace->symbol('testmethod');
$this->assertEquals([ // @codingStandardsIgnoreStart
new SymbolInformation('staticTestMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestNamespace\\TestClass::staticTestMethod()'), 'TestNamespace\\TestClass'), $this->assertEquals([
new SymbolInformation('testMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestNamespace\\TestClass::testMethod()'), 'TestNamespace\\TestClass'), new SymbolInformation('staticTestMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestNamespace\\TestClass::staticTestMethod()'), 'TestNamespace\\TestClass'),
new SymbolInformation('staticTestMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestClass::staticTestMethod()'), 'TestClass'), new SymbolInformation('testMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestNamespace\\TestClass::testMethod()'), 'TestNamespace\\TestClass'),
new SymbolInformation('testMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestClass::testMethod()'), 'TestClass') new SymbolInformation('staticTestMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestClass::staticTestMethod()'), 'TestClass'),
], $result); new SymbolInformation('testMethod', SymbolKind::METHOD, $this->getDefinitionLocation('TestClass::testMethod()'), 'TestClass')
// @codingStandardsIgnoreEnd ], $result);
// @codingStandardsIgnoreEnd
});
} }
} }

View File

@ -1,4 +1,4 @@
<?php <?php
use function LanguageServer\{pathToUri, timeout}; use function LanguageServer\{pathToUri};

View File

@ -5,9 +5,6 @@
], ],
"LanguageServer\\pathToUri()": [ "LanguageServer\\pathToUri()": [
"./functionUse2.php" "./functionUse2.php"
],
"LanguageServer\\timeout()": [
"./functionUse2.php"
] ]
}, },
"definitions": [] "definitions": []