handle other vendor references
parent
16e27f90c1
commit
682cb2a072
|
@ -22,10 +22,11 @@ class ProjectIndex extends AbstractAggregateIndex
|
|||
*/
|
||||
private $sourceIndex;
|
||||
|
||||
public function __construct(Index $sourceIndex, DependenciesIndex $dependenciesIndex)
|
||||
public function __construct(Index $sourceIndex, DependenciesIndex $dependenciesIndex, \stdClass $composerJson = null)
|
||||
{
|
||||
$this->sourceIndex = $sourceIndex;
|
||||
$this->dependenciesIndex = $dependenciesIndex;
|
||||
$this->composerJson = $composerJson;
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
|
@ -43,7 +44,7 @@ class ProjectIndex extends AbstractAggregateIndex
|
|||
*/
|
||||
public function getIndexForUri(string $uri): Index
|
||||
{
|
||||
if (preg_match('/\/vendor\/([^\/]+\/[^\/]+)\//', $uri, $matches)) {
|
||||
if (\LanguageServer\uriInVendorDir($this->composerJson, $uri, $matches)) {
|
||||
$packageName = $matches[1];
|
||||
return $this->dependenciesIndex->getDependencyIndex($packageName);
|
||||
}
|
||||
|
|
|
@ -117,14 +117,8 @@ class Indexer
|
|||
/** @var string[][] */
|
||||
$deps = [];
|
||||
|
||||
$vendorDir = isset($this->composerJson->config->{'vendor-dir'}) ?
|
||||
$this->composerJson->config->{'vendor-dir'}
|
||||
: 'vendor';
|
||||
$vendorDir = str_replace('/', '\/', $vendorDir);
|
||||
$this->client->window->logMessage(MessageType::INFO, "Vendor dir: $vendorDir");
|
||||
|
||||
foreach ($uris as $uri) {
|
||||
if ($this->composerLock !== null && preg_match("/\/$vendorDir\/([^\/]+\/[^\/]+)\//", $uri, $matches)) {
|
||||
if ($this->composerLock !== null && uriInVendorDir($this->composerJson, $uri, $matches)) {
|
||||
// Dependency file
|
||||
$packageName = $matches[1];
|
||||
if (!isset($deps[$packageName])) {
|
||||
|
@ -221,7 +215,7 @@ class Indexer
|
|||
$this->client->window->logMessage(MessageType::LOG, "Parsing $uri");
|
||||
try {
|
||||
$document = yield $this->documentLoader->load($uri);
|
||||
if (!$document->isVendored()) {
|
||||
if (!isVendored($document, $this->composerJson)) {
|
||||
$this->client->textDocument->publishDiagnostics($uri, $document->getDiagnostics());
|
||||
}
|
||||
} catch (ContentTooLargeException $e) {
|
||||
|
|
|
@ -187,7 +187,7 @@ class LanguageServer extends AdvancedJsonRpc\Dispatcher
|
|||
|
||||
$dependenciesIndex = new DependenciesIndex;
|
||||
$sourceIndex = new Index;
|
||||
$this->projectIndex = new ProjectIndex($sourceIndex, $dependenciesIndex);
|
||||
$this->projectIndex = new ProjectIndex($sourceIndex, $dependenciesIndex, $this->composerJson);
|
||||
$stubsIndex = StubsIndex::read();
|
||||
$this->globalIndex = new GlobalIndex($stubsIndex, $this->projectIndex);
|
||||
|
||||
|
@ -257,7 +257,8 @@ class LanguageServer extends AdvancedJsonRpc\Dispatcher
|
|||
$dependenciesIndex,
|
||||
$sourceIndex,
|
||||
$this->composerLock,
|
||||
$this->documentLoader
|
||||
$this->documentLoader,
|
||||
$this->composerJson
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -220,17 +220,6 @@ class PhpDocument
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the document is a dependency
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isVendored(): bool
|
||||
{
|
||||
$path = Uri\parse($this->uri)['path'];
|
||||
return strpos($path, '/vendor/') !== false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns array of TextEdit changes to format this document.
|
||||
*
|
||||
|
|
|
@ -134,7 +134,7 @@ class TextDocument
|
|||
public function didOpen(TextDocumentItem $textDocument)
|
||||
{
|
||||
$document = $this->documentLoader->open($textDocument->uri, $textDocument->text);
|
||||
if (!$document->isVendored()) {
|
||||
if (!\LanguageServer\isVendored($document, $this->composerJson)) {
|
||||
$this->client->textDocument->publishDiagnostics($textDocument->uri, $document->getDiagnostics());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -49,13 +49,14 @@ class Workspace
|
|||
* @param \stdClass $composerLock The parsed composer.lock of the project, if any
|
||||
* @param PhpDocumentLoader $documentLoader PhpDocumentLoader instance to load documents
|
||||
*/
|
||||
public function __construct(ProjectIndex $index, DependenciesIndex $dependenciesIndex, Index $sourceIndex, \stdClass $composerLock = null, PhpDocumentLoader $documentLoader)
|
||||
public function __construct(ProjectIndex $index, DependenciesIndex $dependenciesIndex, Index $sourceIndex, \stdClass $composerLock = null, PhpDocumentLoader $documentLoader, \stdClass $composerJson = null)
|
||||
{
|
||||
$this->sourceIndex = $sourceIndex;
|
||||
$this->index = $index;
|
||||
$this->dependenciesIndex = $dependenciesIndex;
|
||||
$this->composerLock = $composerLock;
|
||||
$this->documentLoader = $documentLoader;
|
||||
$this->composerJson = $composerJson;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -122,7 +123,7 @@ class Workspace
|
|||
$symbol->$prop = $val;
|
||||
}
|
||||
// Find out package name
|
||||
preg_match('/\/vendor\/([^\/]+\/[^\/]+)\//', $def->symbolInformation->location->uri, $matches);
|
||||
uriInVendorDir($this->composerJson, $def->symbolInformation->location->uri, $matches);
|
||||
$packageName = $matches[1];
|
||||
foreach ($this->composerLock->packages as $package) {
|
||||
if ($package->name === $packageName) {
|
||||
|
|
|
@ -137,7 +137,7 @@ function stripStringOverlap(string $a, string $b): string
|
|||
* Use for sorting an array of URIs by number of segments
|
||||
* in ascending order.
|
||||
*
|
||||
* @param array
|
||||
* @param array $uriList
|
||||
* @return void
|
||||
*/
|
||||
function sortUrisLevelOrder(&$uriList)
|
||||
|
@ -146,3 +146,47 @@ function sortUrisLevelOrder(&$uriList)
|
|||
return substr_count(Uri\parse($a)['path'], '/') - substr_count(Uri\parse($b)['path'], '/');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks a document against the composer.json to see if it
|
||||
* is a vendored document
|
||||
*
|
||||
* @param PhpDocument $document
|
||||
* @param \stdClass|null $composerJson
|
||||
* @return bool
|
||||
*/
|
||||
function isVendored(PhpDocument $document, \stdClass $composerJson = null): bool
|
||||
{
|
||||
$path = Uri\parse($document->getUri())['path'];
|
||||
$vendorDir = getVendorDir($composerJson);
|
||||
return strpos($path, "/$vendorDir/") !== false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check a given URI against the composer.json to see if it
|
||||
* is a vendored URI
|
||||
*
|
||||
* @param \stdClass|null $composerJson
|
||||
* @param string $uri
|
||||
* @param array $matches
|
||||
* @return int
|
||||
*/
|
||||
function uriInVendorDir(\stdClass $composerJson = null, string $uri, &$matches): int
|
||||
{
|
||||
$vendorDir = str_replace('/', '\/', getVendorDir($composerJson));
|
||||
return preg_match("/\/$vendorDir\/([^\/]+\/[^\/]+)\//", $uri, $matches);
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function to get the vendor directory from composer.json
|
||||
* or default to 'vendor'
|
||||
*
|
||||
* @param \stdClass|null $composerJson
|
||||
* @return string
|
||||
*/
|
||||
function getVendorDir(\stdClass $composerJson = null): string
|
||||
{
|
||||
return isset($composerJson->config->{'vendor-dir'}) ?
|
||||
$composerJson->config->{'vendor-dir'}
|
||||
: 'vendor';
|
||||
}
|
||||
|
|
|
@ -42,18 +42,18 @@ class PhpDocumentTest extends TestCase
|
|||
public function testIsVendored()
|
||||
{
|
||||
$document = $this->createDocument('file:///dir/vendor/x.php', "<?php\n$\$a = new SomeClass;");
|
||||
$this->assertEquals(true, $document->isVendored());
|
||||
$this->assertEquals(true, \LanguageServer\isVendored($document));
|
||||
|
||||
$document = $this->createDocument('file:///c:/dir/vendor/x.php', "<?php\n$\$a = new SomeClass;");
|
||||
$this->assertEquals(true, $document->isVendored());
|
||||
$this->assertEquals(true, \LanguageServer\isVendored($document));
|
||||
|
||||
$document = $this->createDocument('file:///vendor/x.php', "<?php\n$\$a = new SomeClass;");
|
||||
$this->assertEquals(true, $document->isVendored());
|
||||
$this->assertEquals(true, \LanguageServer\isVendored($document));
|
||||
|
||||
$document = $this->createDocument('file:///dir/vendor.php', "<?php\n$\$a = new SomeClass;");
|
||||
$this->assertEquals(false, $document->isVendored());
|
||||
$this->assertEquals(false, \LanguageServer\isVendored($document));
|
||||
|
||||
$document = $this->createDocument('file:///dir/x.php', "<?php\n$\$a = new SomeClass;");
|
||||
$this->assertEquals(false, $document->isVendored());
|
||||
$this->assertEquals(false, \LanguageServer\isVendored($document));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue