SuperAPI AI 工具集

navigating-code

编程与开发

查看项目

更新于 10-19 02:41

技能介绍

Navigating Code 是一个面向 Rider 的代码导航技能,用于回答“这个符号在哪儿被使用、在哪儿被实现”这类问题。它基于 Rider 的引用索引返回结果,因此一次调用即可替代反复 grep 再逐个读文件的循环,并跳过 grep 会返回的同名符号、注释与字符串。

用途

该技能适用于需要在 Rider 已打开的解决方案中定位符号声明、引用或实现的情况。资料覆盖的语言与场景包括 .NET/C#、F#、VB、C++、Unity、Unreal Engine、XAML、Razor。

主要能力与工具选择

  • 符号在哪儿声明:使用 search_symbol,必填 --q。
  • 谁使用/调用/读取/写入该符号:使用 find_usages,需 --filePath 加 --symbolName,或 --line。
  • 哪些 .NET 类实现了该接口或继承自该类:使用 find_implementations,参数同上。
  • 哪些 .NET 成员重写或实现了该虚方法、抽象方法或接口成员:同样使用 find_implementations。
  • 文本出现在哪儿(字符串、注释、配置):使用 search_text 或 search_regex,必填 --q。

使用方式

通过 execute_tool 调用,第一个词是工具名,其后是 --flag value 对,例如:

execute_tool(command="find_usages --filePath API/Services/OrderService.cs --symbolName OrderService.Submit") execute_tool(command="find_implementations --filePath Domain/IPaymentGateway.cs --symbolName IPaymentGateway")

如果客户端直接列出 Rider 工具,也可按名称调用 find_usages 与 find_implementations,参数相同。

识别符号的方式:已知声明文件时,传入 --filePath 与 --symbolName(Name 或 Type.Member);不知道文件时,先调用 search_symbol,再传其 filePath;遇到重载或在调用处看到符号时,传入该声明或使用处的 --filePath 与 --line,并配合 --symbolName(或 --column)选定行上的符号,这在任何提及该符号的文件中都有效。C++ 需同时传 --line 和形如 Type::Member 的 --symbolName,限定符用于选定行上的成员(如 AMyActor::AMyActor() 中的构造函数);没有 --line 时,带限定符的 C++ 名称无法解析。find_implementations 目前不支持 C++,对 C++ 符号会返回错误。

结果解读

find_usages 返回 {symbol, declarations, files: [{file, usages: [{line, column, text, kinds, member}]}], total, more, note}。其中 text 是源码行,无需仅为查看调用而打开文件;kinds 表示使用方式(如 Invocation、Read、Write);member 为调用方。

find_implementations 返回 {symbol, declarations, implementations: [{symbol, file, line, column}], total, more, note},列表是递归的,包含间接继承者与重写。

note 表示 IDE 仍在建索引,列表可能不完整,应说明或稍后重试;more=true 表示结果被 --limit(默认 100)截断,可先用 --paths '["src/Api/**"]' 收窄范围再提高上限。

适用规则与限制

查找标识符时优先使用这些工具而非 grep:grep 找的是文本而非引用,会遗漏通过别名、nameof、XAML/Razor 绑定和 C++ 宏产生的使用,并混入同名符号。输入有问题时应修正后重试:“not declared in”表示文件未声明该符号,应传入 search_symbol 给出的声明文件或改用 --line;“has N overloads”会列出每个重载所在行,应传入目标重载的 --line,不要用相同参数重试。仅当工具无法回答时才退回文本搜索,情形包括:超时(工具在 60 秒后停止)、文件不在解决方案内、Rider 无法解析的语言,以及对 C++ 符号调用 find_implementations;此时应说明结果来自文本搜索。需要多个符号时可在一轮内发出全部调用;可用 total 判断调用方数量而无需读取文件,仅在需要周边代码时读取某条使用。