Appearance
Phase 6 Variant Query Precision
目标
在已经补上 member query precision 之后,把 enum variant declaration / pattern use / constructor use 也纳入同一套 query surface。
这一步仍然不是直接做 rename 或 completion,而是继续补强“符号 identity + 精确 token span”这条地基。没有这层稳定事实,后续 IDE 能力只会不断堆特判。
这一步解决的真实缺口
前一轮已经能稳定处理:
- struct field member token
- unique impl / extend method member token
但 enum variant 仍然停留在“root enum item 可以被解析,variant 自己没有稳定 identity”的状态。结果是:
Command.Retry(...)这类 constructor use 只能查到CommandCommand.Config { ... }这类 struct-variant literal 只能查到 enum rootmatch command { Command.Retry(v) => ... }这种 pattern use 也不能精确落到Retry
所以这一轮不是“补一个 hover case”,而是把 variant 也放进统一 occurrence/indexing 模型里。
Path 位置信息基础
为了避免继续靠 source slice 猜 token,本轮先给 ql_ast::Path 补上 segment_spans:
- parser 现在会在
parse_path()里记录每个 segment 的独立 span - resolver 里从表达式重建 path 时,也会保留 name/member 的 segment span
- root-only 的 synthetic path 仍允许使用
Path::new(...)构造,span 默认为 empty,不破坏现有辅助构造器
这让 query 层可以同时拿到:
- root segment span
- tail segment span
后续如果继续做 module-path deeper query,这层基础还可以继续复用。
查询层落地
ql-analysis::QueryIndex 现在新增:
SymbolKind::VariantSymbolKey::Variant- enum variant definition indexing
- enum variant use indexing,当前覆盖:
Command.Retry(...)Command.Config { ... }Command.Retry(...)/Command.Config { ... }形式的 pattern use
索引策略保持和已有设计一致:
- root enum item 仍然保留自己的 occurrence
- variant tail token 再追加一个更窄的 occurrence
symbol_at(offset)通过 span 排序优先命中更窄 token,所以光标落在Retry/Config上时会得到 variant,而不是 enum root
当前边界
这一步依然故意不宣称完整 path 语义已完成:
- 还没做 module-path deeper query
- 还没做 import alias 下的跨模块 variant 精确映射
- 还没做 rename / completion
- ambiguous method/member 仍保持保守策略
也就是说,这一轮补的是“source-backed enum variant precision”,不是“完整路径系统”。
回归覆盖
新增/更新回归包括:
- parser fixture:path segment span 会精确保留到 variant pattern / variant struct literal
- analysis query:variant declaration / constructor use / pattern use 会共享 definition 与 references
- LSP bridge:variant hover markdown 会显示
variantkind、detail 与 enum type
后续建议
下一步更合理的方向不是跳去做跨文件 rename,而是继续沿着同一条数据面推进:
- module-path deeper query
- ambiguous member handling strategy
- rename/completion scaffolding,直接复用
QueryIndex