From c5a83af327ad7095f5469a377b2748837742dd5f Mon Sep 17 00:00:00 2001 From: Vincent Klaiber Date: Wed, 28 Feb 2018 06:03:30 +0100 Subject: [PATCH 1/6] ci(travis): update travis php versions (#601) --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index cb4bcbf..44641af 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,8 @@ - language: php php: - '7.0' - - '7.2.0RC5' + - '7.2' git: depth: 10 From fc6b06942520e699cba0cb25ba33b328399a2588 Mon Sep 17 00:00:00 2001 From: Felix Becker Date: Tue, 27 Feb 2018 21:05:16 -0800 Subject: [PATCH 2/6] ci(dependencies.io): track stable semantic-release --- dependencies.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/dependencies.yml b/dependencies.yml index bf6bd77..9df6f74 100644 --- a/dependencies.yml +++ b/dependencies.yml @@ -10,9 +10,6 @@ collectors: commit_message_prefix: "chore: " - type: js-npm path: / - settings: - dist_tags: - semantic-release: next actors: - type: js-npm versions: "Y.0.0" From 8adcf92c2f54fdb8dd43fef925cf4e3d03107656 Mon Sep 17 00:00:00 2001 From: Tyson Andre Date: Wed, 28 Feb 2018 10:05:22 -0800 Subject: [PATCH 3/6] chore: remove unused 'use' statements (#612) detected via static analysis and manually checked --- src/Cache/FileSystemCache.php | 1 - src/Client/TextDocument.php | 2 +- src/Client/Window.php | 1 - src/Client/XCache.php | 1 - src/Definition.php | 3 +-- src/FqnUtilities.php | 1 - src/Indexer.php | 2 -- src/Protocol/SymbolInformation.php | 1 - src/ProtocolStreamWriter.php | 1 - src/Server/TextDocument.php | 1 - src/Server/Workspace.php | 6 ++---- src/SignatureHelpProvider.php | 2 -- src/TreeAnalyzer.php | 4 +--- 13 files changed, 5 insertions(+), 21 deletions(-) diff --git a/src/Cache/FileSystemCache.php b/src/Cache/FileSystemCache.php index 5e9f523..d6d4410 100644 --- a/src/Cache/FileSystemCache.php +++ b/src/Cache/FileSystemCache.php @@ -3,7 +3,6 @@ declare(strict_types = 1); namespace LanguageServer\Cache; -use LanguageServer\LanguageClient; use Sabre\Event\Promise; /** diff --git a/src/Client/TextDocument.php b/src/Client/TextDocument.php index 176c4fd..f163d60 100644 --- a/src/Client/TextDocument.php +++ b/src/Client/TextDocument.php @@ -4,7 +4,7 @@ declare(strict_types = 1); namespace LanguageServer\Client; use LanguageServer\ClientHandler; -use LanguageServer\Protocol\{Message, TextDocumentItem, TextDocumentIdentifier}; +use LanguageServer\Protocol\{TextDocumentItem, TextDocumentIdentifier}; use Sabre\Event\Promise; use JsonMapper; diff --git a/src/Client/Window.php b/src/Client/Window.php index 053f306..c3558f5 100644 --- a/src/Client/Window.php +++ b/src/Client/Window.php @@ -4,7 +4,6 @@ declare(strict_types = 1); namespace LanguageServer\Client; use LanguageServer\ClientHandler; -use LanguageServer\Protocol\Message; use Sabre\Event\Promise; /** diff --git a/src/Client/XCache.php b/src/Client/XCache.php index 3004e58..b3ce5a5 100644 --- a/src/Client/XCache.php +++ b/src/Client/XCache.php @@ -4,7 +4,6 @@ declare(strict_types = 1); namespace LanguageServer\Client; use LanguageServer\ClientHandler; -use LanguageServer\Protocol\Message; use Sabre\Event\Promise; /** diff --git a/src/Definition.php b/src/Definition.php index 0d157cb..1600408 100644 --- a/src/Definition.php +++ b/src/Definition.php @@ -6,7 +6,6 @@ namespace LanguageServer; use LanguageServer\Index\ReadableIndex; use phpDocumentor\Reflection\{Types, Type, Fqsen, TypeResolver}; use LanguageServer\Protocol\SymbolInformation; -use Exception; use Generator; /** @@ -69,7 +68,7 @@ class Definition public $canBeInstantiated; /** - * @var Protocol\SymbolInformation + * @var SymbolInformation */ public $symbolInformation; diff --git a/src/FqnUtilities.php b/src/FqnUtilities.php index b5d01a9..fcd6027 100644 --- a/src/FqnUtilities.php +++ b/src/FqnUtilities.php @@ -3,7 +3,6 @@ namespace LanguageServer\FqnUtilities; use phpDocumentor\Reflection\{Type, Types}; -use Microsoft\PhpParser; /** * Returns all possible FQNs in a type diff --git a/src/Indexer.php b/src/Indexer.php index 2618d43..a556d4d 100644 --- a/src/Indexer.php +++ b/src/Indexer.php @@ -6,10 +6,8 @@ namespace LanguageServer; use LanguageServer\Cache\Cache; use LanguageServer\FilesFinder\FilesFinder; use LanguageServer\Index\{DependenciesIndex, Index}; -use LanguageServer\Protocol\Message; use LanguageServer\Protocol\MessageType; use Webmozart\PathUtil\Path; -use Composer\Semver\VersionParser; use Sabre\Event\Promise; use function Sabre\Event\coroutine; diff --git a/src/Protocol/SymbolInformation.php b/src/Protocol/SymbolInformation.php index 6b4d39e..499e417 100644 --- a/src/Protocol/SymbolInformation.php +++ b/src/Protocol/SymbolInformation.php @@ -4,7 +4,6 @@ namespace LanguageServer\Protocol; use Microsoft\PhpParser; use Microsoft\PhpParser\Node; -use Exception; /** * Represents information about programming constructs like variables, classes, diff --git a/src/ProtocolStreamWriter.php b/src/ProtocolStreamWriter.php index 3f51e14..f004a5f 100644 --- a/src/ProtocolStreamWriter.php +++ b/src/ProtocolStreamWriter.php @@ -8,7 +8,6 @@ use Sabre\Event\{ Loop, Promise }; -use RuntimeException; class ProtocolStreamWriter implements ProtocolWriter { diff --git a/src/Server/TextDocument.php b/src/Server/TextDocument.php index 371ad36..e5657b3 100644 --- a/src/Server/TextDocument.php +++ b/src/Server/TextDocument.php @@ -23,7 +23,6 @@ use LanguageServer\Protocol\{ VersionedTextDocumentIdentifier, CompletionContext }; -use Microsoft\PhpParser; use Microsoft\PhpParser\Node; use Sabre\Event\Promise; use Sabre\Uri; diff --git a/src/Server/Workspace.php b/src/Server/Workspace.php index fe1dda6..082c502 100644 --- a/src/Server/Workspace.php +++ b/src/Server/Workspace.php @@ -3,18 +3,16 @@ declare(strict_types = 1); namespace LanguageServer\Server; -use LanguageServer\{LanguageClient, Project, PhpDocumentLoader}; +use LanguageServer\{LanguageClient, PhpDocumentLoader}; use LanguageServer\Index\{ProjectIndex, DependenciesIndex, Index}; use LanguageServer\Protocol\{ FileChangeType, FileEvent, SymbolInformation, SymbolDescriptor, - PackageDescriptor, ReferenceInformation, DependencyReference, - Location, - MessageType + Location }; use Sabre\Event\Promise; use function Sabre\Event\coroutine; diff --git a/src/SignatureHelpProvider.php b/src/SignatureHelpProvider.php index aba02b4..439be9c 100644 --- a/src/SignatureHelpProvider.php +++ b/src/SignatureHelpProvider.php @@ -7,10 +7,8 @@ use LanguageServer\Index\ReadableIndex; use LanguageServer\Protocol\{ Position, SignatureHelp, - SignatureInformation, ParameterInformation }; -use Microsoft\PhpParser; use Microsoft\PhpParser\Node; use Sabre\Event\Promise; use function Sabre\Event\coroutine; diff --git a/src/TreeAnalyzer.php b/src/TreeAnalyzer.php index 465f5bb..03ad539 100644 --- a/src/TreeAnalyzer.php +++ b/src/TreeAnalyzer.php @@ -3,10 +3,8 @@ declare(strict_types = 1); namespace LanguageServer; -use LanguageServer\Protocol\{Diagnostic, DiagnosticSeverity, Range, Position, TextEdit}; -use LanguageServer\Index\Index; +use LanguageServer\Protocol\{Diagnostic, DiagnosticSeverity, Range, Position}; use phpDocumentor\Reflection\DocBlockFactory; -use Sabre\Uri; use Microsoft\PhpParser; use Microsoft\PhpParser\Node; use Microsoft\PhpParser\Token; From b412c125a437852673106f232ea13afc2d76569c Mon Sep 17 00:00:00 2001 From: Declspeck Date: Sun, 25 Feb 2018 22:02:54 +0200 Subject: [PATCH 4/6] fix(indexing): handle integer FQNs --- src/PhpDocument.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/PhpDocument.php b/src/PhpDocument.php index 0ac8421..805bc08 100644 --- a/src/PhpDocument.php +++ b/src/PhpDocument.php @@ -160,7 +160,9 @@ class PhpDocument // Register this document on the project for references foreach ($this->referenceNodes as $fqn => $nodes) { - $this->index->addReferenceUri($fqn, $this->uri); + // Cast the key to string. If (string)'2' is set as an array index, it will read out as (int)2. We must + // deal with incorrect code, so this is a valid scenario. + $this->index->addReferenceUri((string)$fqn, $this->uri); } $this->sourceFileNode = $treeAnalyzer->getSourceFileNode(); From e10896f90554c2f95b052c09fbc3685e84fb9a60 Mon Sep 17 00:00:00 2001 From: Declspeck Date: Sun, 25 Feb 2018 22:07:10 +0200 Subject: [PATCH 5/6] test(performance): don't eat exceptions during benchmark --- Performance.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Performance.php b/Performance.php index 6fc1c28..4d76d38 100644 --- a/Performance.php +++ b/Performance.php @@ -51,11 +51,7 @@ foreach($frameworks as $framework) { $definitionResolver = new DefinitionResolver($index); $parser = new PhpParser\Parser(); - try { - $document = new PhpDocument($testCaseFile, $fileContents, $index, $parser, $docBlockFactory, $definitionResolver); - } catch (\Throwable $e) { - continue; - } + $document = new PhpDocument($testCaseFile, $fileContents, $index, $parser, $docBlockFactory, $definitionResolver); } echo "------------------------------\n"; From de1af6a165960bf942e814a0e183e9e2ca45f6e5 Mon Sep 17 00:00:00 2001 From: Felix Becker Date: Thu, 8 Mar 2018 11:48:56 -0800 Subject: [PATCH 6/6] refactor: use composer/xdebug-handler (#616) --- README.md | 2 +- bin/php-language-server.php | 37 ++++++++++++++++++++++--------------- composer.json | 3 ++- src/StderrLogger.php | 25 +++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 17 deletions(-) create mode 100644 src/StderrLogger.php diff --git a/README.md b/README.md index 5d95d61..1597536 100644 --- a/README.md +++ b/README.md @@ -211,6 +211,6 @@ The project parses PHPStorm's PHP stubs to get support for PHP builtins. It re-p To debug with xDebug ensure that you have this set as an environment variable - COMPOSER_ALLOW_XDEBUG=1 + PHPLS_ALLOW_XDEBUG=1 This tells the Language Server to not restart without XDebug if it detects that XDebug is enabled (XDebug has a high performance impact). diff --git a/bin/php-language-server.php b/bin/php-language-server.php index 2a2ab69..8e5d348 100644 --- a/bin/php-language-server.php +++ b/bin/php-language-server.php @@ -1,8 +1,8 @@ critical((string)$e); }); @cli_set_process_title('PHP Language Server'); // If XDebug is enabled, restart without it -(new XdebugHandler(Factory::createOutput()))->check(); +$xdebugHandler = new XdebugHandler('PHPLS'); +$xdebugHandler->setLogger($logger); +$xdebugHandler->check(); +unset($xdebugHandler); if (!empty($options['tcp'])) { // Connect to a TCP server $address = $options['tcp']; $socket = stream_socket_client('tcp://' . $address, $errno, $errstr); if ($socket === false) { - fwrite(STDERR, "Could not connect to language client. Error $errno\n$errstr"); + $logger->critical("Could not connect to language client. Error $errno\n$errstr"); exit(1); } stream_set_blocking($socket, false); @@ -53,29 +58,30 @@ if (!empty($options['tcp'])) { $address = $options['tcp-server']; $tcpServer = stream_socket_server('tcp://' . $address, $errno, $errstr); if ($tcpServer === false) { - fwrite(STDERR, "Could not listen on $address. Error $errno\n$errstr"); + $logger->critical("Could not listen on $address. Error $errno\n$errstr"); exit(1); } - fwrite(STDOUT, "Server listening on $address\n"); - if (!extension_loaded('pcntl')) { - fwrite(STDERR, "PCNTL is not available. Only a single connection will be accepted\n"); + $logger->debug("Server listening on $address"); + $pcntlAvailable = extension_loaded('pcntl'); + if (!$pcntlAvailable) { + $logger->notice('PCNTL is not available. Only a single connection will be accepted'); } while ($socket = stream_socket_accept($tcpServer, -1)) { - fwrite(STDOUT, "Connection accepted\n"); + $logger->debug('Connection accepted'); stream_set_blocking($socket, false); - if (extension_loaded('pcntl')) { + if ($pcntlAvailable) { // If PCNTL is available, fork a child process for the connection // An exit notification will only terminate the child process $pid = pcntl_fork(); if ($pid === -1) { - fwrite(STDERR, "Could not fork\n"); + $logger->critical('Could not fork'); exit(1); } else if ($pid === 0) { // Child process $reader = new ProtocolStreamReader($socket); $writer = new ProtocolStreamWriter($socket); - $reader->on('close', function () { - fwrite(STDOUT, "Connection closed\n"); + $reader->on('close', function () use ($logger) { + $logger->debug('Connection closed'); }); $ls = new LanguageServer($reader, $writer); Loop\run(); @@ -94,6 +100,7 @@ if (!empty($options['tcp'])) { } } else { // Use STDIO + $logger->debug('Listening on STDIN'); stream_set_blocking(STDIN, false); $ls = new LanguageServer( new ProtocolStreamReader(STDIN), diff --git a/composer.json b/composer.json index a21535b..085f189 100644 --- a/composer.json +++ b/composer.json @@ -22,12 +22,13 @@ ], "require": { "php": "^7.0", - "composer/composer": "^1.3", + "composer/xdebug-handler": "^1.0", "felixfbecker/advanced-json-rpc": "^3.0.0", "jetbrains/phpstorm-stubs": "dev-master", "microsoft/tolerant-php-parser": "0.0.*", "netresearch/jsonmapper": "^1.0", "phpdocumentor/reflection-docblock": "^4.0.0", + "psr/log": "^1.0", "sabre/event": "^5.0", "sabre/uri": "^2.0", "webmozart/glob": "^4.1", diff --git a/src/StderrLogger.php b/src/StderrLogger.php new file mode 100644 index 0000000..6f3bb38 --- /dev/null +++ b/src/StderrLogger.php @@ -0,0 +1,25 @@ +