From ba3af3c01b5e202397ecdf43b132f10cfdf848ef Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Wed, 15 Jul 2026 08:29:51 +0100 Subject: [PATCH] implements PLN-0105 --- discussion/index.ndjson | 2 +- ...-wrap-pbs-frontend-as-explicit-provider.md | 2 +- prometeu-app/build.gradle.kts | 2 ++ .../src/main/java/p/studio/AppContainer.java | 2 ++ .../studio/compiler/PBSFrontendProvider.java | 28 +++++++++++++++++++ .../compiler/PBSFrontendProviderTest.java | 20 +++++++++++++ .../compiler/FrontendRegistryService.java | 12 ++++---- 7 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/PBSFrontendProvider.java create mode 100644 prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/PBSFrontendProviderTest.java diff --git a/discussion/index.ndjson b/discussion/index.ndjson index 9d6da8a1..49dfec69 100644 --- a/discussion/index.ndjson +++ b/discussion/index.ndjson @@ -10,7 +10,7 @@ {"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":"open","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":"open","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[],"plans":[],"lessons":[]} -{"type":"discussion","id":"DSC-0054","status":"in_progress","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":[{"id":"AGD-0057","file":"AGD-0057-multi-frontend-provider-contract.md","status":"accepted","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[{"id":"DEC-0040","file":"DEC-0040-frontendprovider-explicito-como-contrato-de-frontend.md","status":"accepted","created_at":"2026-07-15","updated_at":"2026-07-15","ref_agenda":"AGD-0057"}],"plans":[{"id":"PLN-0103","file":"PLN-0103-specify-frontend-provider-and-registry-contract.md","status":"done","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0040"]},{"id":"PLN-0104","file":"PLN-0104-introduce-frontendprovider-registry-api.md","status":"done","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0040"]},{"id":"PLN-0105","file":"PLN-0105-wrap-pbs-frontend-as-explicit-provider.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0040"]},{"id":"PLN-0106","file":"PLN-0106-migrate-common-consumers-to-provider-lookup.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0040"]}],"lessons":[]} +{"type":"discussion","id":"DSC-0054","status":"in_progress","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":[{"id":"AGD-0057","file":"AGD-0057-multi-frontend-provider-contract.md","status":"accepted","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[{"id":"DEC-0040","file":"DEC-0040-frontendprovider-explicito-como-contrato-de-frontend.md","status":"accepted","created_at":"2026-07-15","updated_at":"2026-07-15","ref_agenda":"AGD-0057"}],"plans":[{"id":"PLN-0103","file":"PLN-0103-specify-frontend-provider-and-registry-contract.md","status":"done","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0040"]},{"id":"PLN-0104","file":"PLN-0104-introduce-frontendprovider-registry-api.md","status":"done","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0040"]},{"id":"PLN-0105","file":"PLN-0105-wrap-pbs-frontend-as-explicit-provider.md","status":"done","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0040"]},{"id":"PLN-0106","file":"PLN-0106-migrate-common-consumers-to-provider-lookup.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15","ref_decisions":["DEC-0040"]}],"lessons":[]} {"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":[]} {"type":"discussion","id":"DSC-0051","status":"open","ticket":"pbs-lsp-diagnostics-ux","title":"PBS LSP Diagnostics UX","created_at":"2026-07-15","updated_at":"2026-07-15","tags":["studio","lsp","vscode","compiler-pbs","editor","diagnostics","ux"],"agendas":[{"id":"AGD-0054","file":"AGD-0054-pbs-lsp-diagnostics-ux.md","status":"open","created_at":"2026-07-15","updated_at":"2026-07-15"}],"decisions":[],"plans":[],"lessons":[]} diff --git a/discussion/workflow/plans/PLN-0105-wrap-pbs-frontend-as-explicit-provider.md b/discussion/workflow/plans/PLN-0105-wrap-pbs-frontend-as-explicit-provider.md index fbeef9ba..2d2b024b 100644 --- a/discussion/workflow/plans/PLN-0105-wrap-pbs-frontend-as-explicit-provider.md +++ b/discussion/workflow/plans/PLN-0105-wrap-pbs-frontend-as-explicit-provider.md @@ -2,7 +2,7 @@ id: PLN-0105 ticket: multi-frontend-provider-contract title: Wrap PBS frontend as explicit provider -status: open +status: done created: 2026-07-15 ref_decisions: [DEC-0040] tags: [compiler, compiler-general, studio, frontend, registry, multi-frontend] diff --git a/prometeu-app/build.gradle.kts b/prometeu-app/build.gradle.kts index 92e953ee..bbfcdfce 100644 --- a/prometeu-app/build.gradle.kts +++ b/prometeu-app/build.gradle.kts @@ -7,6 +7,8 @@ dependencies { implementation(project(":prometeu-infra")) implementation(project(":prometeu-lsp:prometeu-lsp-api")) implementation(project(":prometeu-lsp:prometeu-lsp-v1")) + implementation(project(":prometeu-compiler:frontends:prometeu-frontend-pbs")) + implementation(project(":prometeu-compiler:prometeu-frontend-registry")) implementation(project(":prometeu-packer:prometeu-packer-api")) implementation(project(":prometeu-packer:prometeu-packer-v1")) implementation(project(":prometeu-studio")) diff --git a/prometeu-app/src/main/java/p/studio/AppContainer.java b/prometeu-app/src/main/java/p/studio/AppContainer.java index 9b1851c5..a73d0b74 100644 --- a/prometeu-app/src/main/java/p/studio/AppContainer.java +++ b/prometeu-app/src/main/java/p/studio/AppContainer.java @@ -2,6 +2,7 @@ package p.studio; import com.fasterxml.jackson.databind.ObjectMapper; import p.packer.Packer; +import p.studio.compiler.FrontendRegistryService; import p.studio.lsp.api.LspServerLifecycle; import p.studio.lsp.events.StudioEventBus; import p.studio.lsp.events.StudioPackerEventAdapter; @@ -24,6 +25,7 @@ public final class AppContainer implements Container { private final LspServerLifecycle lspServerLifecycle; public AppContainer() { + FrontendRegistryService.bootstrapDefaults(); this.i18nService = new I18nService(); this.themeService = new ThemeService(); this.studioEventBus = new StudioEventBus(); 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 new file mode 100644 index 00000000..db1a2c94 --- /dev/null +++ b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/PBSFrontendProvider.java @@ -0,0 +1,28 @@ +package p.studio.compiler; + +import p.studio.compiler.models.FrontendSpec; +import p.studio.compiler.services.FrontendPhaseService; +import p.studio.compiler.services.FrontendProvider; +import p.studio.compiler.services.PBSFrontendPhaseService; + +public final class PBSFrontendProvider implements FrontendProvider { + private final FrontendPhaseService compiler; + + public PBSFrontendProvider() { + this(new PBSFrontendPhaseService()); + } + + PBSFrontendProvider(final FrontendPhaseService compiler) { + this.compiler = compiler; + } + + @Override + public FrontendSpec specification() { + return PBSDefinitions.PBS; + } + + @Override + public FrontendPhaseService compiler() { + return compiler; + } +} 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 new file mode 100644 index 00000000..06244fc6 --- /dev/null +++ b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/PBSFrontendProviderTest.java @@ -0,0 +1,20 @@ +package p.studio.compiler; + +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; + +class PBSFrontendProviderTest { + + @Test + void shouldExposePbsSpecificationAndCompiler() { + final var provider = new PBSFrontendProvider(); + + assertEquals(PBSDefinitions.PBS.getLanguageId(), provider.specification().getLanguageId()); + assertInstanceOf(PBSFrontendPhaseService.class, provider.compiler()); + assertFalse(provider.languageService().isPresent()); + } +} diff --git a/prometeu-compiler/prometeu-frontend-registry/src/main/java/p/studio/compiler/FrontendRegistryService.java b/prometeu-compiler/prometeu-frontend-registry/src/main/java/p/studio/compiler/FrontendRegistryService.java index 0c440e7b..43190fef 100644 --- a/prometeu-compiler/prometeu-frontend-registry/src/main/java/p/studio/compiler/FrontendRegistryService.java +++ b/prometeu-compiler/prometeu-frontend-registry/src/main/java/p/studio/compiler/FrontendRegistryService.java @@ -3,7 +3,6 @@ package p.studio.compiler; import p.studio.compiler.models.FrontendSpec; import p.studio.compiler.services.FrontendPhaseService; import p.studio.compiler.services.FrontendProvider; -import p.studio.compiler.services.PBSFrontendPhaseService; import java.util.HashMap; import java.util.List; @@ -14,7 +13,11 @@ public class FrontendRegistryService { private static final Map FRONTEND_PROVIDERS = new HashMap<>(); static { - register(new StaticFrontendProvider(PBSDefinitions.PBS, new PBSFrontendPhaseService())); + bootstrapDefaults(); + } + + public static void bootstrapDefaults() { + registerIfAbsent(new PBSFrontendProvider()); } public static FrontendSpec getDefaultFrontendSpec() { @@ -64,8 +67,7 @@ public class FrontendRegistryService { FRONTEND_PROVIDERS.put(languageId, provider); } - private record StaticFrontendProvider( - FrontendSpec specification, - FrontendPhaseService compiler) implements FrontendProvider { + private static void registerIfAbsent(final FrontendProvider provider) { + FRONTEND_PROVIDERS.putIfAbsent(provider.specification().getLanguageId(), provider); } }