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
:
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
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:
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.
Corrigido via https://github.com/sveltejs/language-tools/pull/285