diff --git a/src/Handler/TextDocumentSyncHandler.php b/src/Handler/TextDocumentSyncHandler.php index 72177bcc..98c765d6 100644 --- a/src/Handler/TextDocumentSyncHandler.php +++ b/src/Handler/TextDocumentSyncHandler.php @@ -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 { @@ -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, ) { } @@ -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; } @@ -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; @@ -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 $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; } } diff --git a/src/Server.php b/src/Server.php index 7512c8ff..7af56dee 100644 --- a/src/Server.php +++ b/src/Server.php @@ -126,10 +126,7 @@ public static function forProject( $handlers = [ new TextDocumentSyncHandler( $documentManager, - $parser, - $classRepository, - $classInfoFactory, - $indexer, + $symbolSource, ), new DefinitionHandler( $documentManager, diff --git a/tests/Handler/CompletionHandlerTest.php b/tests/Handler/CompletionHandlerTest.php index 3b160bd4..1b1c4bd4 100644 --- a/tests/Handler/CompletionHandlerTest.php +++ b/tests/Handler/CompletionHandlerTest.php @@ -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, + ), ); } diff --git a/tests/Handler/DefinitionHandlerTest.php b/tests/Handler/DefinitionHandlerTest.php index 6458571c..3ba74c17 100644 --- a/tests/Handler/DefinitionHandlerTest.php +++ b/tests/Handler/DefinitionHandlerTest.php @@ -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; @@ -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(), @@ -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, ); } diff --git a/tests/Handler/HoverHandlerTest.php b/tests/Handler/HoverHandlerTest.php index 507ee2af..cb7f6eaa 100644 --- a/tests/Handler/HoverHandlerTest.php +++ b/tests/Handler/HoverHandlerTest.php @@ -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; @@ -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(), @@ -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, ); } diff --git a/tests/Handler/SignatureHelpHandlerTest.php b/tests/Handler/SignatureHelpHandlerTest.php index 82c867f1..c3a9c809 100644 --- a/tests/Handler/SignatureHelpHandlerTest.php +++ b/tests/Handler/SignatureHelpHandlerTest.php @@ -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; @@ -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(), @@ -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, ); } diff --git a/tests/Handler/TextDocumentSyncHandlerTest.php b/tests/Handler/TextDocumentSyncHandlerTest.php index e8292447..387c62f9 100644 --- a/tests/Handler/TextDocumentSyncHandlerTest.php +++ b/tests/Handler/TextDocumentSyncHandlerTest.php @@ -7,14 +7,12 @@ 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; @@ -22,6 +20,7 @@ #[CoversClass(TextDocumentSyncHandler::class)] class TextDocumentSyncHandlerTest extends TestCase { + use BuildsSymbolSourceTrait; use LoadsFixturesTrait; private DocumentManager $manager; @@ -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), ); } diff --git a/tests/Resolution/SymbolResolverTest.php b/tests/Resolution/SymbolResolverTest.php index c15dccb6..3f100b7e 100644 --- a/tests/Resolution/SymbolResolverTest.php +++ b/tests/Resolution/SymbolResolverTest.php @@ -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; @@ -72,11 +69,11 @@ 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(), @@ -84,10 +81,7 @@ functionRepository: new DefaultFunctionRepository(), $this->syncHandler = new TextDocumentSyncHandler( $this->documents, - $this->parser, - $this->classRepository, - $classInfoFactory, - $indexer, + $symbolSource, ); }