Visual Studio 语法高亮是如何工作的?

How Visual Studio syntax highlight works?

当我在 aspx 页面中创建标签 'style' 时,Visual Studio highlights 代码使用 css 样式语法来突出显示和格式化。当我创建标签 'script' 时,Visual Studio 做同样的事情,但使用 javascript 样式语法。

当我创建一个 .scss 文件时,Visual Studio 有 scss 语法。我创建了一个处理 SCSS 的新服务器控件,我希望在该服务器控件内编写的代码使用 scss 样式语法。我如何将某个标签传递给某个语法处理器?

Ps.: 我正在使用 Visual Studio 2017

VS 中的编辑器(以及许多与编辑器相关的功能)依赖于指示它们支持的语言的内容类型。大多数编辑器,如 C# 或 VB,只能处理一种内容类型。

HTML 和 Visual Studio 中的 ASPX 编辑器(它们是独立的编辑器)识别某些模式,表明正在使用不同的语言。然后,它会在内存 (TextBuffers) 中创建多个内部文档,并为每种已识别的语言创建单独的内容类型。然后可以使用每个语言的语言服务来本地处理语言,而不是 HTML 必须 "know" 其他所有 CSS/JavaScript/anything。例如:

  • <script> 块或事件处理程序为内容
  • 创建一个 JavaScript 缓冲区
  • <style> 块或 style= 属性创建 CSS 缓冲区
  • 任何 <% 风格的 ASP.NET 块创建适当的语言缓冲区 (C#/VB)
  • Razor CSHTML 文件中的 @ 创建一个 C# 缓冲区
  • 等等

这些嵌套的 TextBuffer 实际上是整个文档,以使语言看起来正确。例如,如果我有:

<span style="color: blue;" />

CSS 缓冲区是一个内部文档,看起来像这样:

/* BEGIN EXTERNAL SOURCE */
span {
color: blue;
}
/* END EXTERNAL SOURCE */

请务必注意,这是一个完整且可解析的 CSS 文档,因此语言服务可以正常工作以查找错误、提供 IntelliSense 等

(如果您认为 CSS 缓冲区看起来很乱,您应该看看 Razor 或 ASPX 块会发生什么...)

然后 ASPX 编辑器使用 VS 编辑器平台将这些缓冲区之间的投影协调到您所看到的单一视图 - TextView。所以它看起来像一个文档,但它在内部作为几个不同的文档 (TextBuffers) 处理,每种语言一个。

现在开始回答您的问题:如何使 ASPX 编辑器支持 SCSS?好吧,这有两个部分:

首先,ASPX 编辑器需要知道如何识别文档的 SCSS 区域。这可能是 <style type="text/scss"> 或其他指标。如果 ASPX 编辑器是可扩展的(HTML 编辑器对编写扩展更友好),甚至可以通过为 ASPX 编辑器编写扩展来完成此操作。

接下来,ASPX 编辑器将创建投影范围。它将把它交给 SCSS 语言服务。 SCSS 语言服务需要知道它在投影中,并生成所有额外的东西以使语法树工作。 (注意:VS 中的 SCSS 语言服务目前不支持此功能。)

从那时起,SCSS区域发生的一切都需要在TextView(光标在你看到的文档中的位置)之间映射到SCSS特定的TextBuffer (光标位于语言服务使用的内存文档中)。同样,今天 SCSS LS 没有考虑到这种情况。

获得此支持的最佳方式是通过 Visual Studio 开发者社区提供反馈。此功能已在积压工作中,但为其添加额外的投票将有助于团队确定工作的优先级。