prometeu-studio/discussion/lessons/DSC-0056-multi-frontend-remove-pbs-branches/LSN-0058-generic-frontend-editorial-contract-for-lsp.md
bQUARKz a62ddb0f74
Some checks are pending
Intrepid/Prometeu/Studio/pipeline/head Build started...
Intrepid/Prometeu/Studio/pipeline/pr-master Build started...
JaCoCo Coverage #### Project Overview No changes detected, that affect the code coverage. * Line Coverage: 61.73% (17588/28493) * Branch Coverage: 52.44% (6777/12924) * Lines of Code: 28493 * Cyclomatic Complexity: 11423 #### Quality Gates Summary Output truncated.
Test / Build skipped: 15, passed: 616
LSP contract generalization
2026-07-15 11:40:02 +01:00

4.4 KiB

id ticket title created tags
LSN-0058 multi-frontend-remove-pbs-branches Generic Frontend Editorial Contract for LSP 2026-07-15
compiler
compiler-general
compiler-pbs
studio
frontend
lsp
coupling
multi-frontend

Original Problem

Prometeu was preparing for multiple compiler frontends while the LSP bridge still knew too much about PBS internals. The first framing was broad: remove explicit PBS checks from common code. After inspection, that was too blunt.

PBS was already mostly centered in prometeu-frontend-pbs. Defaults, templates, .pbs fixtures, VS Code language registration, semantic keys, and composition-root bootstrap were legitimate PBS references. The real architectural problem was narrower: common LSP code imported and called PBS-specific editorial types and services for semantic tokens, completion, hover, signature help, and semantic read preparation.

Consolidated Decision

The common LSP/editorial path must consume frontend-provided editorial capabilities through generic contracts exposed by prometeu-frontend-api.

The provider contract remains stable:

  1. FrontendProvider.compiler() is mandatory.
  2. FrontendProvider.languageService() is optional.
  3. Compile-only frontends are valid.
  4. Unknown languageId values fail explicitly.
  5. PBS may be the product default only when the user has not chosen a language.

PBS is not the shared editor model. PBS implements the generic contract from inside its frontend boundary.

Final Implementation Shape

The implementation introduced generic frontend editorial DTOs and default methods in FrontendLanguageService:

  1. FrontendDocumentRequest
  2. FrontendEditorialContext
  3. FrontendCompletionCandidate
  4. FrontendHover
  5. FrontendSignatureHelp
  6. FrontendSignature
  7. FrontendSymbolKind
  8. FrontendDocumentation

CompilerLanguageServiceBridge now resolves the selected provider and calls generic FrontendLanguageService methods for semantic tokens, completion, hover, and signature help.

PBS-specific analysis setup moved behind PBSFrontendLanguageService.prepareEditorialContext(...). The bridge no longer imports p.studio.compiler.pbs.*, no longer knows PbsAst.File, and no longer calls PBSFrontendPhaseService.semanticReadSurface(...) directly.

An architectural test now protects the common LSP code from reintroducing PBS implementation imports.

Examples

A frontend with no language service remains valid:

public final class CompileOnlyFrontendProvider implements FrontendProvider {
    @Override
    public FrontendSpec specification() {
        return SPEC;
    }

    @Override
    public FrontendPhaseService compiler() {
        return compiler;
    }
}

An LSP consumer should resolve the selected provider, ask for languageService(), and fall back deterministically when editorial capability is absent.

PBS can still keep rich internal models such as PbsEditorialResolvedSymbol, but those models must be mapped to generic FrontendHover, FrontendCompletionCandidate, or FrontendSignatureHelp before common LSP consumes them.

Pitfalls

Do not remove legitimate PBS defaults just because they mention PBS. PBS remains the product default when the user has not chosen another language.

Do not use PBS as a fallback for unknown languageId. Unknown language identity is a configuration error and must fail explicitly.

Do not make editor assistance mandatory. Compilation and editor support are separate frontend capabilities.

Do not move frontend semantic ownership into LSP or Studio. The LSP bridge transports frontend-owned editorial results; it does not author language semantics.

Do not reintroduce PBS imports in common LSP code for convenience. If a capability needs PBS-specific state, create or extend a frontend-owned generic boundary and keep the PBS mapping inside prometeu-frontend-pbs.

References

  • DEC-0042 locked the generic frontend editorial language-service contract.
  • PLN-0111 introduced generic frontend editorial DTOs and defaults.
  • PLN-0112 migrated semantic tokens.
  • PLN-0113 migrated completion.
  • PLN-0114 migrated hover and documentation.
  • PLN-0115 migrated signature help.
  • PLN-0116 removed PBS imports from common LSP and added boundary coverage.
  • Related lesson: LSN-0055 Static frontend providers before plugin architecture.
  • Related lesson: LSN-0056 Compile-first frontends with optional editorial capabilities.