fix tests
parent
60ed930a50
commit
a5433b211a
|
@ -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'));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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
|
@ -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);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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());
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
|
||||||
use function LanguageServer\{pathToUri, timeout};
|
use function LanguageServer\{pathToUri};
|
||||||
|
|
|
@ -5,9 +5,6 @@
|
||||||
],
|
],
|
||||||
"LanguageServer\\pathToUri()": [
|
"LanguageServer\\pathToUri()": [
|
||||||
"./functionUse2.php"
|
"./functionUse2.php"
|
||||||
],
|
|
||||||
"LanguageServer\\timeout()": [
|
|
||||||
"./functionUse2.php"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"definitions": []
|
"definitions": []
|
||||||
|
|
Loading…
Reference in New Issue