ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

深入 Dart Analysis Server(DAS):SDK 文档体系、内部实现与会话日志调试实战

深入 Dart Analysis Server(DAS):SDK 文档体系、内部实现与会话日志调试实战 编程语言编译器语言运行时标准库开发工具【免费下载链接】sdkThe Dart SDK, including the VM, JS and Wasm compilers, analysis, core libraries, and more.项目地址https://gitcode.com/gh_mirrors/sdk1/sdk点击查看免费下载Dart Analysis Server简称 DAS即analysis_server包是 Dart SDK 中为 IDE 和命令行工具提供静态分析能力的长驻进程承载了代码补全、导航、快速修复/辅助、语义高亮等一整套编辑器体验。本文以 pkg/analysis_server/doc/introduction.md 为骨架系统梳理该文档所组织的三大板块实现、流程、教程并结合仓库源码讲解 DAS 的启动架构、功能实现路径、开发调试方法以及面向终端用户的插桩日志与会话通信日志采集实战。读完本文你将掌握 DAS 的文档导航方式、源码级工作原理以及用--instrumentation-log-file、--session-log、Analyzer Insights 页面和log_player工具完成问题复现、性能分析与日志回放的完整工作流。认识 Dart Analysis Server 与它的文档门户analysis_server包实现了 Dart Analysis Server官方文档中有时直接称其为 DAS。它同时支撑两类使用场景见 introduction.mdIDE 体验VS Code 的 Dart/Flutter 插件、IntelliJ IDEA、Android Studio 等编辑器通过它获得补全、诊断、重构、导航等能力命令行工具dart analyze与dart fix等 CLI 命令同样构建在 analysis server 的分析能力之上。introduction.md本身是一个文档门户index它把pkg/analysis_server/doc/下的全部文档组织为三个板块板块内容定位文档入口implementation服务器如何工作、如何增强/修改各项功能面向 SDK 开发者implementation/overview.mdprocess在 analysis server 代码库上工作时应遵循的流程与analyzer包共享大部分流程process/overview.mdtutorial面向终端用户的服务诊断信息采集教程tutorial/instrumentation.md、tutorial/session_log.md除此之外api.html 提供与服务器交互的协议/API 参考。下面逐层深入这三个板块。服务器如何工作从启动流程到双协议架构启动链路dart language_server→ServerStarter→AnalysisServerimplementation/startup.md 描述了服务器的启动过程。DAS 由dart language_server命令启动该命令实现在dartdev包中最终调用 pkg/analysis_server/bin/server.dart 的main函数import package:analysis_server/starter.dart; /// Create and run an analysis server. void main(ListString args) { var starter ServerStarter(); starter.start(args); }main只做一件事创建ServerStarter实例并把命令行参数传给它。从源码看pkg/analysis_server/lib/starter.dart 中ServerStarter是一个抽象类其工厂构造返回实际的Driver实现factory() Driver并提供start(ListString arguments, {SendPort sendPort, bool defaultToLsp})方法。也就是说调用方可以在启动前配置服务器例如注入崩溃报告附件构建器、可分离文件系统管理器等。Driver位于 pkg/analysis_server/lib/src/server/driver.dart它的start方法完成解析命令行参数createArgParser初始化插桩服务InstrumentationService与会话日志服务SessionLogger并记录启动命令行解析可选端口如诊断端口根据协议选项选择LspAnalysisServerLSP 模式或LegacyAnalysisServerlegacy 模式启动服务。双协议设计legacy 协议与 LSPDAS 与单个客户端启动它的进程通信支持两种线上协议见 startup.mdlegacy 协议Dart 自家的 analysis server 协议用于支撑 IntelliJ 和 Android StudioLSPLanguage Server ProtocolMicrosoft 提出的语言服务器协议用于支撑 VS Code 及其他多种编辑器。协议在启动时通过命令行参数选择driver.dart中定义了static const String serverProtocolOption protocol; static const String protocolAnalyzer analyzer; static const String protocolLsp lsp; static const String useLspFlag lsp;即--protocolanalyzer默认或--protocollsp另有隐藏的--lsp开关等价于后者。根据所选协议启动器会创建AnalysisServer的两个具体子类之一LspAnalysisServer或LegacyAnalysisServer并初始化。关于两个协议的实现细节分别参见 implementation/lsp.md 与 implementation/legacy.md关于请求如何被分发处理参见 implementation/handlers.md。值得强调的是尽管dart analyze/dart fix等命令行工具并不这么用analysis server 被设计为长驻进程——它一次性启动持续服务于编辑器会话。常用命令行选项来自源码的参数表driver.dart 的createArgParser约 L806 起定义了完整参数。下表整理了公开可见的选项及其用途选项别名说明--client-id—analysis server 客户端标识符--client-version—analysis server 客户端版本--dart-sdk--sdk覆盖用于分析的 Dart SDK 路径--cache—覆盖 analysis server 缓存位置--packages—包解析配置文件路径包名到路径的映射--protocol—通信协议analyzer默认或lsp--protocol-traffic-log--instrumentation-log-file把服务器协议流量写入指定文件--session-log—把会话日志写入指定文件--performance-log—把性能日志写入指定文件--analysis-driver-log--new-analysis-driver-log把 analysis driver 诊断数据写入文件--diagnostic-port--port在指定端口提供状态与性能数据的 Web 界面--enable-experiment—启用一个或多个实验特性隐藏--suppress-analytics—抑制本次会话的遥测上报隐藏-h/--help—打印用法信息其中--protocol-traffic-log别名--instrumentation-log-file正是下一节教程中采集插桩日志所使用的底层选项见 driver.dart。implementation 板块功能的实现与增强方法implementation/overview.md 从服务器启动行为startup.md开始然后列出按功能组织的文档涵盖Call hierarchy、Closing labels、Code completion、Code folding、documentSymbol、Flutter outline、Hovers、Implemented markers、Navigation、Occurrences、Organize imports、Outline、Overrides markers、Quick assists、Quick fixes、Refactorings、SearchFind references / Member declarations / Member references / Top-level declarations、selectionRange、Semantic highlights、signatureHelp、Sort members、Type hierarchy 等。下面结合代表性功能文档和源码深入说明如何增强功能这一类文档的阅读与使用方法。代码补全双 pass、收集器与相关性排序implementation/code_completion.md 与 design/features/code_completion.md 描述了补全的实现无论是 legacy 协议的completion.getSuggestions2请求还是 LSP 的textDocument/completion请求最终都由DartCompletionManager通过computeFinalizedCandidateSuggestions计算建议。补全计算分两个 passInScopeCompletionPass对补全位置名字作用域内可见的每个合适元素计算建议NotImportedCompletionPass对尚未导入作用域的元素计算建议若剩余预算不足或已收集到足够多建议该 pass 会被跳过。两个 pass 都把候选建议CandidateSuggestion交给SuggestionCollector它用插入排序按与补全前缀的匹配度由FuzzyMatcher计算维护有序列表并受数量上限约束超过窗口的候选会被丢弃。最终排序由RelevanceComputer完成FeatureComputer测量补全位置与建议的若干特征如建议类型是否匹配上下文类型、局部变量声明距离补全位置多远每个特征取-1.0到1.0的double加权平均后调整到0–1000区间。特征集的选择基于对代表性 Dart 代码的统计分析追求全局最优而非单个用例最优需要评估排序质量时可用analysis_server/tool/code_completion/completion_metrics.dart即 pkg/analysis_server/tool/code_completion/completion_metrics.dart对比实验与当前实现的 MRR 指标。调试建议补全测试位于test/services/completion/dart/location按请求补全的语法位置分组排查问题时可在InScopeCompletionPass.computeSuggestions打断点观察_completionNode的类型再进入对应 visit 方法。导航基于RecursiveAstVisitor的增量增强implementation/navigation.md 说明导航从一段文本跳到相关位置如跳到标识符声明的实现方式要新增某种文本的导航支持只需修改_DartNavigationComputerVisitor。它是RecursiveAstVisitor所以第一步是确定包含起点文本的节点种类然后新增或编辑对应visit方法新增时必须调用父类方法以保证子节点仍被访问在方法内用computer.collector.addRegion计算可导航区域与目标位置。测试类为AnalysisNotificationNavigationTest测试模式固定addTestFile添加同时包含起点与目标的内容 →await prepareNavigation()计算缓存 →assertHasRegion/assertHasTarget断言。快速修复Quick Fix三种应用方式与完整实现范例implementation/quick_fix.md 给出了从零编写一个 quick fix 的完整指南以给可 final 的字段加final为例并区分三种应用方式Single-site fixes单点修复在单个诊断位置应用单个修复。由于客户端在光标移动时都可能请求修复修复必须快速计算不能做全库搜索或网络访问只能做局部文本改动。每个修复关联一个FixKind含分层点分隔的 identifier、优先级、消息Dart 修复定义在DartFixKindanalysis_options 修复在AnalysisOptionsFixKindpubspec 修复在PubspecFixKind。实现方式是继承CorrectionProducer实现compute(ChangeBuilder builder)applicability返回.singleLocationfixKind返回FixKind消息占位符如{0}由fixArguments填充。Fix-in-file fixes文件内批量修复对同一文件内同种诊断的所有位置一次修复。需要新增一个带后缀的FixKind如dart.fix.add.final.multi、优先级更低、消息强调everywhere in file并把applicability改为.acrossSingleFile、提供multiFixKind可选multiFixArguments。仅当同一诊断出现多处且修复能对所有位置产生编辑时才展示。Bulk fixes批量修复对一个包等范围的全部文件应用全部修复通过dart fix命令行工具使用。只需把applicability改为.automatically。由于 CLI 无回滚支持、编辑冲突概率更高需谨慎评估是否启用。注册表有三张lintProducerMap按 lint 名、nonLintProducerMap按ErrorCode、nonLintMultiProducerMap多修复生产者。新增首个修复时还要更新analysis_server/lib/src/services/correction/error_fix_status.yaml并用dart pkg/analysis_server/tool/presubmit/verify_error_fix_status.dart校验。测试分别位于analysis_server/test/src/services/correction/fix下使用FixProcessorLintTest/FixInFileProcessorTest/BulkFixProcessorTest与assertHasFix断言。快速辅助Quick Assist与语义高亮implementation/quick_assist.md 说明 quick assist 是不需要用户输入的局部代码编辑与 quick fix 的区别在于即使没有诊断也会展示用于常见、直接的代码变换。实现方式同样继承CorrectionProducer但关联的是AssistKindDart 的集中在DartAssistKind注册进AssistProcessor的generators/multiGenerators列表。由于没有诊断信号标记哪些 assist 可能适用服务器必须对每个 assist 逐一试算因此 assist 数量与每个 assist 的判定耗时都受严格约束。implementation/semantic_highlighting.md 则区分了语法高亮按语法位置着色如关键字与语义高亮按语义着色如类型名、废弃元素的删除线。增强语义高亮的方法是修改_DartUnitHighlightsComputerVisitor也是RecursiveAstVisitor在 visit 方法中调用 computer 的私有方法把高亮区域关联到HighlightRegionType——从高亮类型到实际样式/颜色的映射由客户端部分由用户配置完成。测试类为AnalysisNotificationHighlightsTest模式为addTestFile→prepareHighlights()→assertHasRegion。design 板块特性设计与实现原则除 implementation 外文档目录下还有 design/features/如 code_completion、documentHighlight、refactors、semantic_highlighting、sort_members与 design/principles/consistency、language_fidelity用于说明特性设计决策与实现应遵循的原则阅读实现文档时可与之对照。process 板块在 analysis server 代码库上工作process/overview.md 说明analysis_server包上的多数流程与analyzer包一致重复部分不在此重复本板块只记录特有的流程主要包括三份文档。新语言特性落地的检查清单process/new_language_feature.md 提供了一个模板清单当一个新语言特性获批后需要逐一评估服务器上的各项功能是否要随之增强几乎总是要写新测试。清单按字母序包括Call Hierarchy、Closing Labels、Code Completion、Code Folding、Document Colors、Hovers、Implemented/override markerslegacy 专属IntelliJ/Android Studio、Inlay Hints、NavigationGo to Definition / Go to Type Definition / Go to Super / legacy、Occurrences、Organize Imports、OutlineDocument Symbols、Flutter Outline自定义通知dart/textDocument/publishFlutterOutline、Refactorings 与 quick assists/fixes含 LSP rename、自描述重构、SearchFind References / Implementations / Member Declarations / Member References / Top-level Declarations、Selection Range、Syntax HighlightingSemantic Highlights 与 Semantic Tokens、Signature Help、Snippets、Sort Members、Type Hierarchy、Workspace Symbols。每个条目建议单独建 issue 跟踪。在 VS Code 中从源码运行/调试服务器process/running_in_vs_code.md 面向想修改analysis_server代码的开发者与其等待漫长的 SDK 构建不如让 VS Code 直接跑源码。配置方法打开命令面板F1执行Preferences: Open Workspace Settings (JSON)添加dart.analyzerPath指向服务器入口脚本例如pkg/analysis_server/bin/server.dart添加dart.sdkPath指向与源码版本兼容的 SDK保存后服务器自动重启从源码启动会稍慢建议仅针对特定项目测试时启用。协议流量捕获有三种方式临时捕获命令面板执行Dart: Capture Analysis Server Logs期间编辑器操作会记录到日志点通知上的Cancel停止并打开日志文件常驻捕获设置dart.analyzerLogFileVS Code 扩展客户端侧记录含 spawn 信息与 stderr行默认截断可用dart.maxLogLineLength调整和/或dart.analyzerInstrumentationLogFile服务器侧写入含客户端不可见的文件监视事件附加调试器测试项目设置dart.analyzerVmServicePort如 8222注意这会禁用 VM Service 认证码调试完务必移除在装有 analysis_server 源码的另一个 VS Code 窗口中执行Debug: Attach to Dart Process并输入端口。文档建议在TextDocumentChangeHandler._changeFilelib/src/lsp/handlers/handler_text_document_changes.dart顶部打断点验证。用 DevTools CPU Profiler 剖析 VS Code 托管下的服务器process/profiling_for_vs_code.md 演示对短时间窗口操作如输入、触发补全做 CPU 剖析打开项目并添加dart.analyzerVmServicePort: 8855端口随意但需记住等待初始分析完成状态栏不再显示 Analyzing...执行Dart: Open DevTools in Browser在 DevTools 中连接http://localhost:8855/进入CPU ProfilerEnable Profiler选择mainisolateStart recording回到 VS Code 复现性能问题回 DevTools Stop recording导出剖析数据导出内容可能包含项目路径与类/成员名最后务必移除dart.analyzerVmServicePort设置。tutorial 板块面向终端用户的诊断信息采集tutorial/instrumentation.md 讲解如何从运行中的 DAS 进程收集插桩日志、会话日志与其他诊断信息。由于 IDE 负责拉起 DAS采集步骤因 IDE 而异。采集插桩日志Instrumentation Log需要让 DAS 以--instrumentation-log-file路径启动即前文提到的--protocol-traffic-log别名。各 IDE 的操作IntelliJ IDEA / Android StudioHelp Find Action输入 Registry 打开 Registry找到dart.server.additional.arguments把--instrumentation-log-file/some/file.txt追加到其值与已有参数用空格分隔然后在Dart Analysis面板点击Restart Dart Analysis Server按钮。之后 DAS 会把插桩日志写入指定文件。VS Code参见 Dart Code 插件的日志文档Analyzer instrumentation 一节。打开 Analyzer Insights诊断页面DAS 会在localhost上以网站形式提供多种 insights pages旧称 diagnostics pages。打开方式IntelliJ IDEA / Android Studio在Dart Analysis面板点击左侧齿轮图标的Analyzer Settings按钮注意区别于顶部的 Show Options Menu点击View analyzer diagnostics链接外部浏览器打开VS Code命令面板CtrlShiftP执行Dart: Open Analyzer Diagnostics / Insights。从源码看这些页面由HttpAnalysisServerpkg/analysis_server/lib/src/server/http_server.dart承载它绑定到回环地址InternetAddress.loopbackIPv4端口为 0 时自动分配或用--diagnostic-port固定通过DiagnosticsSite处理 HTTP/WebSocket 请求_DiagnosticServerImpldriver.dart封装了获取或启动诊断服务器端口的逻辑。insights 页面清单见 instrumentation.md页面内容StatusDAS 进程的通用信息含版本Analysis performance log分析性能日志Communications通信信息TODOContexts分析上下文TODOEnvironment VariablesDAS 视角下的全部系统环境变量Exceptions异常信息TODOLegacy plugins当前工作区配置的旧式 analyzer 插件信息LSP CapabilitiesDAS 以 LSP 方式启动时当前 Client/Server 的 LSP 能力Memory and CPU UsageDAS 当前内存与 CPU 占用PluginsDart 3.10 引入的新插件系统所配置的插件信息Session communications log不重启服务器即可录制客户端与服务器间的通信Timing计时信息TODO录制会话通信日志Session Communications Logtutorial/session_log.md 说明会话通信日志记录客户端VS Code、IntelliJ/Android Studio 等与 DAS 之间的全部通信请求、响应、通知适合报告/诊断服务器 bug、捕获一系列编辑器操作补全、重构、诊断用于复现、为 SDK 开发者提供可回放会话以验证修复。有两种录制方式方式一通过 Analyzer Insights 网页交互录制推荐用于捕获特定编辑器交互。即使尚未点击 Start capturing服务器也会在内存中缓存关键的启动消息初始化请求、工作区配置、打开的文档开始捕获后后续交互进入缓冲区保证日志包含复现所需上下文。步骤打开 insights → 左侧导航选Session communications log→ 点Start capturing entries→ 回到编辑器复现问题/执行工作流 → 点Stop capturing entries→ 点Copy to Clipboard→ 粘贴保存为 JSON 文件如session_log.json。方式二通过--session-log命令行选项捕获从服务器启动起的全部通信无法用 Web UI 时使用。服务器会把日志逐行流式写入指定文件。配置示例VS Code在 settings.json 中添加dart.analyzerAdditionalArgs: [ --session-log/path/to/session_log.json ]然后执行Dart: Restart Analysis Server结束后移除该参数并再次重启日志文件即停止增长。IntelliJ IDEA / Android StudioHelp Find Action打开Registry在dart.server.additional.arguments中加入--session-log/path/to/session_log.json与其它参数空格分隔在Dart Analysis窗口点击Restart Dart Analysis Server结束后同样移除并重启。直接运行服务器dart language-server --protocollsp --session-log/path/to/session_log.json日志格式与请求延迟分析录制的文件是逐行 JSONJSON Lines每行是一个自包含事件对象字段包括time事件发生的毫秒时间戳自 epoch 起kind事件类型如commandLine、messagesender源进程如ide、server、watcher、dtdreceiver目标进程message进程间传递的 JSON-RPC 载荷。要评估某个请求/响应的耗时找到客户端请求行sender: ide、receiver: server记下其id与时间戳time或message内的clientRequestTime再找到同id的服务器响应行sender: server、receiver: ide往返时长即为response.time - request.time。冷启动 vs 热服务器IDE 首次打开工作区时服务器会在后台初始化并分析文件通过$/progress通知跟踪。在初始分析完成前发出的请求会排在服务器任务队列中等待因此其响应时间包含首次工作区分析时间服务器空闲后的后续请求才反映真正的 handler 计算时间。隐私与路径匿名化录制的会话日志包含本机文件路径如/Users/$USER/...以及会话期间打开/编辑文档的文件内容。若要公开分享日志例如提交到 Dart SDK issue 跟踪器检查日志中不含敏感/专有源码使用normalize.dart把机器特定路径规范化为通用占位符{{workspaceFolder-0}}、{{dartSdkRoot}}等dart pkg/analysis_server/tool/log_player/normalize.dart \ -i /path/to/session_log.json \ -o /path/to/normalized_log.json \ -r /path/to/workspace/root从源码理解会话日志的实现会话日志的实现集中在 pkg/analysis_server/lib/src/session_logger/ 目录是理解上述教程底层发生了什么的最佳入口。SessionLoggersession_logger.dart核心门面。构造时创建LogNormalizer与SessionLoggerInMemorySink若传入filePath还会附加一个文件 sink。它提供logCommandLine记录启动参数kind 为commandLine、logMessage记录任意两进程间的消息kind 为message并带有sender/receiver、logExceptionkind 为exception以及shutdown。EntryKindentry_kind.dart枚举commandLine、exception、message三种事件类型每种类型对应一组键例如commandLine带argListmessage带sender/receiver/message。ProcessIdprocess_id.dart标识可收发消息的进程dtdDart tooling daemon、ideIDE/客户端、serveranalysis server、plugin插件 isolate、watcher文件系统 watcher。LogEntry/Messagelog_entry.dart日志行与消息载荷的读取封装。Message提供了idLSP 中可为 int 或 String、method、params、result、textDocument等访问器以及判断消息类型的方法isInitializeRequest、isInitialized、isDidChange、isDidClose、isDidOpen、isWorkspaceConfiguration、isResponse等。会话内请求/响应匹配正是通过isResponseTo(requestId)实现的。SessionLoggerSink的两个实现session_logger_sink.dartSessionLoggerFileSink把规范化后的 JSON 逐行写入文件SessionLoggerInMemorySink内存缓冲设计目标就是允许用户在任意时刻开启捕获、在将来取回捕获条目。它维护四个缓冲区_initializationBuffer初始化相关、_configurationBuffer工作区配置每次新配置请求时清空、_textDocumentBuffer文档操作、_sessionBuffer常规条目超过maxBufferLength时从头部淘汰。即使未开启捕获初始化、配置与文档条目也会被缓存——这正是 insights 页面上开始捕获前的上下文也包含在日志里的源码依据。capturedEntries返回四段缓冲的拼接供 Web 页面取用。日志回放与性能基准log_player与performance工具录制会话日志只是第一步SDK 贡献者可以用 pkg/analysis_server/tool/log_player/ 下的工具规范化、回放并剖析日志详见其 README.md。Step 1规范化日志normalize.dart。原始日志含机器特定绝对路径回放前需规范化以使其可移植。参数-i/--input必填、-o/--output必填、-r/--root-dir必填录制时的项目根目录、-p/--package-config若package_config.json不在根目录默认位置、-h/--help。Step 2回放日志有两种方式交互式回放server_driver_main.dart适合手动调试、逐步查看复现轨迹。在匹配录制会话的项目根目录运行dart sdk-root/pkg/analysis_server/tool/log_player/server_driver_main.dart \ path/to/normalized_session.json工具以 LSP 模式启动新的 analysis server 进程把{{workspaceFolder-0}}、{{rootPath}}、{{rootUri}}映射到当前工作目录按Enter逐条发送下一条客户端消息并显示服务器响应。不带参数运行则进入手动 stdin 模式可逐行粘贴 JSON-RPC 消息测试服务器反应。提示ServerDriver用Platform.resolvedExecutable启动 DAS若在外部目录运行导致包解析失败可加--packagessdk-root/.dart_tool/package_config.json。自动化场景回放LogPlayer与性能场景log_player.dart 中的LogPlayer类提供全自动回放按日志中记录的命令行参数拉起服务器、自动响应服务器发起的请求如workspace/configuration、校验服务器响应与记录期望一致忽略textDocument/publishDiagnostics等非确定性通知。性能基准场景pkg/analysis_server/tool/performance/README.md 描述如何用规范化后的会话日志对指定 git 提交的项目复现真实开发者工作流形成可重复的基准测试。新增场景三步录制会话日志 → 用normalize.dart规范化并输出到tool/performance/scenarios/logs/name.log→ 在 run_saved_scenarios.dart 的scenarios列表新增Scenario条目项目可用GitCloneProjectGenerator克隆外部仓库或用GitWorktreeProjectGenerator对 Dart SDK 本地仓库建 worktree。端到端调试工作流录制 → 检查 → 规范化 → 复现 → 修复 → 重建 → 验证按 session_log.md 录制会话日志通过匹配请求/响应 ID 找出失败响应或慢请求计算response.time - request.time规范化dart pkg/analysis_server/tool/log_player/normalize.dart -i raw_log.json -o normalized_log.json -r /path/to/project/root用server_driver_main.dart或自定义回放脚本对基线服务器回放复现问题并测量基线耗时在pkg/analysis_server或pkg/analyzer中实施修复重建 SDKpython3 tools/build.py -mrelease create_sdk用新编译的 SDK 二进制再次回放验证问题解决或延迟改善。冷启动排队与热请求延迟回放或检查日志时需注意——客户端发送initialize/initialized后服务器在后台索引并分析工作区$/progress通知title: Analyzing...此期间的请求如早期textDocument/documentColor、textDocument/codeAction会排在后台分析之后观测到的response.time - request.time反映的是排队等待而非 handler 计算时间。要测真实 handler 延迟应选取初始分析完成之后$/progress结束通知之后的请求。进一步阅读本文全部内容围绕 introduction.md 的三大板块展开更细的协议与 API 参考见 api.html实现细节implementation/startup.md启动、implementation/lsp.mdLSP 支持、implementation/legacy.mdlegacy 协议、implementation/handlers.md请求处理器、implementation/code_edits.md代码编辑模型、implementation/data_driven_fixes.md数据驱动的修复协议客户端能力说明见 pkg/analysis_server/doc/lsp/client_capabilities/含 VS Code 的 Dart Code、Neovim/Flutter tools、Emacs lsp-dart 等客户端记录服务器入口源码bin/server.dart、lib/starter.dart、lib/src/server/driver.dart会话日志实现pkg/analysis_server/lib/src/session_logger/回放工具pkg/analysis_server/tool/log_player/。Dart Analysis Server 是连接语言前端analyzer、编辑器客户端与 CLI 工具的枢纽。无论是想为其贡献新特性、排查 IDE 侧的性能问题还是向 SDK 提交高质量的可复现 bug 报告从 introduction.md 出发沿着 implementation → process → tutorial 的路径阅读文档、并结合上述源码与日志工具动手实践都是最高效的切入点。赞分享编程语言编译器语言运行时标准库开发工具【免费下载链接】sdkThe Dart SDK, including the VM, JS and Wasm compilers, analysis, core libraries, and more.项目地址https://gitcode.com/gh_mirrors/sdk1/sdk点击查看免费下载相关推荐Dart Analysis ServerDAS诊断与插桩指南instrumentation 日志、会话通信日志与 Analyzer Insights 页面Dart Analysis ServerDAS诊断与插桩指南instrumentation 日志、会话通信日志与 Analyzer Insights 页面编程语言编译器语言运行时标准库开发工具深入理解xv6-riscv内核日志系统printf实现与调试技巧深入理解xv6 riscv内核日志系统printf实现与调试技巧 xv6 riscv是一个基于RISC V架构的教学操作系统其内核日志系统对于系统调试和开发操作系统嵌入式Dart Analysis Server 代码编辑功能体系深入解析Quick Fix、Quick Assist 与 Refactoring 的设计与实现Dart Analysis Server 代码编辑功能体系深入解析Quick Fix、Quick Assist 与 Refactoring 的设计与实现 An编程语言编译器语言运行时标准库开发工具上一篇英雄联盟终极工具箱LeagueAkari 7大核心功能完全指南下一篇5个步骤快速上手Unitree GO2 ROS2 SDK完整入门指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表