Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use Phpactor\Container\ContainerBuilder;
use Phpactor\Container\Extension;
use Phpactor\Indexer\Adapter\Tolerant\TolerantCompositeIndexer;
use Phpactor\Indexer\IndexAgentBuilder;
use Phpactor\Indexer\Model\Indexer;
use Phpactor\MapResolver\Resolver;
Expand All @@ -16,7 +17,10 @@ public function load(ContainerBuilder $container): void
return IndexAgentBuilder::create(
__DIR__ . '/../Workspace',
__DIR__ . '/../Workspace',
)->buildTestAgent()->indexer();
TolerantCompositeIndexer::create(),
)
->buildTestAgent()
->indexer();
});
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,7 @@ public function __construct(
public function findReferences(TextDocument $document, ByteOffset $byteOffset): Generator
{
try {
$nodeContext = $this->reflector->reflectOffset(
$document,
$byteOffset->toInt()
)->nodeContext();
$nodeContext = $this->reflector->reflectOffset($document, $byteOffset->toInt())->nodeContext();
} catch (NotFound) {
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,35 +14,36 @@
use Phpactor\Indexer\Adapter\Tolerant\Indexer\MemberIndexer;
use Phpactor\Indexer\Adapter\Tolerant\Indexer\TraitDeclarationIndexer;
use Phpactor\Indexer\Adapter\Tolerant\Indexer\TraitUseClauseIndexer;
use Phpactor\Indexer\Model\CompositeIndexer;
use Phpactor\Indexer\Model\Exception\CannotIndexNode;
use Phpactor\Indexer\Model\Index;
use Phpactor\Indexer\Model\IndexBuilder;
use Phpactor\TextDocument\TextDocument;
use Psr\Log\LoggerInterface;
use Psr\Log\NullLogger;
use RuntimeException;
use Throwable;

final class TolerantIndexBuilder implements IndexBuilder
final class TolerantCompositeIndexer implements CompositeIndexer
{
private Parser $parser;

private LoggerInterface $logger;

/**
* @param TolerantIndexer[] $indexers
*/
public function __construct(
private Index $index,
private array $indexers,
private LoggerInterface $logger,
?LoggerInterface $logger = null,
?Parser $parser = null
) {
$this->parser = $parser ?: new Parser();
$this->logger = $logger ?: new NullLogger();
}

public static function create(Index $index, ?LoggerInterface $logger = null): self
public static function create(?LoggerInterface $logger = null): self
{
return new self(
$index,
[
new ClassDeclarationIndexer(),
new EnumDeclarationIndexer(),
Expand All @@ -55,31 +56,31 @@ public static function create(Index $index, ?LoggerInterface $logger = null): se
new ConstantDeclarationIndexer(),
new MemberIndexer(),
],
$logger ?: new NullLogger()
$logger
);
}

public function index(TextDocument $document): void
public function index(Index $index, TextDocument $document): void
{
foreach ($this->indexers as $indexer) {
$indexer->beforeParse($this->index, $document);
$indexer->beforeParse($index, $document);
}

$node = $this->parser->parseSourceFile($document->__toString(), $document->uri()->__toString());
$this->indexNode($document, $node);
$node = $this->parser->parseSourceFile($document->__toString(), $document->uri()?->__toString());
$this->indexNode($index, $document, $node);
}

public function done(): void
public function done(Index $index): void
{
$this->index->done();
$index->done();
}

private function indexNode(TextDocument $document, Node $node): void
private function indexNode(Index $index, TextDocument $document, Node $node): void
{
foreach ($this->indexers as $indexer) {
try {
if ($indexer->canIndex($node)) {
$indexer->index($this->index, $document, $node);
$indexer->index($index, $document, $node);
}
} catch (CannotIndexNode $cannotIndexNode) {
$this->logger->warning(sprintf(
Expand All @@ -98,7 +99,7 @@ private function indexNode(TextDocument $document, Node $node): void
}

foreach ($node->getChildNodes() as $childNode) {
$this->indexNode($document, $childNode);
$this->indexNode($index, $document, $childNode);
}
}
}
14 changes: 12 additions & 2 deletions lib/Indexer/Extension/IndexerExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
use Phpactor\Indexer\Adapter\Php\PhpIndexerLister;
use Phpactor\Indexer\Adapter\ReferenceFinder\IndexedNameSearcher;
use Phpactor\Indexer\Adapter\ReferenceFinder\Util\ContainerTypeResolver;
use Phpactor\Indexer\Adapter\Tolerant\TolerantCompositeIndexer;
use Phpactor\Indexer\Adapter\Worse\IndexerClassSourceLocator;
use Phpactor\Indexer\Adapter\Worse\IndexerConstantSourceLocator;
use Phpactor\Indexer\Adapter\Worse\IndexerFunctionSourceLocator;
Expand All @@ -34,7 +35,9 @@
use Phpactor\Indexer\Extension\Command\IndexSearchCommand;
use Phpactor\Indexer\IndexAgent;
use Phpactor\Indexer\IndexAgentBuilder;
use Phpactor\Indexer\Model\CompositeIndexer;
use Phpactor\Indexer\Model\IndexAccess;
use Phpactor\Indexer\Model\Indexer;
use Phpactor\MapResolver\Resolver;
use Phpactor\Indexer\Adapter\ReferenceFinder\IndexedImplementationFinder;
use Phpactor\Indexer\Extension\Command\IndexQueryCommand;
Expand All @@ -43,7 +46,6 @@
use Phpactor\Indexer\Extension\Rpc\IndexHandler;
use Phpactor\Indexer\Model\QueryClient;
use Phpactor\Indexer\Model\SearchClient;
use Phpactor\Indexer\Model\Indexer;
use Phpactor\TextDocument\FilesystemTextDocumentLocator;
use Phpactor\TextDocument\TextDocumentLocator;
use Phpactor\TextDocument\TextDocumentUri;
Expand Down Expand Up @@ -223,7 +225,11 @@ private function registerModel(ContainerBuilder $container): void
$stubPaths = $container->parameter(self::PARAM_STUB_PATHS)->value();
$stubPaths = array_map(fn (string $path): string => $resolver->resolve($path), $stubPaths);

return IndexAgentBuilder::create($indexPath, $this->projectRoot($container))
return IndexAgentBuilder::create(
$indexPath,
$this->projectRoot($container),
$container->get(CompositeIndexer::class),
)
/** @phpstan-ignore-next-line */
->setExcludePatterns($container->get(self::SERVICE_INDEXER_EXCLUDE_PATTERNS))
/** @phpstan-ignore-next-line */
Expand All @@ -238,6 +244,10 @@ private function registerModel(ContainerBuilder $container): void
return $container->get(IndexAgent::class)->indexer();
});

$container->register(CompositeIndexer::class, function (Container $container) {
return TolerantCompositeIndexer::create($this->logger($container));
});

$container->register(self::SERVICE_INDEXER_EXCLUDE_PATTERNS, function (Container $container) {
$projectRoot = $this->projectRoot($container);
return array_map(function (string $pattern) use ($projectRoot) {
Expand Down
56 changes: 19 additions & 37 deletions lib/Indexer/IndexAgentBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,14 @@
use Phpactor\Indexer\Adapter\Php\FileSearchIndex;
use Phpactor\Indexer\Adapter\Php\Serialized\FileRepository;
use Phpactor\Indexer\Adapter\Php\Serialized\SerializedIndex;
use Phpactor\Indexer\Adapter\Tolerant\TolerantIndexBuilder;
use Phpactor\Indexer\Adapter\Tolerant\TolerantIndexer;
use Phpactor\Indexer\Model\CompositeIndexer;
use Phpactor\Indexer\Model\FileListProvider;
use Phpactor\Indexer\Model\FileListProvider\ChainFileListProvider;
use Phpactor\Indexer\Model\FileListProvider\DirtyFileListProvider;
use Phpactor\Indexer\Model\Index;
use Phpactor\Indexer\Model\IndexAccess;
use Phpactor\Indexer\Model\Index\SearchAwareIndex;
use Phpactor\Indexer\Model\RealIndexAgent;
use Phpactor\Indexer\Model\IndexBuilder;
use Phpactor\Indexer\Model\QueryClient;
use Phpactor\Indexer\Model\Indexer;
use Phpactor\Indexer\Model\RecordReferenceEnhancer;
Expand Down Expand Up @@ -51,18 +49,12 @@ final class IndexAgentBuilder
/**
* @var array<string>
*/
private array $stubPaths = [];
private array $excludePatterns = [ ];

/**
* @var array<string>
*/
private array $excludePatterns = [
];

/**
* @var array<TolerantIndexer>|null
*/
private ?array $indexers = null;
private array $stubPaths = [];

private bool $followSymlinks = false;

Expand All @@ -73,15 +65,21 @@ final class IndexAgentBuilder

private LoggerInterface $logger;

private function __construct(private string $indexRoot, private string $projectRoot)
{
private function __construct(
private string $indexRoot,
private string $projectRoot,
private CompositeIndexer $indexBuilder,
) {
$this->enhancer = new NullRecordReferenceEnhancer();
$this->logger = new NullLogger();
}

public static function create(string $indexRootPath, string $projectRoot): self
{
return new self($indexRootPath, $projectRoot);
public static function create(
string $indexRootPath,
string $projectRoot,
CompositeIndexer $indexBuilder,
): self {
return new self($indexRootPath, $projectRoot, $indexBuilder);
}

public function setLogger(LoggerInterface $logger): self
Expand Down Expand Up @@ -116,23 +114,12 @@ public function buildTestAgent(): TestIndexAgent
$search = $this->buildSearch($index);
$index = new SearchAwareIndex($index, $search);
$query = $this->buildQuery($index);
$builder = $this->buildBuilder($index);
$indexer = $this->buildIndexer($builder, $index);
$indexer = $this->buildIndexer($this->indexBuilder, $index);
$search = new HydratingSearchClient($index, $search);

return new RealIndexAgent($index, $query, $search, $indexer);
}

/**
* @param array<TolerantIndexer> $indexers
*/
public function setIndexers(array $indexers): self
{
$this->indexers = $indexers;

return $this;
}

/**
* @param array<string> $excludePatterns
*/
Expand Down Expand Up @@ -180,6 +167,9 @@ public function setStubPaths(array $stubPaths): self
return $this;
}

/**
* Builds the file index
*/
private function buildIndex(): Index
{
$repository = new FileRepository(
Expand Down Expand Up @@ -212,15 +202,7 @@ private function buildSearch(IndexAccess $index): SearchIndex
return $search;
}

private function buildBuilder(Index $index): IndexBuilder
{
if (null !== $this->indexers) {
return new TolerantIndexBuilder($index, $this->indexers, $this->logger);
}
return TolerantIndexBuilder::create($index);
}

private function buildIndexer(IndexBuilder $builder, Index $index): Indexer
private function buildIndexer(CompositeIndexer $builder, Index $index): Indexer
{
return new Indexer(
$builder,
Expand Down
12 changes: 12 additions & 0 deletions lib/Indexer/Model/CompositeIndexer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

namespace Phpactor\Indexer\Model;

use Phpactor\TextDocument\TextDocument;

interface CompositeIndexer
{
public function index(Index $index, TextDocument $document): void;

public function done(Index $index): void;
}
12 changes: 0 additions & 12 deletions lib/Indexer/Model/IndexBuilder.php

This file was deleted.

10 changes: 7 additions & 3 deletions lib/Indexer/Model/IndexJob.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,11 @@

class IndexJob
{
public function __construct(private IndexBuilder $indexBuilder, private FileList $fileList)
{
public function __construct(
private Index $index,
private CompositeIndexer $indexBuilder,
private FileList $fileList,
) {
}

/**
Expand All @@ -30,11 +33,12 @@ public function generator(): Generator
}

$this->indexBuilder->index(
$this->index,
TextDocumentBuilder::create($contents)->uri($fileInfo->getPathname())->build()
);
yield $fileInfo->getPathname();
}
$this->indexBuilder->done();
$this->indexBuilder->done($this->index);
}

public function run(): void
Expand Down
9 changes: 5 additions & 4 deletions lib/Indexer/Model/Indexer.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class Indexer
private DirtyDocumentTracker $dirtyDocumentTracker;

public function __construct(
private IndexBuilder $builder,
private CompositeIndexer $indexer,
private Index $index,
private FileListProvider $provider,
?DirtyDocumentTracker $dirtyDocumentTracker = null
Expand All @@ -21,14 +21,15 @@ public function __construct(
public function getJob(?string $subPath = null): IndexJob
{
return new IndexJob(
$this->builder,
$this->index,
$this->indexer,
$this->provider->provideFileList($this->index, $subPath)
);
}

public function index(TextDocument $textDocument): void
{
$this->builder->index($textDocument);
$this->indexer->index($this->index, $textDocument);
}

/**
Expand All @@ -37,7 +38,7 @@ public function index(TextDocument $textDocument): void
public function indexDirty(TextDocument $textDocument): void
{
$this->dirtyDocumentTracker->markDirty($textDocument->uri());
$this->builder->index($textDocument);
$this->indexer->index($this->index, $textDocument);
}

public function reset(): void
Expand Down
Loading
Loading