带旁白、原创配乐和字幕的课程。幻灯片讲解每一步;所有编辑器片段都是重构演示中在 VS Code 里录制的真实画面。快进的片段在画面上有标注。

课程:SharpLsp 中的代码操作,从 Cmd+. 到 F# 快速修复、生成 match 用例、跨文件重命名、C# 生成方法和添加 using

阅读指南:重构与代码操作

文字稿

欢迎来到 SharpLsp 代码操作快速课程!接下来几分钟,你将学会在任何系统上用 F# 和 C# 修复代码、生成代码,以及跨文件重命名。

首先,你只需要记住一个快捷键。在 Mac 上,按 Command+.。

在 Windows 和 Linux 上,是 Ctrl+.。

或者直接点击灯泡图标。

无论哪种方式,菜单只会列出适用于光标、选区或其下诊断的操作。

那么,这些操作从哪里来?有三个来源。

诊断:警告或错误会提供它自己的修复。

光标:可以重塑的类型或成员。

还有选区:作用于你所选代码的重构。

在空行上,菜单是空的。SharpLsp 从不瞎猜。

我们从 F# 开始。这个 describe 函数对 stage 做 match,但漏了一个联合用例。

编译器用警告 FS0025 标出它:模式匹配不完整。

按 Command+.,选择 Generate missing union case,SharpLsp 就会替你写出这个分支。

想要兜底分支?Add wildcard case 也就在旁边。

这是结果。新分支恰好匹配了缺失的那个用例,

因为 F# 编译器知道联合类型的每一个用例。你只需要写函数体。

这只是整套 F# 修复工具中的一个,每一个都对应一条编译器诊断。

名字无法解析?添加 open。绑定未使用?加上下划线前缀。值被丢弃?用管道传给 ignore。

除了 match,SharpLsp 还能生成缺失的记录字段和接口成员存根。

重命名和代码操作是分开的。把光标放在符号上,按 F2。

输入新名字,然后按回车。

所有引用都会跟着改,即使在其他文件里。这里,Program.fs 中的调用也更新了。

在 C# 中,重命名基于 Roslyn 加载的解决方案;在 F# 中,基于已加载的 F# 项目。

现在看 C#。一个很受欢迎的做法:先写出你希望存在的调用。比如 Receipt(invoice)。

它还不存在,所以编译器报错。

Command+.,选择 Generate method。

Roslyn 会写出存根,并根据你的调用确定参数类型。

接下来,在没有导入命名空间的情况下使用一个类型,比如 StringBuilder。

快速修复会把 using System.Text 放在最上面。

你也可以就地写出完全限定名,甚至生成一个新类。

这些都直接来自 SharpLsp 内置的 Roslyn 代码修复提供程序。

那么底层发生了什么?编辑器会请求光标处的代码操作。

Roslyn 或 F# 编译器返回一个标题列表,这让菜单保持快速。

只有当你选中一项时,SharpLsp 才会解析它并计算编辑。

结果是一个工作区编辑,可以同时修改多个文件。

如果某个操作已经过时,你得到的是没有编辑,而绝不是瞎猜。

有两样东西不属于代码操作。

SharpLsp 不负责格式化代码。C# 用 CSharpier,F# 用 Fantomas。

Sort Members 则是一个独立命令。在解决方案资源管理器中右键点击一个 C# 类型,即可重新排列它的成员。

来回顾一下。Command+. 或 Ctrl+. 会打开所有适用的操作。

F# 修复跟随编译器诊断,还能写出完整的 match 用例。

F2 可以跨文件重命名。

在 C# 中,你可以先写调用,再生成方法。

完整课程在 SharpLsp 文档里。现在就去修代码吧!