Language-tools: Documentando componentes com uma docstring que aparece na documentação instantânea

Criado em 5 jul. 2020  ·  16Comentários  ·  Fonte: sveltejs/language-tools

Problema

Com as ferramentas do React, você pode comentar sobre um componente como este:

/** Documentation that will appear on hover in other places where this is imported */
function MyComponent() { return null }

No entanto, em Svelte, não encontrei uma maneira de fazer isso.

Solução

Gostaria de saber onde posso colocar um comentário que será retomado pela documentação on-hover de editores como VSCode e Vim / Neovim (com coc.nvim).

Para ilustrar, aqui estou pairando sobre MyComponent mas vejo apenas import MyComponent :

image

Eu gostaria que minha docstring Documentation that will appear on hover in other places where this is imported fosse incluída na dica de ferramenta.

Eu pesquisei por isso por um tempo e tentei minha configuração local com o TypeScript e não consigo encontrar uma maneira de fazer isso. Eu encontrei uma discussão relacionada interessante sobre metadados para componentes Svelte, mas a discussão é mais sobre tipos de prop.

Edit: já que estamos discutindo se isso é melhor adicionado ao compilador, criei um problema análogo aqui https://github.com/sveltejs/svelte/issues/5102

Fixed enhancement

Todos 16 comentários

Uma vez que isso também pode ser valioso para componentes sem uma tag de script, proponho usar o comentário HTML para isso. svelte2tsx procuraria comentários HTML começando com uma tag especial (como @doc ) e colocaria o conteúdo como um jsdoc acima da exportação padrão.

Opiniões? Outras idéias?

Eu estaria realmente interessado em tentar implementar isso. No entanto, acho que precisa ser projetado com cuidado porque é um recurso que alguns desenvolvedores usam _muito frequentemente_ todos os dias.

Algo que vem à mente é:

/**
 * <strong i="6">@file</strong> Here is my documentation for this component
 */

No início do arquivo. Mas acho que apenas comentários HTML funcionam lá, certo?

Além disso, talvez para torná-la mais semelhante às outras tags, acho que uma tag <svelte:documentation> semelhante a <svelte:head> poderia ser legal, mas precisaria ser implementada no compilador.

Talvez até <svelte:options documentation="blabla" /> ?

Isso também precisará de algum trabalho no compilador e da aprovação do repo principal. As opções foram verificadas pelo compilador.

Eu criei um problema análogo no repo principal, vamos ver se podemos chegar a alguma conclusão: +1:

Metade disso é feito quando https://github.com/sveltejs/language-tools/pull/282 é mesclado. O LSP não estava mostrando strings de documentação ao pairar.

Agora o que eu preciso fazer é obter uma docstring de um comentário HTML @doc e adicioná-la a addComponentExport no svelte2tsx.

@dummdidumm Atualmente não é possível adicionar docstrings às exportações padrão, uma vez que eles não são nomeados:

export default class {
    $$prop_def = __sveltets_partial(render().props)
    $$slot_def = render().slots
}

Suponho que, como as únicas coisas que podem ir para o escopo raiz de cada arquivo são render e a exportação padrão, é inofensivo dar a ele um nome genérico como Component ? Ou talvez escolha o nome do arquivo?

Sim, isso não deve ser problema.

Algum desse código acaba fazendo parte do tempo de execução de um aplicativo ou está lá apenas para o suporte de ferramentas?

Apenas para ferramentas.
Sobre a exportação padrão: precisamos verificar como isso afeta o preenchimento automático da importação.

Certo, hmm. Não entendo como funciona atualmente. Se eu tentar emular isso em um ambiente somente TS como este:

// Component.ts
export default class {}

Não consigo preenchimentos automáticos para Component em outros arquivos, mas no Svelte funciona de alguma forma. Eu provavelmente deveria ler o código relacionado no LSP.

De qualquer forma, se eu fizer isso em vez disso:

// Component.ts
export default class Component {}

Em seguida, obtenho preenchimentos automáticos para a exportação padrão como Component em outros arquivos. Portanto, apoio que a aposta segura é nomear a exportação padrão da mesma forma que o arquivo, por enquanto, e testá-la ao vivo.

Tudo bem, tentei duas opções, mas com nosso LSP, a única coisa que funciona para o preenchimento automático de importações de componentes é:

export default class {
  // etc
}

Coisas que eu tentei:

  • Declarar uma classe e, em seguida, exportá-la como padrão em uma linha diferente.
  • Adicionando o nome certo na linha export default class Name .

~ Nenhum deles funciona. Agora estou olhando para o provedor de conclusão (https://github.com/sveltejs/language-tools/blob/master/packages/language-server/src/plugins/typescript/features/CompletionProvider.ts) para ver onde o o culpado é, uma vez que em ambientes apenas de TS eu obtenho conclusões para exportações padrão de classes nomeadas, com base no nome da classe. ~

Atualizar: declarar uma classe e depois exportá-la como padrão em uma linha diferente funciona, desde que o nome da exportação seja igual ao nome do arquivo. Estou indo para esta opção.

Sim, a conclusão de importação para componentes svelte tem algum código extra lá, essencialmente construindo a sugestão de importação. Talvez esse código possa ser descartado se svelte2tsx tiver uma exportação padrão nomeada que é igual ao nome do arquivo.

Esta página foi útil?
0 / 5 - 0 avaliações