Skip to content
Merged
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
43 changes: 8 additions & 35 deletions src/Handler/TextDocumentSyncHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,9 @@
namespace Firehed\PhpLsp\Handler;

use Firehed\PhpLsp\Document\DocumentManager;
use Firehed\PhpLsp\Index\DocumentIndexer;
use Firehed\PhpLsp\Parser\ParserService;
use Firehed\PhpLsp\Document\TextDocument;
use Firehed\PhpLsp\Knowledge\SymbolSink;
use Firehed\PhpLsp\Protocol\Message;
use Firehed\PhpLsp\Repository\ClassInfoFactory;
use Firehed\PhpLsp\Repository\ClassRepository;
use Firehed\PhpLsp\Utility\ScopeFinder;
use PhpParser\Node\Stmt;

final class TextDocumentSyncHandler implements HandlerInterface
{
Expand All @@ -23,10 +19,7 @@ final class TextDocumentSyncHandler implements HandlerInterface

public function __construct(
private readonly DocumentManager $documentManager,
private readonly ParserService $parser,
private readonly ClassRepository $classRepository,
private readonly ClassInfoFactory $classInfoFactory,
private readonly DocumentIndexer $indexer,
private readonly SymbolSink $symbols,
) {
}

Expand Down Expand Up @@ -66,7 +59,7 @@ private function handleDidOpen(array $params): null
assert(is_string($text));

$this->documentManager->open($uri, $languageId, $version, $text);
$this->indexDocument($uri);
$this->symbols->openDocument($this->documentFor($uri));

return null;
}
Expand All @@ -93,7 +86,7 @@ private function handleDidChange(array $params): null
if (is_array($lastChange) && isset($lastChange['text'])) {
assert(is_string($lastChange['text']));
$this->documentManager->update($uri, $lastChange['text'], $version);
$this->indexDocument($uri);
$this->symbols->updateDocument($this->documentFor($uri));
}

return null;
Expand All @@ -110,37 +103,17 @@ private function handleDidClose(array $params): null
$uri = $textDocument['uri'] ?? '';
assert(is_string($uri));

$this->indexer->remove($uri);
$this->classRepository->removeDocument($uri);
$this->symbols->closeDocument($uri);
$this->documentManager->close($uri);

return null;
}

private function indexDocument(string $uri): void
private function documentFor(string $uri): TextDocument
{
$document = $this->documentManager->get($uri);
assert($document !== null);

$ast = $this->parser->parse($document);
if ($ast !== null) {
$this->registerDocumentClasses($uri, $ast);
}

$this->indexer->index($document);
}

/**
* @param array<Stmt> $ast
*/
private function registerDocumentClasses(string $uri, array $ast): void
{
$classes = [];
foreach (ScopeFinder::iterateTopLevelStatements($ast) as $stmt) {
if ($stmt instanceof Stmt\ClassLike && $stmt->name !== null) {
$classes[] = $this->classInfoFactory->fromAstNode($stmt, $uri);
}
}
$this->classRepository->updateDocument($uri, $classes);
return $document;
}
}
5 changes: 1 addition & 4 deletions src/Server.php
Original file line number Diff line number Diff line change
Expand Up @@ -126,10 +126,7 @@ public static function forProject(
$handlers = [
new TextDocumentSyncHandler(
$documentManager,
$parser,
$classRepository,
$classInfoFactory,
$indexer,
$symbolSource,
),
new DefinitionHandler(
$documentManager,
Expand Down
12 changes: 8 additions & 4 deletions tests/Handler/CompletionHandlerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -100,10 +100,14 @@ protected function setUp(): void
$this->handler = $this->makeHandler($this->catalog);
$this->syncHandler = new TextDocumentSyncHandler(
$this->documents,
$this->parser,
$this->classRepository,
$this->classInfoFactory,
$this->indexer,
new DelegatingSymbolSource(
$this->classRepository,
$this->symbolIndex,
$this->catalog,
$this->indexer,
$this->classInfoFactory,
$this->parser,
),
);
}

Expand Down
12 changes: 3 additions & 9 deletions tests/Handler/DefinitionHandlerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,6 @@
use Firehed\PhpLsp\Document\DocumentManager;
use Firehed\PhpLsp\Handler\DefinitionHandler;
use Firehed\PhpLsp\Handler\TextDocumentSyncHandler;
use Firehed\PhpLsp\Index\DocumentIndexer;
use Firehed\PhpLsp\Index\SymbolExtractor;
use Firehed\PhpLsp\Index\SymbolIndex;
use Firehed\PhpLsp\Parser\ParserService;
use Firehed\PhpLsp\Protocol\RequestMessage;
use Firehed\PhpLsp\Repository\ClassLocator;
Expand Down Expand Up @@ -48,9 +45,10 @@ protected function setUp(): void
);
$memberResolver = new MemberResolver($this->classRepository);
$typeResolver = new BasicTypeResolver($memberResolver, new DefaultFunctionRepository());
$symbolSource = $this->symbolSourceFor($this->classRepository, $this->parser);
$symbolResolver = new SymbolResolver(
$this->parser,
$this->symbolSourceFor($this->classRepository, $this->parser),
$symbolSource,
$memberResolver,
$typeResolver,
new DefaultFunctionRepository(),
Expand All @@ -59,13 +57,9 @@ protected function setUp(): void
$this->documents,
$symbolResolver,
);
$indexer = new DocumentIndexer($this->parser, new SymbolExtractor(), new SymbolIndex());
$this->syncHandler = new TextDocumentSyncHandler(
$this->documents,
$this->parser,
$this->classRepository,
$classInfoFactory,
$indexer,
$symbolSource,
);
}

Expand Down
12 changes: 3 additions & 9 deletions tests/Handler/HoverHandlerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,6 @@
use Firehed\PhpLsp\Document\DocumentManager;
use Firehed\PhpLsp\Handler\HoverHandler;
use Firehed\PhpLsp\Handler\TextDocumentSyncHandler;
use Firehed\PhpLsp\Index\DocumentIndexer;
use Firehed\PhpLsp\Index\SymbolExtractor;
use Firehed\PhpLsp\Index\SymbolIndex;
use Firehed\PhpLsp\Parser\ParserService;
use Firehed\PhpLsp\Protocol\MarkupKind;
use Firehed\PhpLsp\Protocol\NotificationMessage;
Expand Down Expand Up @@ -54,9 +51,10 @@ protected function setUp(): void
);
$memberResolver = new MemberResolver($this->classRepository);
$typeResolver = new BasicTypeResolver($memberResolver, new DefaultFunctionRepository());
$symbolSource = $this->symbolSourceFor($this->classRepository, $this->parser);
$this->symbolResolver = new SymbolResolver(
$this->parser,
$this->symbolSourceFor($this->classRepository, $this->parser),
$symbolSource,
$memberResolver,
$typeResolver,
new DefaultFunctionRepository(),
Expand All @@ -65,13 +63,9 @@ protected function setUp(): void
// minimal client is served); the fenced-markdown path is exercised
// explicitly below.
$this->handler = $this->handlerFor(MarkupKind::PlainText);
$indexer = new DocumentIndexer($this->parser, new SymbolExtractor(), new SymbolIndex());
$this->syncHandler = new TextDocumentSyncHandler(
$this->documents,
$this->parser,
$this->classRepository,
$this->classInfoFactory,
$indexer,
$symbolSource,
);
}

Expand Down
12 changes: 3 additions & 9 deletions tests/Handler/SignatureHelpHandlerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@
use Firehed\PhpLsp\Handler\SignatureHelpHandler;
use Firehed\PhpLsp\Handler\TextDocumentSyncHandler;
use Firehed\PhpLsp\Index\ComposerClassLocator;
use Firehed\PhpLsp\Index\DocumentIndexer;
use Firehed\PhpLsp\Index\SymbolExtractor;
use Firehed\PhpLsp\Index\SymbolIndex;
use Firehed\PhpLsp\Parser\ParserService;
use Firehed\PhpLsp\Repository\DefaultClassInfoFactory;
use Firehed\PhpLsp\Repository\DefaultClassRepository;
Expand Down Expand Up @@ -49,9 +46,10 @@ protected function setUp(): void
);
$this->memberResolver = new MemberResolver($this->classRepository);
$typeResolver = new BasicTypeResolver($this->memberResolver, new DefaultFunctionRepository());
$symbolSource = $this->symbolSourceFor($this->classRepository, $this->parser);
$symbolResolver = new SymbolResolver(
$this->parser,
$this->symbolSourceFor($this->classRepository, $this->parser),
$symbolSource,
$this->memberResolver,
$typeResolver,
new DefaultFunctionRepository(),
Expand All @@ -60,13 +58,9 @@ protected function setUp(): void
$this->documents,
$symbolResolver,
);
$indexer = new DocumentIndexer($this->parser, new SymbolExtractor(), new SymbolIndex());
$this->syncHandler = new TextDocumentSyncHandler(
$this->documents,
$this->parser,
$this->classRepository,
$this->classInfoFactory,
$indexer,
$symbolSource,
);
}

Expand Down
11 changes: 3 additions & 8 deletions tests/Handler/TextDocumentSyncHandlerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,20 @@
use Firehed\PhpLsp\Document\DocumentManager;
use Firehed\PhpLsp\Domain\ClassName;
use Firehed\PhpLsp\Handler\TextDocumentSyncHandler;
use Firehed\PhpLsp\Index\DocumentIndexer;
use Firehed\PhpLsp\Index\SymbolExtractor;
use Firehed\PhpLsp\Index\SymbolIndex;
use Firehed\PhpLsp\Parser\ParserService;
use Firehed\PhpLsp\Protocol\NotificationMessage;
use Firehed\PhpLsp\Repository\ClassLocator;
use Firehed\PhpLsp\Repository\DefaultClassInfoFactory;
use Firehed\PhpLsp\Repository\DefaultClassRepository;
use Firehed\PhpLsp\Tests\BuildsSymbolSourceTrait;
use Firehed\PhpLsp\Tests\LoadsFixturesTrait;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\TestCase;

#[CoversClass(TextDocumentSyncHandler::class)]
class TextDocumentSyncHandlerTest extends TestCase
{
use BuildsSymbolSourceTrait;
use LoadsFixturesTrait;

private DocumentManager $manager;
Expand All @@ -37,13 +36,9 @@ protected function setUp(): void
$this->classInfoFactory = new DefaultClassInfoFactory();
$locator = self::createStub(ClassLocator::class);
$this->classRepository = new DefaultClassRepository($this->classInfoFactory, $locator, $this->parser);
$indexer = new DocumentIndexer($this->parser, new SymbolExtractor(), new SymbolIndex());
$this->handler = new TextDocumentSyncHandler(
$this->manager,
$this->parser,
$this->classRepository,
$this->classInfoFactory,
$indexer,
$this->symbolSourceFor($this->classRepository, $this->parser),
);
}

Expand Down
12 changes: 3 additions & 9 deletions tests/Resolution/SymbolResolverTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,6 @@

use Firehed\PhpLsp\Document\DocumentManager;
use Firehed\PhpLsp\Handler\TextDocumentSyncHandler;
use Firehed\PhpLsp\Index\DocumentIndexer;
use Firehed\PhpLsp\Index\SymbolExtractor;
use Firehed\PhpLsp\Index\SymbolIndex;
use Firehed\PhpLsp\Parser\ParserService;
use Firehed\PhpLsp\Repository\ClassLocator;
use Firehed\PhpLsp\Repository\DefaultClassInfoFactory;
Expand Down Expand Up @@ -72,22 +69,19 @@ protected function setUp(): void
);
$memberResolver = new MemberResolver($this->classRepository);
$typeResolver = new BasicTypeResolver($memberResolver, new DefaultFunctionRepository());
$indexer = new DocumentIndexer($this->parser, new SymbolExtractor(), new SymbolIndex());
$symbolSource = $this->symbolSourceFor($this->classRepository, $this->parser);

$this->resolver = new SymbolResolver(
parser: $this->parser,
symbolSource: $this->symbolSourceFor($this->classRepository, $this->parser),
symbolSource: $symbolSource,
memberResolver: $memberResolver,
typeResolver: $typeResolver,
functionRepository: new DefaultFunctionRepository(),
);

$this->syncHandler = new TextDocumentSyncHandler(
$this->documents,
$this->parser,
$this->classRepository,
$classInfoFactory,
$indexer,
$symbolSource,
);
}

Expand Down