diff --git a/fixtures/composer.json b/fixtures/composer.json new file mode 100644 index 00000000..6ec2e922 --- /dev/null +++ b/fixtures/composer.json @@ -0,0 +1,6 @@ +{ + "require": { + "example/example-version": "1.0.7", + "example/example-reference": "dev-master" + } +} \ No newline at end of file diff --git a/fixtures/composer.lock b/fixtures/composer.lock new file mode 100644 index 00000000..6d84154b --- /dev/null +++ b/fixtures/composer.lock @@ -0,0 +1,55 @@ +{ + "_readme": [ + "This is a mock lock file for composer" + ], + "content-hash": "3da868eb11c9a94f957057f73d2936ef", + "packages": [ + { + "name": "example/example-version", + "version": "1.0.7", + "source": { + "type": "git", + "url": "https://example.com", + "reference": "b17e6153cb7f33c7e44eb59578dc12eee5dc8e12" + }, + "require": {}, + "require-dev": {}, + "suggest": {}, + "type": "library", + "extra": {}, + "autoload": {}, + "license": [], + "authors": [], + "description": "", + "keywords": [], + "time": "2017-03-06T11:59:08+00:00" + }, + { + "name": "example/example-reference", + "version": "1.0.7", + "source": { + "type": "git", + "url": "https://example.com", + "reference": "b17e6153cb7f33c7e44eb59578dc12eee5dc8e12" + }, + "require": {}, + "require-dev": {}, + "suggest": {}, + "type": "library", + "extra": {}, + "autoload": {}, + "license": [], + "authors": [], + "description": "", + "keywords": [], + "time": "2017-03-06T11:59:08+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "dev", + "prefer-stable": true, + "prefer-lowest": false, + "platform": {}, + "platform-dev": [] +} diff --git a/fixtures/vendor/example/example-reference/test.php b/fixtures/vendor/example/example-reference/test.php new file mode 100644 index 00000000..b3d9bbc7 --- /dev/null +++ b/fixtures/vendor/example/example-reference/test.php @@ -0,0 +1 @@ +composerLock->packages, $this->composerLock->{'packages-dev'}) as $package) { - // Check if package name matches and version is absolute - // Dynamic constraints are not cached, because they can change every time + if ($package->name !== $packageName) { + continue; + } + // Check if package can be cached. $packageVersion = ltrim($package->version, 'v'); - if ($package->name === $packageName && strpos($packageVersion, 'dev') === false) { + // If package is anchored to a version + if (strpos($packageVersion, 'dev') === false) { $packageKey = $packageName . ':' . $packageVersion; $cacheKey = self::CACHE_VERSION . ':' . $packageKey; // Check cache $index = yield $this->cache->get($cacheKey); break; + + // If package is checked out + } else if (isset($package->source->reference)) { + $packageKey = $packageName . ':' . $package->source->reference; + $cacheKey = self::CACHE_VERSION . ':' . $packageKey; + // Check cache + $index = yield $this->cache->get($cacheKey); + break; } } if ($index !== null) { diff --git a/tests/LanguageServerTest.php b/tests/LanguageServerTest.php index fb52ef64..79451975 100644 --- a/tests/LanguageServerTest.php +++ b/tests/LanguageServerTest.php @@ -53,12 +53,18 @@ public function testIndexingWithDirectFileAccess() $promise = new Promise; $input = new MockProtocolStream; $output = new MockProtocolStream; - $output->on('message', function (Message $msg) use ($promise) { + $cacheVersionCalled = false; + $cacheReferenceCalled = false; + $output->on('message', function (Message $msg) use ($promise, &$cacheVersionCalled, &$cacheReferenceCalled) { if ($msg->body->method === 'window/logMessage' && $promise->state === Promise::PENDING) { if ($msg->body->params->type === MessageType::ERROR) { $promise->reject(new Exception($msg->body->params->message)); - } else if (strpos($msg->body->params->message, 'All 27 PHP files parsed') !== false) { + } else if (preg_match('/All [0-9]+ PHP files parsed/', $msg->body->params->message)) { $promise->fulfill(); + } else if (preg_match('#(Storing|Restored) example/example-version:.* (in|from) cache#', $msg->body->params->message)) { + $cacheVersionCalled = true; + } else if (preg_match('#(Storing|Restored) example/example-reference:.* (in|from) cache#', $msg->body->params->message)) { + $cacheReferenceCalled = true; } } }); @@ -66,6 +72,8 @@ public function testIndexingWithDirectFileAccess() $capabilities = new ClientCapabilities; $server->initialize($capabilities, realpath(__DIR__ . '/../fixtures'), getmypid()); $promise->wait(); + $this->assertTrue($cacheVersionCalled); + $this->assertTrue($cacheReferenceCalled); } public function testIndexingWithFilesAndContentRequests() @@ -103,7 +111,7 @@ public function testIndexingWithFilesAndContentRequests() if ($promise->state === Promise::PENDING) { $promise->reject(new Exception($msg->body->params->message)); } - } else if (strpos($msg->body->params->message, 'All 27 PHP files parsed') !== false) { + } else if (preg_match('/All [0-9]+ PHP files parsed/', $msg->body->params->message)) { $promise->fulfill(); } }