# 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

* `RefIndex` completo (SymbolId -> usos em spans)
* `NodeToSymbol` estável
* `TriviaIndex` (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 `WorkspaceEdit` apenas 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 -> ScopeId`
    * `ScopeId -> 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 `type` vs `function` vs `variable` vs `parameter` vs `module`

### Pré-requisitos

* `NodeAtPosition` confiável
* `NodeToSymbol` confiável
* `SymbolKind` consistente

### 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
* `revision` por 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 `pc` para `Span`
* 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/inlayHint`
* `workspace/diagnostic` pull-mode (se quiser)
* semanticTokens `range` e `delta` para 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.
