4.7 KiB
4.7 KiB
LSP Roadmap — do “base usable” até “LSP completo”
Este documento é o mapa incremental pós
lsp-base,lsp-hightlight-base,lsp-completion-base. A ideia é manter o LSP evoluindo sem rework, enquanto SDK/ECS/Packer avançam em paralelo.
Estado atual (após os 3 PRs base)
✅ Já temos
- Diagnostics (publishDiagnostics)
- Definition (goto definition)
- DocumentSymbol / WorkspaceSymbol
- Semantic tokens (lexer-first)
- Completion mínimo (keywords/builtins/top-level/module/workspace)
❌ Ainda não temos
- references / rename
- hover / signatureHelp
- completion com locals em scope
- semantic tokens semântico (type vs fn vs var)
- incremental analysis real (por arquivo / cancelation)
- debug map pc→span integrado com traps
- code actions / formatting
Próximos PRs recomendados (ordem sugerida)
PR-09 — References + Rename (seguro)
Objetivo
Habilitar references, prepareRename, rename com regras de segurança.
Pré-requisitos
RefIndexcompleto (SymbolId -> usos em spans)NodeToSymbolestávelTriviaIndex(comments/strings) para não renomear spans proibidos
Regras de segurança
- Não renomear símbolo não-resolvido
- Não renomear em comentário/string
- Renomear deve gerar
WorkspaceEditapenas para spans válidos
Testes
- Fixture com 2 arquivos: rename atualiza todas as refs
- Fixture: rename em comentário não altera nada
PR-10 — Hover + SignatureHelp
Objetivo
hover: mostrar tipo + docstring (docstring opcional)signatureHelp: para call nodes
Pré-requisitos
- Type facts básicos:
NodeId -> TypeId - Modelo de assinatura: para functions (params, retorno)
Testes
- Hover em símbolo mostra tipo
- SignatureHelp em chamada mostra params
PR-11b — Completion com locals em scope
Objetivo
Autocomplete útil para código real:
- locals/params
- shadowing correto
Pré-requisitos
-
Binder/Scope facts:
Position -> ScopeIdScopeId -> bindings (name -> SymbolId/TypeId)
Testes
- Dentro de bloco, sugere variável local
- Shadowing: sugere a mais interna
PR-12b — Semantic tokens resolver-backed (semântico)
Objetivo
Melhorar highlight:
- diferenciar
typevsfunctionvsvariablevsparametervsmodule
Pré-requisitos
NodeAtPositionconfiávelNodeToSymbolconfiávelSymbolKindconsistente
Testes
- Identificador de tipo recebe token
type - Função recebe token
function
PR-13 — Formatting + Code Actions (opcional)
Objetivo
-
textDocument/formatting(nem que seja formatter simples/estável) -
code actions básicas:
- organizar imports
- criar stub de função/struct
Pré-requisitos
- AST pretty printer (ou formatter incremental)
PR-14 — Incremental analysis + cancelation (de verdade)
Objetivo
Sair do rebuild coarse:
- recompilar somente arquivo/módulo afetado
- cancelamento real de builds longos
- snapshots por versão
Pré-requisitos
- Graph de dependências por módulo
- Cache de parse/resolve por arquivo
revisionpor doc
Testes
- Editar arquivo A não recompila projeto inteiro
- Cancel: digitar rápido não aplica resultados velhos
PR-15 — Debug map (pc→span) + integração com traps
Objetivo
Quando a VM gerar trap/runtime error:
- mapear
pcparaSpan - mostrar erro com localização exata
Pré-requisitos
- SourceMap gerado no backend bytecode
- runtime expõe
pc/contexto
Testes
- programa que gera trap aponta para linha/col corretos
Backlog adicional (nice to have)
workspace/didChangeWatchedFiles(reagir a mudanças fora do editor)textDocument/codeLens(ex.: run test / run main)textDocument/inlayHintworkspace/diagnosticpull-mode (se quiser)- semanticTokens
rangeedeltapara performance
Interação com SDK/ECS/Packer
Com os 3 PRs base, você já consegue:
- escrever SDK/ECS em PBS com feedback imediato
- navegar rapidamente pelo código
- manter arquivos grandes com highlight
- usar completion para nomes de APIs
Enquanto isso, em paralelo:
- packer pode evoluir (não depende do LSP)
- quando packer estabilizar, podemos adicionar code actions/codelens para “build/pack/run” direto no VSCode
Definição de “LSP completo” (para Prometeu view-ready)
Para chamar de "completo" (na sua visão de produto):
- ✅ diagnostics
- ✅ definition
- ✅ symbols
- ✅ highlight semântico
- ✅ completion com scope + members
- ✅ hover + signatureHelp
- ✅ references + rename
- ✅ incremental + cancel
- ✅ debug map integrado com traps
A ordem acima é incremental por valor percebido e por dependências.