菜单

语言服务

相关源文件

TypeScript 语言服务通过提供丰富的 API 来实现编辑器集成和代码智能功能。它位于 TypeScript 编译器核心与编辑器工具、IDE 或其他需要分析 TypeScript 代码的工具之间。本文档解释了语言服务的架构和功能。

有关 TypeScript 编译器本身的信息,请参阅 编译器核心

概述

语言服务通过利用 TypeScript 编译器的类型系统,提供诸如代码补全、错误检查、导航和重构等类似编辑器的功能。它旨在为编辑器中发生变化的代码提供高效、增量式和按需分析。

来源: src/services/services.ts1-400 src/compiler/types.ts1-200 src/services/utilities.ts1-100

架构

语言服务有三个主要组件

  1. 语言服务接口:为编辑器功能提供 API
  2. 语言服务主机:由客户端实现,提供文本内容、编译器选项等
  3. 文档注册表:管理源文件并维护已编译程序实例的缓存

来源: src/services/services.ts360-400 src/services/types.ts1-100

语言服务接口

语言服务通过 LanguageService 接口公开用于编辑器功能的函数。它充当 TypeScript 编译器核心的门面。

来源: src/services/types.ts80-120 src/services/services.ts210-360

语言服务主机

主机作为语言服务与环境(通常是编辑器或 IDE)之间的接口。它提供文件系统访问、编译器选项和文件更改通知。

来源: src/services/types.ts40-80 src/server/editorServices.ts60-100

文档注册表

文档注册表在多个程序之间维护共享 SourceFile 对象的缓存,以避免冗余解析并支持增量更新。

来源: src/services/services.ts40-80 src/services/types.ts120-160

核心组件

编译器集成

语言服务广泛利用 TypeScript 编译器的功能,但会针对编辑器场景进行调整

  1. 增量处理:仅分析受影响的文件
  2. 按需分析:仅在请求时处理特定功能
  3. 缓存:维护和重用先前的分析结果

来源: src/services/services.ts100-200 src/compiler/program.ts100-200

文档管理

语言服务通过文档注册表和脚本快照来管理文档,以有效地处理编辑器中的文本更改

  1. 脚本快照:文件内容的不可变表示
  2. 版本跟踪:文件通过基于字符串的版本标识符进行跟踪
  3. 更改检测:仅重新分析已更改的文件

来源: src/services/services.ts40-80 src/server/editorServices.ts100-150

主要功能

自动补全

补全服务会分析代码上下文,为变量、函数、类型和其他符号提供智能建议。

来源: src/services/completions.ts1-100

导航功能可帮助开发者理解和浏览代码

功能描述主要功能
查找所有引用定位符号的所有提及findReferences
转到定义跳转到符号定义的位置getDefinitionAtPosition
转到类型定义跳转到类型定义getTypeDefinitionAtPosition
转到实现查找抽象方法的实现getImplementationAtPosition
导航栏提供结构化的大纲视图getNavigationBarItems

来源: src/services/services.ts500-600 src/services/findAllReferences.ts1-100

格式化

格式化系统根据格式化规则调整代码间距、缩进和其他样式方面

来源: src/services/formatting/formatting.ts1-50 src/services/formatting/smartIndenter.ts1-50

重构和代码修复

重构和代码修复提供自动化的代码转换

  1. 重构:结构性更改(重命名、提取函数等)
  2. 代码修复:对错误和警告的自动化更正
  3. 代码操作:修改代码结构的命令

来源: src/services/services.ts700-800 src/services/codefixes/importFixes.ts1-50

编辑器集成(TSServer)

语言服务通常通过 TypeScript Server (TSServer) 进行消费,TSServer 为编辑器提供了基于协议的接口。

来源: src/server/session.ts1-100 src/server/protocol.ts1-100 src/server/editorServices.ts1-60

项目系统

TypeScript 服务器将文件组织成项目,这些项目决定了文件的分析方式

  1. 已配置项目:基于 tsconfig.json
  2. 推断项目:为松散文件自动创建
  3. 外部项目:由 IDE 创建

来源: src/server/project.ts1-100

性能优化

语言服务采用多种技术来在编辑器环境中保持响应性

  1. 增量编译:只重新分析已更改的部分
  2. 缓存:缓存分析结果以避免重复工作
  3. 取消:支持取消长时间运行的操作
  4. 惰性计算:推迟计算直到需要时

来源: src/services/services.ts80-100 src/server/editorServices.ts150-200

API 接口

消耗语言服务的关键入口点是

来源: src/services/services.ts350-400

结论

TypeScript 语言服务是一个强大的组件,它将 TypeScript 丰富的类型系统引入到编辑器和 IDE 中。通过了解其架构和功能,开发人员可以更好地利用其特性、扩展其功能或将其集成到新工具中。