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 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"; 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/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" 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/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(); 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/StderrLogger.php b/src/StderrLogger.php new file mode 100644 index 0000000..6f3bb38 --- /dev/null +++ b/src/StderrLogger.php @@ -0,0 +1,25 @@ +