Skip to content

Completude de LMHT sensível a contexto e com inserção de marcação (#103)#123

Merged
leonelsanchesdasilva merged 1 commit into
DesignLiquido:principalfrom
oxbar:corrige-completude-lmht-103
Jul 26, 2026
Merged

Completude de LMHT sensível a contexto e com inserção de marcação (#103)#123
leonelsanchesdasilva merged 1 commit into
DesignLiquido:principalfrom
oxbar:corrige-completude-lmht-103

Conversation

@oxbar

@oxbar oxbar commented Jul 26, 2026

Copy link
Copy Markdown
Contributor

Completude de LMHT sensível a contexto e com inserção de marcação

Fixes #103

Problema

O provedor de completude de LMHT devolvia sempre a mesma lista de 122 tags, em qualquer posição do cursor — fora de tag, dentro de tag, em texto ou em comentário, o resultado era idêntico. E nenhum item definia insertText: escolher titulo1 inseria o texto pelado, não <titulo1></titulo1>. Também não havia completude de atributos.

Solução

Reescrita seguindo a técnica de contexto que o provedor de FolEs desta mesma extensão já usa (o achado da issue). O provedor determina o contexto do cursor analisando o texto até a posição e decide o que sugerir:

Comentário (<!-- sem --> correspondente antes do cursor) → não sugere nada.

Abertura de tag (após <nome com espaço, sem > de fechamento) → sugere atributos, não estruturas. Reutiliza o dicionário que já existia em fontes/linguagens/lmht/atributos.ts, inserindo atributo="$0" com o cursor entre as aspas.

Posição de estrutura (início de arquivo, após > ou <) → sugere as tags como snippet:

  • estruturas normais inserem <tag>$0</tag> com o cursor no meio;
  • as oito estruturas que correspondem a tags vazias (void) em HTML — area, campo, coluna, imagem, linha-horizontal, quebra-linha, quebra-linha-oportuna, recurso — inserem <tag /> sem fechamento.

Antes e depois (medido)

Contexto do cursor Antes Depois
Fora de qualquer tag 122 tags 122 estruturas (agora com snippet)
Dentro de uma tag aberta 122 tags atributos da tag
Dentro de um comentário 122 tags nada
titulo1 (insertText) texto pelado <titulo1>│</titulo1>
imagem (void, insertText) texto pelado <imagem │/>
atributo classe (insertText) classe="│"

Decisão de escopo: texto livre dentro de estrutura

A issue lista "dentro de texto de parágrafo" como caso a suprimir. Optei por manter a sugestão de estruturas ali, porque LMHT permite aninhar tags no meio do texto — <paragrafo>olá <negrito>mundo</negrito></paragrafo> é válido, e suprimir a completude quebraria esse aninhamento legítimo. É também o comportamento do suporte a HTML embutido do VSCode, citado como referência positiva na própria issue. Comentário e abertura-de-tag continuam tratados como pedido.

Testes

A suíte de LMHT foi reescrita (10 casos) cobrindo os três contextos:

  • estruturas: sugere fora de tag e após >; insere <titulo1>$0</titulo1>; insere <imagem $0/> para tag vazia; todos os itens têm label, documentação e insertText;
  • atributos: sugere atributos dentro da abertura da tag e não sugere estruturas ali; insere classe="$0";
  • comentário: não sugere nada dentro do comentário e volta a sugerir após o -->.

Os mocks de vscode foram completados (SnippetString, MarkdownString, Position, Range) e o mock de atributos adicionado.

Suíte completa: 970 testes passando (sem a suíte com falha pré-existente de ordenação)
tsc --noEmit: sem novos erros de tipo

Checklist

  • insertText com SnippetString: titulo1<titulo1>│</titulo1>
  • Tags vazias (void) inserem <tag />, sem fechamento incorreto
  • Comentário: sugestões suprimidas
  • Abertura de tag: sugere atributos, não as 122 estruturas
  • Reaproveita atributos.ts já existente; nenhuma dependência nova
  • Suíte de LMHT reescrita cobrindo os três contextos (10 casos)

…signLiquido#103)

O provedor de completude de LMHT devolvia sempre a mesma lista de 122
tags, em qualquer posição do cursor, e sem insertText: escolher
'titulo1' inseria o texto pelado, não '<titulo1></titulo1>'. Não havia
completude de atributos, e sugestões apareciam até dentro de
comentários.

Reescrita seguindo a técnica de contexto que o provedor de FolEs desta
mesma extensão já usa. O provedor agora determina o contexto do cursor
analisando o texto até a posição e decide o que sugerir:

- Comentário (<!-- sem --> correspondente antes do cursor): não sugere
  nada.
- Abertura de tag (após '<nome ' com espaço, sem '>' de fechamento):
  sugere atributos, não estruturas. Usa o dicionário de atributos que
  já existia em fontes/linguagens/lmht/atributos.ts, inserindo
  'atributo="|"' com o cursor entre as aspas.
- Posição de estrutura (início de arquivo, após '>' ou '<'): sugere as
  tags como snippet. Estruturas normais inserem '<tag>|</tag>' com o
  cursor no meio; as oito estruturas que correspondem a tags vazias
  (void) em HTML — area, campo, coluna, imagem, linha-horizontal,
  quebra-linha, quebra-linha-oportuna, recurso — inserem '<tag />' sem
  fechamento.

Decisão de escopo: texto livre dentro de uma estrutura (por exemplo,
após '<paragrafo>') continua sugerindo estruturas, porque LMHT permite
aninhar tags no meio do texto ('<p>olá <negrito>mundo</negrito></p>').
Suprimir ali quebraria aninhamento legítimo; é também o comportamento
do suporte a HTML embutido do VSCode, citado como referência na issue.

Testes: a suíte de LMHT foi reescrita (10 casos) cobrindo os três
contextos — estruturas com snippet de abertura/fechamento e de tag
vazia, atributos dentro da tag (e a ausência de estruturas ali), e
supressão dentro de comentário com retomada após o fechamento. Os
mocks de vscode foram completados (SnippetString, MarkdownString,
Position, Range) e o mock de atributos adicionado.

Fixes DesignLiquido#103

@leonelsanchesdasilva leonelsanchesdasilva left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Obrigado!

@leonelsanchesdasilva
leonelsanchesdasilva merged commit 059e613 into DesignLiquido:principal Jul 26, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Completude de LMHT é cega a contexto e não insere marcação

2 participants