写点什么

听 GPT 讲 Deno 源代码 (11)

作者:fliter
  • 2024-02-13
    山东
  • 本文字数:14892 字

    阅读完需:约 49 分钟


分享更多精彩内容,欢迎关注!



<br>

File: deno/cli/lsp/tsc.rs

在 Deno 项目的源代码中,deno/cli/lsp/tsc.rs 文件的作用是实现 TypeScript 的 LSP(Language Server Protocol)接口,提供与 TypeScript 编译器通信所需的请求和响应。


以下是该文件中的一些 struct 的作用说明:


  • FormatCodeSettings: 包含了代码格式化的设置选项,例如缩进、分号等。

  • TsServer: TypeScript 服务器,是 TypeScript 编译器的代理,用于处理来自客户端的请求,并调用 TypeScript 编译器进行代码分析和处理。

  • DroppableToken(CancellationToken): 可以被取消的令牌,用于取消当前的操作。

  • AssetDocumentInner: 资源文档的内部表示,包含了文档的内容、版本等相关信息。

  • AssetDocument(Arc<AssetDocumentInner>): 资源文档,包含了一个 Arc 指向内部表示,并提供了对文档内容的读取和更新操作。

  • AssetsSnapshot(Arc<Mutex<AssetsMap>>): 资源快照,包含了一个 Arc 指向 AssetsMap 的互斥锁,用于提供对所有资源文档的读取操作。

  • Assets: 资源管理器,用于管理所有的资源文档。

  • TextSpan: 文本范围,用于表示在文档中的一个范围。

  • SymbolDisplayPart: 符号显示部分,用于表示在代码中的一个符号及其相关信息。

  • JsDocTagInfo: JSDoc 标签信息,用于表示 JSDoc 中的一个标签。

  • QuickInfo: 快速信息,用于表示代码的快速信息提示。

  • Link: 链接,用于表示代码的一个跳转链接。

  • DocumentSpan: 文档范围,表示代码中的一个范围,并提供了对该范围的进一步操作。

  • NavigateToItem: 导航项,表示在代码中的一个导航目标。

  • InlayHint: 内部提示,用于在代码中显示内部的信息提示。

  • NavigationTree: 导航树,用于表示代码的导航树结构。

  • ImplementationLocation: 实现位置,表示一个代码实现的位置。

  • RenameLocation: 重命名位置,表示一个代码重命名的位置。

  • RenameLocations: 重命名位置集合,表示一个代码重命名的位置集合。

  • HighlightSpan: 高亮范围,表示代码的一个高亮范围。

  • DefinitionInfo: 定义信息,用于表示代码的定义信息。

  • DefinitionInfoAndBoundSpan: 定义信息和绑定范围,表示代码的定义信息以及其绑定的范围。

  • DocumentHighlights: 文档高亮,用于表示代码中的高亮信息。

  • TextChange: 文本修改,表示对文本进行的修改操作。

  • FileTextChanges: 文件文本修改,表示对文件文本进行的修改操作。

  • Classifications: 代码分类,用于表示代码的不同分类。

  • RefactorActionInfo: 重构动作信息,用于表示重构动作的信息。

  • ApplicableRefactorInfo: 可应用的重构信息,用于表示可以应用的重构信息。

  • RefactorEditInfo: 重构编辑信息,用于表示重构编辑的信息。

  • CodeAction: 代码动作,用于表示对代码进行的动作。

  • CodeFixAction: 代码修复动作,用于表示对代码进行的修复动作。

  • CombinedCodeActions: 组合代码动作,用于表示多个代码动作的组合。

  • ReferencedSymbol: 引用的符号,在代码中表示引用了某个符号。

  • ReferencedSymbolDefinitionInfo: 引用符号的定义信息,表示引用符号的定义信息。

  • ReferencedSymbolEntry: 引用符号条目,表示引用符号的条目信息。

  • ReferenceEntry: 引用条目,表示代码中的一个引用条目。

  • CallHierarchyItem: 调用层次项,表示在代码中的一个调用级别项。

  • CallHierarchyIncomingCall: 调用层次中的传入调用,表示一个传入的调用。

  • CallHierarchyOutgoingCall: 调用层次中的传出调用,表示一个传出的调用。

  • CompletionEntryDetails: 自动完成项的详细信息,表示自动完成项的详细信息。

  • CompletionInfo: 自动完成信息,表示代码的自动完成信息。

  • CompletionItemData: 自动完成项的数据,表示自动完成项的相关数据。

  • CompletionEntryDataImport: 自动完成项的引入数据,表示自动完成项的引入数据。

  • CompletionEntry: 自动完成项,表示代码的一个自动完成项。

  • CompletionEntryLabelDetails: 自动完成项的标签详细信息,表示自动完成项的标签的详细信息。

  • OutliningSpan: 折叠范围,表示代码的一个折叠范围。

  • SignatureHelpItems: 签名帮助项,用于表示代码的签名帮助信息。

  • SignatureHelpItem: 签名帮助条目,表示代码的签名帮助条目。

  • SignatureHelpParameter: 签名帮助参数,表示代码的签名帮助参数。

  • SelectionRange: 选择范围,表示代码的一个选择范围。

  • Response: LSP 响应,表示与客户端交互的响应数据。

  • TscSpecifierMap: TypeScript 服务器的规范映射,用于管理 TypeScript 服务器的规范。

  • State: LSP 服务的状态,用于管理服务器的状态。

  • LoadResponse: 加载响应,表示加载请求的响应数据。

  • GetCompletionsAtPositionOptions: 获取指定位置的自动完成选项,表示获取自动完成选项的请求参数。

  • UserPreferences: 用户首选项,用于表示用户的首选项配置。

  • SignatureHelpItemsOptions: 签名帮助项的请求参数,用于指定获取签名帮助项的选项。

  • SignatureHelpTriggerReason: 签名帮助触发原因,表示导致获取签名帮助的原因。

  • GetCompletionDetailsArgs: 获取自动完成项的详细信息的请求参数,用于指定获取自动完成项详细信息的选项。

  • GetNavigateToItemsArgs: 获取导航项目的请求参数,用于指定获取导航项目的选项。

  • TscRequest: TypeScript 编译器的请求,用于发送给 TypeScript 编译器的请求。


以下是该文件中的一些 enum 的作用说明:


  • IndentStyle: 缩进风格,用于表示代码的缩进样式。

  • SemicolonPreference: 分号偏好设置,用于表示代码的分号偏好。

  • OneOrMany<T>: 用于表示可能为单个值或多个值的情况。

  • ScriptElementKind: 脚本元素种类,用于表示代码中的元素种类。

  • MatchKind: 匹配种类,用于表示匹配的种类。

  • InlayHintKind: 内部提示种类,用于表示内部提示的种类。

  • HighlightSpanKind: 高亮范围种类,用于表示高亮范围的种类。

  • OutliningSpanKind: 折叠范围种类,用于表示折叠范围的种类。

  • CompletionTriggerKind: 自动完成触发种类,用于表示自动完成的触发种类。

  • ImportModuleSpecifierEnding: 导入模块指定器的结尾,用于表示导入模块指定器的结尾方式。

  • IncludeInlayParameterNameHints: 是否包含内部参数名提示,用于表示是否包含内部参数名提示。

  • IncludePackageJsonAutoImports: 是否包含 package.json 的自动导入,用于表示是否包含 package.json 的自动导入。

  • SignatureHelpTriggerKind: 签名帮助触发种类,用于表示签名帮助的触发种类。


这些 struct 和 enum 的定义提供了对 TypeScript 编译器相关功能的封装和管理,根据不同的请求类型和参数,可以通过这些定义来进行代码的分析、操作和处理。

File: deno/cli/lsp/completions.rs

在 Deno 项目的源代码中,deno/cli/lsp/completions.rs 文件的作用是处理代码补全相关的逻辑。它实现了与 LSP(Language Server Protocol)中的代码补全相关的 API,使得编辑器可以通过与 Deno LSP 进行通信来获取代码补全信息。


该文件中主要包含以下几个结构体的定义和实现,它们分别是:


  1. CompletionItemData: 这是一个用于存储代码补全项(Completion Item)数据的结构体。它包含了代码补全项目的信息,比如标签(label)、种类(kind)、详情(detail)等元数据。该结构体提供了方法用于将数据转换为 LSP 中的 CompletionItem 数据结构。

  2. TestNpmSearchApi: 这是一个用于测试 Npm 搜索 API(Application Programming Interface)的结构体。它实现了与 npm 相关的一些方法,如获取代码补全项时的 Npm 搜索接口调用。该结构体主要用于测试目的,以模拟对 npm 数据的访问。


这些结构体的作用都是与代码补全功能相关的。CompletionItemData 主要用于存储代码补全项的数据,而 TestNpmSearchApi 则用于模拟测试与 npm 相关的代码补全功能。这些结构体的定义和方法的实现,使得编辑器可以通过调用相应的接口来获取代码补全项的相关信息,从而提供更好的代码补全支持。

File: deno/cli/lsp/cache.rs

在 Deno 项目的源代码中,deno/cli/lsp/cache.rs 这个文件的作用是实现 LSP(Language Server Protocol)缓存功能的相关逻辑。该文件中的结构体和枚举类型有以下作用:


  1. Metadata: 此结构体用于表示缓存项的元数据。它包含了缓存项的版本号、依赖项的版本号、最后修改时间等信息,用于帮助判断缓存项是否过期,从而避免不必要的重新解析和重新评估操作。

  2. CacheMetadata: 此结构体用于表示缓存项的元数据的缓存。它实际上是一个哈希表,将文件路径映射到对应的元数据。当需要查询某个文件的元数据时,可以通过此缓存快速获取,而不必每次都重新解析文件。

  3. MetadataKey: 这是一个枚举类型,表示缓存项的元数据的键。包括如下几个键:

  4. Version: 用于存储缓存项的版本号。

  5. DependenciesVersion: 用于存储缓存项的依赖项的版本号。

  6. ModificationTime: 用于存储缓存项的最后修改时间。

  7. MetadataKey枚举类型提供了方便的方法来获取、设置和比较元数据的不同键。


总体来说,deno/cli/lsp/cache.rs 文件中的代码实现了一个缓存机制,用于存储和管理解析文件的元数据,从而提高 LSP 服务器的性能和响应速度。通过缓存,可以避免不必要的重复解析和评估操作,从而节省时间和系统资源。

File: deno/cli/lsp/refactor.rs

在 Deno 项目的源代码中,deno/cli/lsp/refactor.rs文件的作用是处理代码重构相关的逻辑。


RefactorCodeActionKind结构体定义了一组代码重构操作的类型。每个重构操作类型都有一个名称和代码块。这个结构体的作用是帮助开发人员识别不同的代码重构操作类型。


RefactorCodeActionData结构体定义了每个代码重构操作的具体信息。这个结构体包含了代码重构操作的名称、描述、位置等信息。它可以用于向开发人员展示可用的代码重构操作选项,并根据用户选择执行相应的代码重构操作。


这两个结构体共同作用于代码重构功能的实现。RefactorCodeActionKind帮助识别代码重构操作的类型,而RefactorCodeActionData则提供了每个代码重构操作的具体信息,以供用户选择和执行。这些结构体的目的是为了方便开发人员对代码进行重构,并提供一致性和可维护性的代码。

File: deno/cli/lsp/repl.rs

在 Deno 项目的源代码中,deno/cli/lsp/repl.rs这个文件的作用是实现了与 REPL(Read-Eval-Print Loop)相关的功能。REPL 是一种交互式的编程环境,可以在运行时进行实时的代码解释和执行。


该文件中定义了两个 struct:ReplCompletionItemReplLanguageServer,分别用于处理自动完成和实现 LSP(Language Server Protocol)的功能。


  1. ReplCompletionItem struct 用于表示自动完成的项。它包含了完成的文本、显示的文本、文本的范围信息等。当用户在 REPL 环境中输入代码时,可以根据已知的上下文提供自动完成的建议。

  2. ReplLanguageServer struct 是 REPL 的语言服务器。它实现了处理 LSP 请求的逻辑,包括代码格式化、代码跳转、查找定义等功能。它会监听客户端发起的 LSP 请求,并根据请求的类型进行相应的处理,并通过 LSP 协议与客户端进行交互。


ReplLanguageServer中,有一些关键的方法用于处理 LSP 请求,例如:


  • handle_initialize:处理客户端的初始化请求,进行一些初始化设置并返回相应的响应。

  • handle_text_document_did_open:处理客户端打开文档的请求,对代码进行解析,并根据需要进行语法高亮等处理。

  • handle_text_document_did_change:处理客户端文档修改的请求,更新 REPL 中的代码,并根据需要进行相应的处理,如自动补全建议的更新。

  • handle_text_document_completion:处理客户端请求代码自动完成的请求,根据当前的上下文提供相应的自动完成建议。

  • handle_text_document_hover:处理客户端请求代码悬停的请求,提供关于代码的相关信息,如变量的类型、函数的签名等。


这些方法通过解析和处理客户端请求,与 REPL 交互,完成了在 REPL 环境中进行代码编辑和执行的功能。整个文件实现了一个完整的 LSP 语言服务器,使得 REPL 能够与编辑器等客户端进行交互,并提供更好的开发体验。

File: deno/cli/lsp/semantic_tokens.rs

在 Deno 项目的源代码中,deno/cli/lsp/semantic_tokens.rs 文件的作用是实现了与语义标记相关的逻辑。


该文件定义了几个主要的结构体:


  1. SemanticTokensBuilder:该结构体是用于构建语义标记的生成器。它提供了一系列的方法,用于添加不同类型的语义标记。

  2. SemanticTokensLegend:该结构体定义了语义标记的类型和修饰符的含义。它包含了两个字段:token_typestoken_modifiers,分别表示语义标记的类型和修饰符的字符串表示。

  3. SemanticTokensBuilderEvent:该枚举定义了语义标记生成器的不同事件类型。它包含了两个事件:NewToken表示添加新的语义标记,Finish表示生成语义标记的操作结束。

  4. SemanticTokensResponse:该结构体表示语义标记的响应结果。它包含了一个result_id字段,用于标识该响应结果的唯一标识。


此外,还有两个枚举类型:


  1. TokenType:该枚举定义了语义标记的类型。它包含了一系列的成员,如Comment, Keyword, String等,用于表示对应的语义标记类型。

  2. TokenModifier:该枚举定义了语义标记的修饰符。它包含了一系列的成员,如Declaration, Static, Abstract等,用于表示对应的语义标记修饰符。


TokenType 和 TokenModifier 这两个枚举类型用于定义语义标记的类型和修饰符,以便在构建语义标记时进行分类和区分。当使用SemanticTokensBuilder构建语义标记时,可以根据具体的类型和修饰符选择相应的枚举成员,并调用生成器的方法添加到语义标记中。


总之,deno/cli/lsp/semantic_tokens.rs 文件中的结构体和枚举类型定义了语义标记的生成器、响应结果以及类型和修饰符等相关逻辑。通过这些定义,可以方便地处理和生成与语义标记相关的信息。

File: deno/cli/lsp/client.rs

在 Deno 项目的源代码中,deno/cli/lsp/client.rs 文件的作用是实现与 LSP(Language Server Protocol)客户端通信的功能。


Client 结构体是一个 LSP 客户端的主要结构,它持有与服务器的连接,并处理从服务器发送的请求、通知和响应。Client 结构体实现了 ClientTrait trait,该 trait 定义了与 LSP 客户端通信的基本方法。


Arc<dyn OutsideLockClient>和 Arc<dyn TowerClient>是 Client 的两个成员变量,它们分别表示通过外部锁和 Tower 框架与 LSP 客户端通信的功能。


ReplClient 结构体是一个特殊的 LSP 客户端,它实现了 ClientTrait trait,并提供了与 REPL(Read-Eval-Print Loop,交互式解释执行环境)相关的功能。


ClientTrait trait 定义了 LSP 客户端所需的基本方法,包括处理请求、发送通知、处理响应等。


TestingNotification 枚举类型定义了一组与测试相关的通知类型,它们用于在开发和调试阶段发送测试通知。


总而言之,deno/cli/lsp/client.rs 文件实现了 LSP 客户端与服务器之间的通信逻辑,包括处理请求、发送通知、处理响应等功能,并提供了与 REPL 和测试相关的功能。

File: deno/cli/lsp/code_lens.rs

在 Deno 项目的源代码中,deno/cli/lsp/code_lens.rs 文件的作用是处理代码镜头(CodeLens)相关的逻辑。


首先,这个文件中定义了三个结构体:CodeLensData、DenoTestCollector 和 DocumentLinkSource。


  1. CodeLensData: 这个结构体用来表示代码镜头数据,包含了一个位置(range),表示代码片段的位置范围;一个命令(command),表示关联的命令名称;以及一些扩展(data),可以用来传递额外的信息。

  2. DenoTestCollector: 这个结构体用来收集和管理 Deno 项目中的测试代码镜头。它会遍历源代码,识别测试函数,并生成对应的代码镜头数据。测试函数可以通过一定的命名约定自动识别。DenoTestCollector 还提供了一些方法,例如根据文件路径获取测试文件、获取测试文件中的测试函数等。

  3. DocumentLinkSource: 这个枚举体用来表示代码镜头源文件的类型。代码镜头可以与不同类型的源文件相关联,比如测试文件(Test)、文档文件(Docs)、模块文件(Module)等。DocumentLinkSource 定义了不同类型的源文件,以便在代码镜头逻辑中进行区分。


通过这些结构体和枚举体,code_lens.rs 文件提供了一种机制可以为源代码文件中的特定位置生成代码镜头。代码镜头通常是一些在代码边缘显示的小组件,可以提供相关命令、信息或者链接。这些代码镜头可以增强开发者在编辑器中的交互体验,提供额外的功能和导航选项。

File: deno/cli/lsp/capabilities.rs

在 Deno 项目中,deno/cli/lsp/capabilities.rs 文件是 LSP(Language Server Protocol)的能力配置文件。


Language Server Protocol 是一个跨语言的编辑器插件协议,它定义了一个标准化的通信协议,允许不同的编辑器与语言服务器进行通信,从而提供代码编辑、自动完成、脚本分析等功能。该协议的目标是使得开发人员能够在不同的编辑器之间共享和复用语言分析逻辑。


在 LSP 中,capabilities.rs 文件的作用是定义编辑器对于语言服务器的支持能力。具体来说,该文件中包含了编辑器支持的不同功能的配置选项,以及相应的标识符和描述信息。


该文件主要分为两个部分:


  1. 结构体定义:该部分定义了不同功能的结构体,每个结构体包含了该功能的配置选项,如是否支持、参数设置等。例如,有一个叫做 CompletionProvider 的结构体,用于配置自动完成功能的相关选项。

  2. 结构体的实现:该部分定义了结构体的具体实现,包括各个字段的默认值、序列化和反序列化方法等。通过实现这些结构体,可以根据需求对不同功能的选项进行灵活的配置和定制。


通过编辑 capabilities.rs 文件中的配置选项,可以调整和定制 LSP 服务器在与编辑器通信时的行为。这个文件是连接 LSP 服务器和编辑器之间的桥梁,确保不同的功能在通信过程中得到正确的识别和支持。


总的来说,deno/cli/lsp/capabilities.rs 文件是 Deno 项目中通过 LSP 协议进行编辑器-语言服务器通信时的能力配置文件,用于定义编辑器对于语言服务器的支持能力选项。

File: deno/cli/lsp/urls.rs

在 Deno 项目的源代码中,deno/cli/lsp/urls.rs文件的作用是定义用于处理 LSP(Language Server Protocol)URL 的相关功能。


首先,LspClientUrl(Url)结构体是一个包装了 URL 的结构体,用于表示与客户端通信的 URL。


LspUrlMapInner结构体是一个内部辅助结构体,它维护了一个映射,将 LSP 中的 URI(Uniform Resource Identifier)映射到内部 URL。它提供了方法来获取和修改内部 URL 的映射关系。


LspUrlMap结构体是对LspUrlMapInner的封装,它是整个 URL 映射的管理者。它提供了一系列方法来添加、删除和查询 URL 的映射关系。


LspUrlKind枚举是 URL 的种类的表示,它定义了不同种类的 URL,包括System(系统 URL),Client(客户端 URL)和Vfs(虚拟文件系统 URL)。这个枚举用于指示 URL 的用途和属性。


总结起来,urls.rs文件中的这些结构体和枚举提供了用于管理和处理 LSP URL 的相关功能,包括 URL 映射和区分不同种类的 URL。

File: deno/cli/lsp/documents.rs

在 Deno 项目的源代码中,deno/cli/lsp/documents.rs文件的作用是实现与文档相关的功能,包括文档的加载、解析、更新等操作。下面对其中提到的几个结构和枚举进行详细介绍:


  1. DocumentDependencies:表示文档的依赖关系,记录了文档所依赖的其他模块的路径。

  2. DocumentInnerDocument结构的内部状态,包含文档的内容、版本号、语言标识等信息。

  3. Document:通过Arc<DocumentInner>来实现文档的共享,并包含了一些对文档内容进行操作的方法。

  4. RedirectResolver:用于处理重定向的解析器。

  5. FileSystemDocuments:表示文件系统中的文档集合,可以加载、更新和查找文档。

  6. UpdateDocumentConfigOptions:文档更新配置的选项。

  7. Documents:对文档进行管理的结构,可以加载、更新、查找文档,并提供了一些文档相关的操作。

  8. DocAnalyzer:文档分析器,可以对指定的文档进行分析并返回分析结果。

  9. OpenDocumentsGraphLoader:打开的文档图形加载器。

  10. PreloadDocumentFinderOptions:预加载文档查找器的选项。

  11. PreloadDocumentFinder:预加载文档的查找器。


接下来是几个枚举的作用描述:


  1. LanguageId:表示文档的语言标识,用于标识文档的语言类型。

  2. IndexValid:表示文档索引的有效性状态。

  3. AssetOrDocument:表示资源或文档。

  4. DocumentsFilter:用于过滤文档的枚举类型。

  5. PendingEntry:表示待处理的条目。


这些结构和枚举类型在文档操作、加载、解析等方面发挥着重要的作用,为 LSP(Language Server Protocol)的实现提供了必要的功能支持。

File: deno/cli/lsp/text.rs

在 Deno 项目中,deno/cli/lsp/text.rs 文件的作用是处理文本相关的操作和数据结构。


该文件定义了一些用于处理文本的结构体和函数。其中,Utf16Char 结构体表示一个 UTF-16 编码的字符,它包含了字符的值和编码后的长度。LineIndex 结构体表示一个文本行的索引,它包含了行的起始和结束位置,以及该行在文本中的行号。


这些结构体的作用如下:


  1. Utf16Char:由于 LSP(Language Server Protocol)协议规定了文本通信需要使用 UTF-16 编码,而 Rust 中的字符串通常使用 UTF-8 编码,因此在处理文本时需要进行编码的转换。Utf16Char 结构体提供了一个表示 UTF-16 编码字符的数据结构,它可以用于在 UTF-16 和 UTF-8 之间进行转换,并提供了相关的操作方法。

  2. LineIndex:LSP 协议中,文本的行索引通常用于定位和处理文本中的位置信息。LineIndex 结构体提供了一个表示文本行索引的数据结构,它包含了行的起始和结束位置以及行号等信息。LineIndex 结构体可以用于在文本中快速定位到某一行,并进行相关的处理和操作。


在/text.rs 文件中还包含了一些使用这些结构体的函数,用于处理文本中的行索引、字符编码和转换等操作。这些函数主要用于 LSP 协议的实现,以支持文本的编辑、定位和处理等功能。


总之,deno/cli/lsp/text.rs 文件的作用是提供了处理文本操作和数据结构所需的功能,并为 LSP 协议中的文本通信提供了支持。

File: deno/cli/lsp/diagnostics.rs

在 Deno 项目的源代码中,deno/cli/lsp/diagnostics.rs 这个文件的作用是实现了 Deno 的诊断功能。具体来说,该文件包含了一系列用于处理和管理诊断消息的结构体和枚举。


首先,DiagnosticServerUpdateMessage 结构体表示用于更新诊断服务器的消息。它包含有关诊断服务器的信息,例如要处理的文件和插件的详细信息。


接下来,DiagnosticRecord 结构体表示一个诊断记录,包含有关一条诊断消息的详细信息,例如文件路径、行号、列号、错误级别、错误信息等。


VersionedDiagnostics 结构体是一个封装了版本化诊断信息的数据结构,它包含一个诊断消息的集合和对应的版本号。


DiagnosticsPublisher 结构体是诊断消息发布者的抽象,它定义了向外界发送诊断消息的方法。


TsDiagnosticsStore 结构体是用于存储诊断信息的数据结构,它使用 Arc 和 Mutex 来实现线程安全的访问。


DiagnosticBatchCounter 结构体是一个诊断消息计数器,它用于记录发布的诊断消息的批次数量。


ChannelUpdateMessage 结构体表示一个通道更新的消息,用于指示通道的状态是否变化。


SpecifierState 枚举表示诊断数据的特定源的状态,有三个可能的取值:NoLocal,ImportMapRemap 和 Redirect。


DiagnosticsState 枚举表示诊断数据的状态,是对 SpecifierState 进行了扩展。


DiagnosticsServer 结构体是诊断服务器的入口点,它负责接收来自客户端的请求,并调用适当的函数处理这些请求。


DiagnosticDataSpecifier,DiagnosticDataStrSpecifier,DiagnosticDataRedirect 和 DiagnosticDataNoLocal 这几个结构体是用于指定诊断数据源的结构体,分别表示文件路径、字符串、重定向和非局部导入。


DiagnosticSource,ChannelMessage 和 DenoDiagnostic 这几个枚举分别表示诊断来源、通道消息和 Deno 的诊断消息。它们用于标识和分类诊断消息的不同类型和来源。


总而言之,deno/cli/lsp/diagnostics.rs 文件的作用是实现了 Deno 的诊断功能,定义了用于处理和管理诊断消息的结构体和枚举。这些结构体和枚举提供了对诊断消息的封装、存储、发布和管理的功能。

File: deno/cli/lsp/parent_process_checker.rs

在 Deno 项目的源代码中,parent_process_checker.rs文件的作用是实现一个父进程检查器以确保子进程的正确性。


具体来说,该文件实现了一个ParentProcessChecker结构体,该结构体继承了tokio::task::LocalSet,用于管理任务的执行。ParentProcessChecker结构体通过new函数创建,并通过start方法启动。


ParentProcessChecker的主要功能是定期检查当前进程的父进程是否仍然活跃。如果父进程不再活跃,则会触发一系列操作以确保子进程的正确性,并重新启动一个新的父进程。


具体来说,ParentProcessChecker会定时执行一个异步任务,该任务会通过tokio::process::Command启动一个新的子进程并等待其退出。如果子进程成功退出,ParentProcessChecker会退出当前进程并以指定的方式重启一个新的父进程。


通过这种方式,ParentProcessChecker可以确保在父进程异常退出或关闭的情况下,子进程能够在一个新的父进程下继续运行,以保证整个系统的可靠性和稳定性。


总结起来,parent_process_checker.rs文件的作用是实现了一个父进程检查器,在父进程异常退出或关闭时能够重新启动一个新的父进程,并确保子进程在新的父进程下继续运行。

File: deno/cli/lsp/analysis.rs

在 Deno 项目的源代码中,deno/cli/lsp/analysis.rs文件的作用是实现 LSP(Language Server Protocol)的分析功能。LSP 是一种用于实现代码编辑器和语言服务器之间通信的协议,使得编辑器可以通过与语言服务器交互来提供代码补全、错误检查、重构等功能。


TsResponseImportMapper<'a>是一个用于处理 TypeScript 模块导入的结构体。它通过解析 TypeScript 解析器的响应,将模块导入的路径映射到实际的文件路径。


CodeActionData是用于表示代码操作(Code Action)的数据结构。它包含了一个可执行的代码操作(例如重命名变量、应用快速修复等)以及相应的元数据(例如操作的范围、文件路径等)。


CodeActionCollection是一个用于存储代码操作的集合。它提供了一些方法来添加、获取、移除代码操作,并支持按照种类和范围进行过滤。


Category是一个枚举类型,用于表示代码操作的种类。它包含了一些常见的种类,例如重命名、格式化、自动修复等。


CodeActionKind是一个枚举类型,用于表示代码操作的类型。它包含了一些常见的类型,例如普通代码操作、快速修复、重构等。


FixAllKind是一个枚举类型,用于表示代码修复的类型。它包含了一些常见的修复类型,例如修复所有错误、修复所有警告等。


这些结构体和枚举类型在 LSP 的代码分析过程中扮演不同的角色和功能。TsResponseImportMapper负责处理 TypeScript 模块导入的路径映射,CodeActionDataCodeActionCollection用于存储和管理代码操作,而CategoryCodeActionKindFixAllKind用于表示代码操作的种类和类型,以便在编辑器中提供相应的功能和选项。

File: deno/cli/lsp/language_server.rs

在 Deno 项目的源代码中,deno/cli/lsp/language_server.rs 文件是 Deno 的语言服务器实现。语言服务器是一个实现了 Language Server Protocol(LSP)的程序,它提供了与编辑器交互的功能,例如代码补全、代码导航和代码分析等。


以下是对上述提到的几个结构体的详细说明:


  1. LspRootCertStoreProvider(RootCertStore):这个结构体是用来提供 LSP 根证书存储的提供者,它包含一个 RootCertStore 的实例。RootCertStore 用于验证与 LSP 相关的安全连接。

  2. LspNpmServices:这个结构体用于存储与 NPM 相关的 LSP 服务。它可能包含与 NPM 交互和解析 NPM 配置相关的功能。

  3. LspNpmConfigHash(u64):这个结构体存储了一个表示 NPM 配置哈希值的 u64 数。它用于确定是否应重新生成 NPM 快照。

  4. LanguageServer(Arc<tokio::sync::RwLock<Inner>>:这个结构体代表 Deno 的语言服务器,是整个语言服务器的入口点。它包含一个 Inner 实例,该实例封装了语言服务器的内部状态和逻辑。

  5. StateNpmSnapshot:这个结构体是用于存储 NPM 快照状态。它可能包含已解析的 NPM 包和依赖关系。

  6. StateSnapshot:这个结构体用于存储语言服务器的快照状态。它可能包含已解析的文件、语法树和符号表等。

  7. LanguageServerTaskQueue:这个结构体是一个任务队列,用于处理语言服务器的任务。它可以按照顺序执行各种任务,以确保适当的并发和顺序。

  8. Inner:这个结构体是语言服务器的内部实现。它包含解析器、快照管理器、任务队列以及其他语言服务器的核心组件。

  9. PrepareCacheResult:这个结构体用于表示准备缓存的结果,是一个枚举类型,可能包含准备成功、准备失败或更新快照完成等不同的结果。


这些结构体的功能是构建和管理 Deno 语言服务器所需的各种组件和状态,以便实现和处理与编辑器交互的功能。它们共同为 Deno 的语言服务器提供了功能强大且丰富的基础。

File: deno/cli/lsp/logging.rs

在 Deno 项目的源代码中,deno/cli/lsp/logging.rs 文件的作用是处理日志记录的逻辑和功能。


该文件定义了一个名为LogFile的结构体。LogFile结构体的作用是表示一个日志文件,它有以下几个重要字段和方法:


  1. path字段表示日志文件的路径。

  2. write_handle字段表示用于写入日志的文件句柄。

  3. activation_kind字段表示日志文件的激活条件。它可以是Every表示每次记录日志都会激活,或者是On表示仅在特定情况下激活。

  4. current_size字段表示当前日志文件的大小。

  5. should_rotate方法用于检查是否应该旋转(切分)当前的日志文件。当当前日志文件大小超过一定阈值时,或者激活条件为Every且已经有新的日志内容写入时,就会触发旋转。

  6. create方法用于创建一个新的日志文件并返回一个新的LogFile实例。

  7. log方法用于向日志文件中写入日志内容。

  8. list方法用于获取指定路径下的所有日志文件。


此外,该文件还定义了一些全局变量和函数,用于管理和控制日志文件的创建、写入和旋转。它们涉及到了一些配置和环境变量的读取和解析,例如读取环境变量DENO_DIR以获取默认的日志文件路径。


总的来说,deno/cli/lsp/logging.rs 文件的作用是提供了方便的日志记录和管理功能,通过LogFile结构体和相关的方法,可以实现日志文件的创建、写入和旋转等操作,从而帮助开发人员更好地追踪和调试程序的执行过程。

File: deno/cli/lsp/lsp_custom.rs

在 Deno 项目的源代码中,deno/cli/lsp/lsp_custom.rs 文件的作用是实现了与 Language Server Protocol (LSP) 相关的自定义结构体和枚举,用于 LSP 服务器与客户端之间的通信。


具体来说,该文件中定义了以下结构体的作用:


  • TaskDefinition:表示一个 LSP 任务的定义,包含了任务的名称和详细描述。

  • RegistryStateNotificationParams:表示 LSP 注册表的状态通知参数,用于向客户端报告 LSP 服务器支持的功能。

  • VirtualTextDocumentParams:表示虚拟文档的参数,用于在 LSP 服务器中处理虚拟文档的相关操作。

  • DiagnosticBatchNotificationParams:表示诊断批处理通知的参数,用于向客户端发送一批诊断信息。

  • DenoConfigurationChangeEvent:表示 Deno 配置更改事件,用于表示 Deno 的配置发生变化。

  • DidChangeDenoConfigurationNotificationParams:表示 Deno 配置更改通知的参数,用于向客户端发送 Deno 配置更改的通知。

  • UpgradeAvailable:表示 Deno 有新版本可用的通知,用于向客户端报告 Deno 有新的升级可用。

  • DidUpgradeCheckNotificationParams:表示 Deno 升级检查通知的参数,用于向客户端发送 Deno 升级检查的通知。


此外,该文件中还定义了以下枚举的作用:


  • RegistryStateNotification:表示 LSP 注册表的状态通知,用于指示 LSP 服务器支持的功能。

  • DenoConfigurationChangeType:表示 Deno 配置更改的类型,可以是新增、修改或删除配置。

  • DenoConfigurationType:表示 Deno 配置的类型,可以是“用户”配置或“工作区”配置。

  • DidChangeDenoConfigurationNotification:表示 Deno 配置更改通知,用于向客户端发送 Deno 配置更改的通知。

  • DidUpgradeCheckNotification:表示 Deno 升级检查通知,用于向客户端发送 Deno 升级检查的结果。

  • DiagnosticBatchNotification:表示诊断批处理通知,用于向客户端发送一批诊断信息。


这些自定义的结构体和枚举在 Deno 的 LSP 服务器中扮演了重要的角色,用于描述和传递 LSP 相关的信息和通知。

File: deno/cli/lsp/path_to_regex.rs

在 Deno 项目的源代码中,path_to_regex.rs文件的作用是将路径表达式转换为正则表达式。


下面是每个结构体和枚举类型的详细介绍:


  1. LexToken:这是词法分析器的令牌结构体,用于表示词法分析后的标记。主要包含TypeValue两个字段,分别表示标记的类型和值。

  2. Key:这是表示路径表达式的键的结构体,用于将路径表达式拆分成多个路径片段(path segment)。其中Key结构体包含NameOptions两个字段,分别表示路径片段的名称和选项。

  3. ParseOptions:这是路径表达式的解析选项结构体,用于配置路径表达式的解析过程。其中的字段包括CaseSensitiveStrictEndDelimiter等,用于指定解析路径表达式时的属性。

  4. TokensToCompilerOptions:这是将路径表达式令牌转换为编译器选项的结构体,用于将词法分析的结果转换为编译器的配置选项。

  5. TokensToRegexOptions:这是将路径表达式令牌转换为正则表达式选项的结构体,用于将词法分析的结果转换为正则表达式的配置选项。

  6. PathToRegexOptions:这是将路径表达式转换为正则表达式的选项结构体,用于配置正则表达式的生成过程。其中的字段包括SensitiveDelimiterEnd等。

  7. Compiler:这是正则表达式编译器的结构体,用于将路径表达式编译为正则表达式。

  8. MatchResult:这是正则表达式匹配结果的结构体,用于包含正则表达式匹配的结果信息。

  9. Matcher:这是正则表达式匹配器的结构体,用于执行正则表达式的匹配操作。


对于枚举类型:


  1. TokenType:路径表达式令牌的类型枚举,表示不同类型的标记,如字符串、反斜杠、重复符号等。

  2. StringOrNumber:用于表示字符串或数字类型的枚举,主要用于包装表达式中的具体值。

  3. StringOrVec:用于表示字符串或字符串向量类型的枚举,主要用于指定路径表达式中的键名或选项值。

  4. Token:路径表达式令牌的枚举,表示不同的令牌类型,如左括号、右括号、星号等。


通过这些结构体和枚举类型,path_to_regex.rs文件实现了将路径表达式转换为正则表达式的逻辑,并提供了相关的选项和方法来自定义转换过程。

File: deno/cli/lsp/registries.rs

在 Deno 项目的源代码中,deno/cli/lsp/registries.rs 文件的作用是定义了与 LSP 注册表相关的配置和结构。


  • RegistryConfigurationVariable 是用于表示注册表配置的变量,它包含名称、默认值和描述等属性。

  • RegistryConfiguration 定义了注册表的配置,包括版本、自定义类型和变量列表等属性。

  • RegistryConfigurationJson 用于将注册表配置转换为 JSON 格式。

  • VariableItemsList 是注册表配置中的变量列表,包含了多个变量。

  • ModuleRegistry 表示模块的注册表,包含名称和配置等属性。


在这个文件中,还定义了一些枚举类型:


  • CompletionType 表示代码完成的类型,包括模块、变量和函数等。

  • VariableItems 表示变量的类型,包括文本和文件路径等。


这些结构和枚举类型在 LSP 实现过程中用于表示和处理注册表相关的配置和信息。通过这些数据结构和枚举类型,可以在代码中方便地操作和管理注册表的配置和变量信息。

File: deno/cli/lsp/config.rs

在 Deno 项目的源代码中,deno/cli/lsp/config.rs 文件的作用是定义了与 LSP(Language Server Protocol)相关的配置信息和数据结构。


以下是各个结构体和枚举类型的作用:


  1. ClientCapabilities:表示语言客户端的能力,这些能力包括是否支持代码补全、代码重构、代码修改等功能。

  2. CodeLensSettings:表示代码镜头的设置,即是否在代码中显示相关信息的小圆圈。

  3. DenoCompletionSettings:表示 Deno 的自动完成设置,用于控制在编辑器中输入代码时的自动提示。

  4. ClassMemberSnippets:表示类成员的代码片段,在代码中输入类成员时,可以通过代码片段生成代码块。

  5. ObjectLiteralMethodSnippets:表示对象字面量方法的代码片段,用于在代码中输入对象字面量方法时的代码块生成。

  6. CompletionSettings:表示自动完成的设置。

  7. InlayHintsSettings:表示编辑器中行内提示的设置。

  8. InlayHintsParamNamesOptionsInlayHintsParamTypesOptionsInlayHintsVarTypesOptionsInlayHintsPropDeclTypesOptionsInlayHintsFuncLikeReturnTypesOptionsInlayHintsEnumMemberValuesOptions:表示不同类型的行内提示选项,用于控制行内提示的显示。

  9. ImportCompletionSettings:表示导入的自动完成设置。

  10. TestingSettings:表示测试的设置。

  11. LanguagePreferences:表示语言偏好设置,用于指定语言的特殊设置。

  12. UpdateImportsOnFileMoveOptions:表示文件移动时更新导入语句的选项。

  13. LanguageWorkspaceSettings:表示语言工作区的设置。

  14. WorkspaceSettings:表示工作区的设置。

  15. ConfigSnapshot:表示配置快照的信息。

  16. Settings:表示配置的信息。

  17. WithCanonicalizedSpecifier<T>:表示带有规范化指定的数据结构。

  18. LspConfigFileInfo:表示 LSP 配置文件的信息。

  19. Config:表示整体的配置信息。


以下是各个枚举类型的作用:


  1. InlayHintsParamNamesEnabled:表示是否启用函数参数名称的行内提示。

  2. ImportModuleSpecifier:表示导入的模块规范。

  3. JsxAttributeCompletionStyle:表示 JSX 属性的自动完成风格。

  4. QuoteStyle:表示引号的样式,用于控制字符串字面量的引号类型。

  5. UpdateImportsOnFileMoveEnabled:表示文件移动时是否更新导入语句。

  6. InspectSetting:表示检查设置的类型。


这些结构体和枚举类型在 Deno 项目中的/config.rs 文件中被使用,用于定义和处理 LSP 的相关配置和参数信息。通过这些配置,可以实现对编辑器的自动完成、代码镜头、行内提示等功能的控制和定制。

用户头像

fliter

关注

www.dashen.tech 2018-06-21 加入

Software Engineer. Focus on Micro Service,Containerization

评论

发布
暂无评论
听 GPT 讲 Deno 源代码 (11)_fliter_InfoQ写作社区