Language-tools: 使用出现在悬停文档上的文档字符串记录组件

创建于 2020-07-05  ·  16评论  ·  资料来源: sveltejs/language-tools

问题

使用 React 的工具,你可以像这样评论一个组件:

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

但是,在 Svelte 中,我还没有找到一种方法来做到这一点。

解决方案

我想知道我可以在哪里放置评论,这些评论将被 VSCode 和 Vim/Neovim(使用 coc.nvim)等编辑器的悬停文档接收。

为了说明这一点,我在这里悬停MyComponent但我只看到import MyComponent

image

我希望我的文档字符串Documentation that will appear on hover in other places where this is imported包含在工具提示中。

我已经搜索了一段时间并尝试使用 TypeScript 进行本地设置,但找不到方法。 我发现了一个关于 Svelte 组件元数据的有趣相关讨论,但讨论更多是关于 prop 类型。

编辑:由于我们正在讨论这是否更好地添加到编译器中,我在这里创建了一个类似的问题https://github.com/sveltejs/svelte/issues/5102

Fixed enhancement

所有16条评论

由于这对于没有脚本标记的组件也很有价值,我建议为此使用 HTML 注释。 svelte2tsx然后会查找以特殊标签(如@doc )开头的 HTML 注释,并将内容作为 jsdoc 放在默认导出之上。

意见? 其他想法?

我真的很想尝试实现这一点。 但是我认为它需要仔细设计,因为它是一些开发人员_非常经常_每天使用的功能。

想到的事情是:

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

在文件的开头。 但我认为只有 HTML 注释可以在那里工作,对吗?

此外,也许为了使其与其他标签更相似,我觉得类似于<svelte:head><svelte:documentation>标签可能很好,但这需要在编译器中实现。

也许甚至<svelte:options documentation="blabla" />

这还需要在编译器中进行一些工作并获得主存储库的批准。 选项得到了编译器的验证。

我在主 repo 上创建了一个类似的问题,让我们看看我们是否可以得出一些结论:+1:

一旦https://github.com/sveltejs/language-tools/pull/282合并,一半就完成了。 LSP 没有在悬停时显示文档字符串。

现在我需要做的是从@doc HTML 注释中获取文档字符串并将其添加到 svelte2tsx 中的addComponentExport

@dummdidumm目前无法将文档字符串添加到默认导出中,因为它们没有命名:

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

我想,既然可以在每个文件的根范围内进行的唯一事情是render和默认导出,那么给它一个像Component这样的通用名称是无害的? 或者也许从文件名中选择?

是的,这应该没问题。

是否有任何代码最终成为应用程序运行时的一部分,还是仅用于工具支持?

只是为了工具。
关于默认导出:我们需要检查它如何影响导入自动完成。

对的嗯。 我不明白它目前是如何工作的。 如果我尝试在仅 TS 的环境中模拟它,如下所示:

// Component.ts
export default class {}

我没有在其他文件上获得Component自动补全,但在 Svelte 上它以某种方式工作。 我可能应该阅读 LSP 中的相关代码。

无论如何,如果我这样做:

// Component.ts
export default class Component {}

然后我会在其他文件上将默认导出自动完成为Component 。 所以我支持安全的赌注是将默认导出命名为与文件相同的名称,现在,然后对其进行实时测试。

好的,所以我尝试了两个选项,但是对于我们的 LSP,唯一适用于组件导入自动完成的方法是:

export default class {
  // etc
}

我尝试过的事情:

  • 声明一个类,然后在不同的行中将其导出为默认值。
  • export default class Name行中添加名称。

~它们都不起作用。 我现在正在查看完成提供程序(https://github.com/sveltejs/language-tools/blob/master/packages/language-server/src/plugins/typescript/features/CompletionProvider.ts)以查看在哪里罪魁祸首是,因为在仅 TS 的环境中,我会根据类的名称完成命名类的默认导出。~

更新:只要导出的名称与文件名相同,就可以声明一个类,然后在不同的行中将其导出为默认值。 我要去这个选项。

是的,svelte 组件的导入完成有一些额外的代码,基本上是构建导入建议。 如果 svelte2tsx 具有与文件名相同的命名默认导出,则该代码可能会被丢弃。

此页面是否有帮助?
0 / 5 - 0 等级