--- id: AGD-0038 ticket: pbs-lsp-editor-assistance-wave-1 title: Wave 1 de assistencia editorial via LSP para PBS no VS Code status: accepted created: 2026-05-08 resolved: 2026-05-08 decision: DEC-0035 tags: [studio, lsp, vscode, compiler, compiler-pbs, editor, completion, hover, signature-help] --- ## Pain O stack atual de PBS no VS Code ja entrega duas capacidades relevantes: - diagnostics basicos; - semantic highlighting com tema frontend-owned. Mas ele ainda nao entrega o minimo de assistencia editorial para um fluxo real de escrita de codigo: - nao existe `completion`; - `hover` ainda eh placeholder; - nao existe `signature help`. Sem isso, o editor continua servindo mais como viewer colorido com erros do que como ambiente minimamente utilizavel para escrever PBS com conforto. ## Context Domain owner: `studio` Subdomains touched: - `studio/lsp` - `compiler/pbs` - `compiler/general` Estado atual observado no codigo: - o servidor anuncia `hover` e `semanticTokens`, mas nao anuncia `completionProvider`, `signatureHelpProvider` ou `documentFormattingProvider`; - o bridge interno do LSP so expõe `describeServer`, `analyzeDocument`, `hover`, `semanticTokens` e `onSave`; - `hover` hoje retorna texto fixo, sem usar simbolo, assinatura, tipo ou docs; - o pipeline do compiler ja consegue analisar overlay do documento e possui superficies semanticas e de linking relevantes no PBS; - o highlighting recente ja resolve bastante informacao lexical e parte da superficie stdlib/imports. Esta agenda trata apenas da wave 1 de assistencia editorial. Ela nao tenta fechar todo o problema de IDE features. ## Open Questions - Qual deve ser o escopo minimo de `completion` para chamarmos essa wave de utilizavel? - [x] Qual deve ser o escopo minimo de `completion` para chamarmos essa wave de utilizavel? R: keywords, nomes locais em escopo, simbolos importados/publicos, e members apos `.` para superfícies reconhecidas (`service`, `host`, `builtin type`, `struct` e constructors/funcoes relacionados). Sem isso, a feature ainda nao ajuda na descoberta real da API. - `completion` deve nascer apenas com heuristicas lexicais/sintaticas, ou ja deve usar semantica e linking do compiler onde isso for viavel? - [x] `completion` deve nascer apenas com heuristicas lexicais/sintaticas, ou ja deve usar semantica e linking do compiler onde isso for viavel? R: deve nascer compiler-backed sempre que a informacao ja existir de forma confiavel no pipeline semantico/linking. Heuristica local pode existir apenas como complemento estritamente limitado para casos ainda nao resolvidos, nunca como segunda semantica canônica. - Em `hover`, quais informacoes sao obrigatorias na primeira entrega: assinatura, kind, modulo de origem, tipo inferido, documentacao? - [x] Em `hover`, quais informacoes sao obrigatorias na primeira entrega: assinatura, kind, modulo de origem, tipo inferido, documentacao? R: obrigatorios: `kind`, assinatura quando aplicavel, modulo/origem quando relevante, e tipo/shape basico quando houver. Documentacao textual eh desejavel para stdlib e builtins, mas nao deve bloquear a wave 1 se a infraestrutura de docstring ainda nao existir. Se a linguagem vier a adotar algo como `Document(...)` com markdown pronto para hover, isso deve nascer em discussao propria; nesta wave atual, basta preparar o local de consumo para documentacao opcional quando ela existir. - `signature help` deve usar a mesma fonte semantica de `hover/completion`, ou pode nascer numa implementacao mais local para chamadas conhecidas? - [x] `signature help` deve usar a mesma fonte semantica de `hover/completion`, ou pode nascer numa implementacao mais local para chamadas conhecidas? R: deve usar a mesma base semantica. O objetivo da wave eh justamente evitar tres caminhos tecnicos diferentes para responder "qual assinatura esta sendo chamada?". - Como tratar membros de stdlib, aliases importados, services, hosts, builtin types e metodos de struct sem criar uma segunda semantica paralela no LSP? - [x] Como tratar membros de stdlib, aliases importados, services, hosts, builtin types e metodos de struct sem criar uma segunda semantica paralela no LSP? R: o LSP deve perguntar ao compiler por uma superficie editorial/resolutiva unica, derivada das mesmas fontes usadas para analise, linking, stdlib e metadata do frontend. O LSP nao deve reconstruir manualmente tabelas paralelas de membros. - Esta wave deve incluir `go to definition`, ou isso deve ficar explicitamente fora do escopo para nao diluir a entrega? - [x] Esta wave deve incluir `go to definition`, ou isso deve ficar explicitamente fora do escopo para nao diluir a entrega? R: deve ficar fora do escopo desta wave. Ele eh um proximo passo natural, mas nao eh requisito para chamar `completion + hover + signature help` de minimamente utilizaveis. - Formatacao e identacao automatica devem ficar fora desta agenda como non-goal explicito? - [x] Formatacao e identacao automatica devem ficar fora desta agenda como non-goal explicito? R: sim. Podem virar discussao/plan posterior. Nesta wave, elas seriam custo adicional sem impacto proporcional comparado a completion/hover/signature help. ## Options ### Option A - Completion e hover por heuristica leve, com signature help posterior - **Approach:** implementar `completion` usando contexto local, imports, keywords e alguns casos de member access, implementar `hover` com informacao minima, e deixar `signature help` para uma wave seguinte. - **Pro:** menor custo inicial e menor risco de travar na arquitetura semantica. - **Con:** pode criar uma primeira entrega inconsistente, especialmente em chamadas de stdlib e tipos importados, e pode forcar refactor cedo demais depois. - **Maintainability:** media. ### Option B - Wave 1 coerente com completion, hover e signature help sobre uma mesma base semantica - **Approach:** desenhar uma pequena superficie de assistencia editorial no LSP que use uma base comum para resolver simbolos, membros e assinaturas. Entregar juntos: - completion minimo utilizavel; - hover real; - signature help em chamadas. - **Pro:** evita duplicacao conceitual e produz uma experiencia de editor mais consistente desde a primeira wave. - **Con:** custo maior de desenho e implementacao agora. - **Maintainability:** forte. ### Option C - Adiar assistencia semantica e depender do VS Code + snippets - **Approach:** manter diagnostics e colors como estao, adicionar no maximo snippets ou pequenas ajudas na extensao. - **Pro:** quase nenhum custo de backend. - **Con:** nao resolve o problema real; o editor continua insuficiente para escrita cotidiana de PBS. - **Maintainability:** fraca. ## Tradeoffs Option C nao fecha a dor real e deve ser descartada. Option A parece atraente para ganhar velocidade, mas carrega um risco ruim: - introduzir `completion`, `hover` e depois `signature help` por caminhos tecnicos diferentes; - duplicar logica entre parser local, heuristicas e linking; - e transformar a wave 2 num retrabalho de consolidacao. Option B custa mais, mas o custo eh justificavel porque estas tres features se apoiam nas mesmas perguntas: - o que este simbolo representa? - quais membros ele expõe? - qual eh a assinatura desta chamada? - qual o modulo/origem deste item? Se essas perguntas forem respondidas por uma base comum, a wave 1 fica mais coerente e abre caminho natural para futuras features como `definition`, `references` e `inlay hints` via LSP. ## Recommendation Seguir com **Option B**. A recomendacao eh abrir uma wave 1 coerente de assistencia editorial com: - `completion` minimo utilizavel; - `hover` funcional; - `signature help` funcional. Escopo minimo recomendado para `completion`: - keywords; - simbolos locais em escopo; - nomes importados/publicos relevantes; - members apos `.` para stdlib, builtin types, structs e services/hosts reconhecidos. Escopo minimo recomendado para `hover`: - kind do simbolo; - assinatura quando aplicavel; - modulo/origem quando relevante; - tipo ou shape basico quando isso existir de forma confiavel. Escopo minimo recomendado para `signature help`: - chamadas de funcao/metodo/construtor; - parametro ativo; - labels consistentes com a mesma representacao de assinatura usada no hover. ## Discussion O ponto principal desta agenda nao eh “adicionar IDE features” genericamente. O ponto principal eh definir a primeira wave de superfícies de assistencia que tiram o PBS no VS Code do estado de: - diagnostics + coloracao para um estado de: - escrita assistida minima, com descoberta de API e leitura de assinatura. Isso exige disciplina de boundary. O VS Code extension nao deve inventar semantica local. O servidor LSP deve continuar sendo o owner da assistencia editorial. Da mesma forma, o LSP nao deve criar uma semantica paralela desconectada do compiler se ja existe informacao aproveitavel em parser, linking, stdlib e superficies semanticas do PBS. Tambem vale explicitar o que fica fora desta agenda: - formatter completo; - identacao automatica robusta de documento; - quick fixes; - definition/references; - rename; - code actions mais amplas. Esses itens podem virar agenda posterior. Tambem fica registrado um criterio importante de arquitetura: - o primeiro passo nao eh encher o protocolo de features; - o primeiro passo eh criar uma base editorial coerente no lado `compiler/pbs` + `studio/lsp` que consiga responder simbolo, members e assinatura; - `completion`, `hover` e `signature help` sao projeções diferentes sobre a mesma base. E um criterio adicional de preparacao editorial: - a wave 1 deve prever um campo/superficie opcional de documentacao no modelo editorial resolvido por simbolo; - mas a autoria dessa documentacao na linguagem PBS, inclusive eventual anotacao `Document(...)` com markdown, fica fora desta agenda e pode seguir para discussao separada. ## Resolution Resolucao preliminar: - a wave 1 deve ser considerada valida quando o VS Code conseguir oferecer descoberta minima de API, leitura de assinatura e ajuda em chamadas sem depender de conhecimento local na extensao; - `completion`, `hover` e `signature help` devem nascer sobre uma mesma base compiler-backed; - `go to definition`, formatter e outras features de IDE ficam explicitamente fora do escopo. Se esta leitura fizer sentido, o proximo passo eh aceitar a agenda e fechar uma `decision` que: 1. defina o escopo normativo exato de `completion`, `hover` e `signature help`; 2. fixe o boundary entre `compiler/pbs`, `studio/lsp` e `tools/vscode-extension`; 3. declare explicitamente os non-goals desta wave; 4. determine se a base deve nascer compiler-backed desde o inicio ou com alguma heuristica local estritamente limitada. ## Next Step Se voce concordar com o enquadramento, eu converto esta agenda em `accepted` e escrevo a `decision` normativa da wave 1 de assistencia editorial para PBS no VS Code.