From bc95b33bd98d38cb4df35ce1a926a2fb5d51dde9 Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Wed, 15 Jul 2026 09:41:54 +0100 Subject: [PATCH] implements PLN-0108 --- discussion/index.ndjson | 2 +- ...stance-behind-optional-language-service.md | 2 +- .../compiler/PBSFrontendLanguageService.java | 62 +++++++++++++++++++ .../studio/compiler/PBSFrontendProvider.java | 18 +++++- .../compiler/PBSFrontendProviderTest.java | 5 +- 5 files changed, 84 insertions(+), 5 deletions(-) create mode 100644 prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/PBSFrontendLanguageService.java diff --git a/discussion/index.ndjson b/discussion/index.ndjson index 8a1e3fcc..9bbf5c5d 100644 --- a/discussion/index.ndjson +++ b/discussion/index.ndjson @@ -9,7 +9,7 @@ {"type":"discussion","id":"DSC-0058","status":"open","ticket":"multi-frontend-serializable-ir","title":"Manter a IR comum serializavel por design","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","ir","backend","serialization","multi-frontend"],"agendas":[{"id":"AGD-0061","file":"AGD-0061-multi-frontend-serializable-ir.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[],"plans":[],"lessons":[]} {"type":"discussion","id":"DSC-0057","status":"open","ticket":"multi-frontend-frontend-backend-contract","title":"Estabilizar contrato entre frontend e backend comum","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","compiler-pbs","ir","backend","multi-frontend"],"agendas":[{"id":"AGD-0060","file":"AGD-0060-multi-frontend-frontend-backend-contract.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[],"plans":[],"lessons":[]} {"type":"discussion","id":"DSC-0056","status":"open","ticket":"multi-frontend-remove-pbs-branches","title":"Remover verificacoes explicitas de PBS do codigo comum","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","compiler-pbs","studio","frontend","coupling","multi-frontend"],"agendas":[{"id":"AGD-0059","file":"AGD-0059-multi-frontend-remove-pbs-branches.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[],"plans":[],"lessons":[]} -{"type":"discussion","id":"DSC-0055","status":"in_progress","ticket":"multi-frontend-compiler-vs-language-services","title":"Separar compilacao de servicos editoriais de frontend","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","studio","lsp","editor","frontend","multi-frontend"],"agendas":[{"id":"AGD-0058","file":"AGD-0058-multi-frontend-compiler-vs-language-services.md","status":"accepted","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[{"id":"DEC-0041","file":"DEC-0041-separate-frontend-compilation-from-editorial-language-services.md","status":"accepted","created_at":"2026-07-15","updated_at":"2026-07-15","ref_agenda":"AGD-0058"}],"plans":[{"id":"PLN-0107","file":"PLN-0107-specify-frontend-compiler-and-editorial-capability-boundary.md","status":"done","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0041"]},{"id":"PLN-0108","file":"PLN-0108-move-pbs-editor-assistance-behind-optional-language-service.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0041"]},{"id":"PLN-0109","file":"PLN-0109-make-lsp-editorial-calls-capability-aware.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0041"]},{"id":"PLN-0110","file":"PLN-0110-add-compile-only-frontend-and-absent-capability-conformance-coverage.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0041"]}],"lessons":[]} +{"type":"discussion","id":"DSC-0055","status":"in_progress","ticket":"multi-frontend-compiler-vs-language-services","title":"Separar compilacao de servicos editoriais de frontend","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","studio","lsp","editor","frontend","multi-frontend"],"agendas":[{"id":"AGD-0058","file":"AGD-0058-multi-frontend-compiler-vs-language-services.md","status":"accepted","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[{"id":"DEC-0041","file":"DEC-0041-separate-frontend-compilation-from-editorial-language-services.md","status":"accepted","created_at":"2026-07-15","updated_at":"2026-07-15","ref_agenda":"AGD-0058"}],"plans":[{"id":"PLN-0107","file":"PLN-0107-specify-frontend-compiler-and-editorial-capability-boundary.md","status":"done","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0041"]},{"id":"PLN-0108","file":"PLN-0108-move-pbs-editor-assistance-behind-optional-language-service.md","status":"done","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0041"]},{"id":"PLN-0109","file":"PLN-0109-make-lsp-editorial-calls-capability-aware.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0041"]},{"id":"PLN-0110","file":"PLN-0110-add-compile-only-frontend-and-absent-capability-conformance-coverage.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0041"]}],"lessons":[]} {"type":"discussion","id":"DSC-0054","status":"done","ticket":"multi-frontend-provider-contract","title":"Introduzir provider completo de frontend","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["compiler","compiler-general","studio","frontend","registry","multi-frontend"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0055","file":"discussion/lessons/DSC-0054-multi-frontend-provider-contract/LSN-0055-static-frontend-providers-before-plugin-architecture.md","status":"done","created_at":"2026-07-15","updated_at":"2026-07-15"}]} {"type":"discussion","id":"DSC-0053","status":"open","ticket":"pbs-lsp-call-and-type-hierarchy","title":"PBS LSP Call and Type Hierarchy","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["studio","lsp","vscode","compiler-pbs","editor","call-hierarchy","type-hierarchy"],"agendas":[{"id":"AGD-0056","file":"AGD-0056-pbs-lsp-call-and-type-hierarchy.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[],"plans":[],"lessons":[]} {"type":"discussion","id":"DSC-0052","status":"open","ticket":"pbs-lsp-document-links","title":"PBS LSP Document Links","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["studio","lsp","vscode","compiler-pbs","editor","document-links","imports"],"agendas":[{"id":"AGD-0055","file":"AGD-0055-pbs-lsp-document-links.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[],"plans":[],"lessons":[]} diff --git a/discussion/workflow/plans/PLN-0108-move-pbs-editor-assistance-behind-optional-language-service.md b/discussion/workflow/plans/PLN-0108-move-pbs-editor-assistance-behind-optional-language-service.md index fed06a1c..de41ce38 100644 --- a/discussion/workflow/plans/PLN-0108-move-pbs-editor-assistance-behind-optional-language-service.md +++ b/discussion/workflow/plans/PLN-0108-move-pbs-editor-assistance-behind-optional-language-service.md @@ -2,7 +2,7 @@ id: PLN-0108 ticket: multi-frontend-compiler-vs-language-services title: Move PBS editor assistance behind optional language service -status: open +status: done created: 2026-07-15 ref_decisions: [DEC-0041] tags: [compiler, compiler-general, studio, lsp, editor, frontend, multi-frontend] diff --git a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/PBSFrontendLanguageService.java b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/PBSFrontendLanguageService.java new file mode 100644 index 00000000..e56ceadd --- /dev/null +++ b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/PBSFrontendLanguageService.java @@ -0,0 +1,62 @@ +package p.studio.compiler; + +import p.studio.compiler.messages.FESurfaceContext; +import p.studio.compiler.models.FrontendSemanticToken; +import p.studio.compiler.pbs.ast.PbsAst; +import p.studio.compiler.pbs.semantics.PbsEditorialCompletionCandidate; +import p.studio.compiler.pbs.semantics.PbsEditorialResolvedSymbol; +import p.studio.compiler.pbs.semantics.PbsEditorialSignatureHelp; +import p.studio.compiler.pbs.semantics.PbsEditorialSupportService; +import p.studio.compiler.services.FrontendLanguageService; +import p.studio.utilities.structures.ReadOnlyList; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +public final class PBSFrontendLanguageService implements FrontendLanguageService { + private final PbsEditorialSupportService editorialSupportService; + private final PBSSemanticTokenProvider semanticTokenProvider; + + public PBSFrontendLanguageService() { + this(new PbsEditorialSupportService(), new PBSSemanticTokenProvider()); + } + + PBSFrontendLanguageService( + final PbsEditorialSupportService editorialSupportService, + final PBSSemanticTokenProvider semanticTokenProvider) { + this.editorialSupportService = Objects.requireNonNull(editorialSupportService, "editorialSupportService"); + this.semanticTokenProvider = Objects.requireNonNull(semanticTokenProvider, "semanticTokenProvider"); + } + + public List completion( + final String sourceText, + final PbsAst.File ast, + final ReadOnlyList supplementalTopDecls, + final FESurfaceContext feSurfaceContext, + final int offset) { + return editorialSupportService.completion(sourceText, ast, supplementalTopDecls, feSurfaceContext, offset); + } + + public Optional hover( + final String sourceText, + final PbsAst.File ast, + final ReadOnlyList supplementalTopDecls, + final FESurfaceContext feSurfaceContext, + final int offset) { + return editorialSupportService.hover(sourceText, ast, supplementalTopDecls, feSurfaceContext, offset); + } + + public Optional signatureHelp( + final String sourceText, + final PbsAst.File ast, + final ReadOnlyList supplementalTopDecls, + final FESurfaceContext feSurfaceContext, + final int offset) { + return editorialSupportService.signatureHelp(sourceText, ast, supplementalTopDecls, feSurfaceContext, offset); + } + + public List semanticTokens(final String documentText) { + return semanticTokenProvider.tokenize(documentText == null ? "" : documentText); + } +} diff --git a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/PBSFrontendProvider.java b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/PBSFrontendProvider.java index db1a2c94..a411072a 100644 --- a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/PBSFrontendProvider.java +++ b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/PBSFrontendProvider.java @@ -1,19 +1,30 @@ package p.studio.compiler; import p.studio.compiler.models.FrontendSpec; +import p.studio.compiler.services.FrontendLanguageService; import p.studio.compiler.services.FrontendPhaseService; import p.studio.compiler.services.FrontendProvider; import p.studio.compiler.services.PBSFrontendPhaseService; +import java.util.Optional; + public final class PBSFrontendProvider implements FrontendProvider { private final FrontendPhaseService compiler; + private final PBSFrontendLanguageService languageService; public PBSFrontendProvider() { - this(new PBSFrontendPhaseService()); + this(new PBSFrontendPhaseService(), new PBSFrontendLanguageService()); } PBSFrontendProvider(final FrontendPhaseService compiler) { + this(compiler, new PBSFrontendLanguageService()); + } + + PBSFrontendProvider( + final FrontendPhaseService compiler, + final PBSFrontendLanguageService languageService) { this.compiler = compiler; + this.languageService = languageService; } @Override @@ -25,4 +36,9 @@ public final class PBSFrontendProvider implements FrontendProvider { public FrontendPhaseService compiler() { return compiler; } + + @Override + public Optional languageService() { + return Optional.of(languageService); + } } diff --git a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/PBSFrontendProviderTest.java b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/PBSFrontendProviderTest.java index 06244fc6..3ddd882a 100644 --- a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/PBSFrontendProviderTest.java +++ b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/PBSFrontendProviderTest.java @@ -4,8 +4,8 @@ import org.junit.jupiter.api.Test; import p.studio.compiler.services.PBSFrontendPhaseService; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertTrue; class PBSFrontendProviderTest { @@ -15,6 +15,7 @@ class PBSFrontendProviderTest { assertEquals(PBSDefinitions.PBS.getLanguageId(), provider.specification().getLanguageId()); assertInstanceOf(PBSFrontendPhaseService.class, provider.compiler()); - assertFalse(provider.languageService().isPresent()); + assertTrue(provider.languageService().isPresent()); + assertInstanceOf(PBSFrontendLanguageService.class, provider.languageService().orElseThrow()); } }