Skip to content

Latest commit

 

History

History
146 lines (103 loc) · 9.17 KB

File metadata and controls

146 lines (103 loc) · 9.17 KB

语言能力与限制

本篇说明语言适配器能从已提供源码中建立哪些证据,以及哪些行为仍缺少静态依据。 组织身份见 命名空间组织,实现接入见 语言构建流程。

查询能力

API 表达的信息
Language(path) 路径对应的注册 grammar
Languages() 已注册的 grammar 名称,不加载全部 parser
Capabilities() 内置语言适配器的组织、声明、关系、marker 与限制
Capabilities("rust", "java") 按需查询其他注册语言的 outline 能力;未知名称不返回能力

grammar 可用不表示语义完整。具体类别与语言覆盖以实际注册项、契约测试及本次 BuildReport 为准。 没有 grammar 的材料处理见 Document 契约。

共同证据规则

Go、Python、JS/TS 保留标识符使用位置及其最内层声明归属;声明名、注释和字符串不作为引用。 Facts.References 保存尚未找到目标的使用,references 从所属声明(无声明时为 Document)指向目标。 重复使用保留不同发生位置。未知目标留下局部诊断,已知遮蔽阻止同名回退。

imports 连接语言组织单元,具名导入及显式转导出还可连接最终声明。 模块绑定供引用、调用及显式类型关系共用;候选模块或目标的不确定性沿转导出链保留。 路径长度不会自动降低关系 confidence,业务传播策略由消费者定义。

Facts.Calls.Targets 保存语法提出的名称、接收者类型、模块限定及依据,不表示运行时分派结果。 候选方法可以沿已绑定的 extends 查找;直接同名方法停止该分支,多个基类保留候选,重复祖先去重。 继承调用使用 scoped / inherited_method,并受导入与 extends 必要环节的精度上限约束;implements 不作为继承依据。 已知接收者或类型的调用采用 scoped;缺少接收者约束、仅按方法名提出的目标采用 name_only, 即使只有一个同名方法也不升级。具体分级由已有语义证据决定,不由 Basis 名称直接决定。 动态实现选择、运行时方法修改、未知回调及未建模闭包保留缺口。

候选解析消费已加载材料,遵守取消与预算;补料后重解析,失败批次不发布部分关系。

Go

声明与组织

提取函数、方法、命名 struct/interface、字段、接口显式方法、其他命名类型、类型别名、 单名称变量和常量,以及声明文档注释 marker。Type 表达其他命名类型,TypeAlias 表达显式别名, 不会因右侧语法而丢失别名身份。

命名 struct/interface 只展开直接成员,匿名嵌套类型和提升成员不展开。 同组字段各有身份并互为兄弟,内嵌结构体字段按非限定类型名命名。 包及跨文件接收者归属规则见 命名空间组织。

引用与类型线索

同文件可证明的词法引用为 exact,同包跨文件和 import 名称匹配的引用为 scoped。 复合字面量的字段键按已加载类型及别名提出 scoped / composite_field;map、数组键保留词法引用。 未知类型、匿名或省略类型的字段键保留缺口,不连接偶然同名的变量或类型。

成员引用与调用共用接收者类型传播:

  • 显式类型、局部初始化和变量别名提供字段、方法与接口嵌入方法的候选。
  • 成员链沿字段声明类型传播;索引和 range 从容器元素或键获得线索,类型断言保留断言类型。
  • 函数、方法及有签名回调沿已加载返回类型传播,多返回值按槽位对应,空白变量不改变槽位。
  • 类型线索保留声明文件的导入与词法上下文,跨文件使用时不套用调用方环境。
  • 类型别名共享目标;新定义的具体类型仅共享底层字段,不继承底层接收者方法。

类型语法与值表达式分开处理,泛型实例化不当作容器索引;递归类型与循环赋值的传播有界。 未知签名、泛型实参替换、隐式成员提升与未知接收者保留 unresolved_reference。 局部类型保持词法身份,同名预声明标识符不使真实成员使用被过滤。

调用与类型关系

解析静态同包函数及模块内导入函数调用;显式接收者、局部初始化和函数/方法别名可提出调用候选。 重赋值保留可能目标,不作语句流判定。接收者未知时仅在同包按方法名提出候选,不匹配普通函数。

interface 嵌入形成 extends,struct 嵌入表达组合。 同包具名类型的直接方法名集合可提出 heuristic / method_name_set 的 implements; 该证据不验证签名、值/指针方法集或类型约束。空接口、嵌入接口和类型项接口不参与推断,提升方法不展开。

不评估 build tags、第三方模块或编译器类型检查;//go:embed 记录 unsupported_resource,不读取嵌入资源。 能力测量与独立参照见 Go 仓库评测。

Python

模块与导入

提取 outline 声明、源码导入、显式模块绑定、局部函数调用和前置注释 marker。 import 指向 Module / Package,from-import 与 alias 可连接已加载声明。 函数内 import 不泄漏到其他函数;显式导入的类可以参与构造与方法绑定。

绝对 import 缺少运行时搜索路径证据,即使只有一个本地目标也保持 scoped。 路径候选来自快照根,以及与导入首段同名的当前文件祖先目录,支持源码子目录和嵌套 SDK 布局。 无关目录不会自动成为搜索根。普通包、类型桩及 namespace package 边界见 命名空间组织。

不执行包初始化或动态搜索路径;星号导入、未起 alias 的多段模块属性及动态属性查找保留未解析事实。

词法绑定与调用

Scope/Binding 区分签名表达式与函数体:参数类型、默认值、返回注解在外层作用域读取, 参数名及函数体局部赋值仅影响函数体。嵌套签名仍受外层函数的真实绑定约束。 普通、带类型、带默认值、仅关键字和可变参数遵循同一区分;字符串注解保持字符串边界。 方法词法查找跳过类体层级。

Lambda 默认值调用属于创建函数时的表达式,函数体调用仍保留延迟执行缺口。 动态重绑定、执行顺序及 global/nonlocal 重定向未证明时保留局部缺口。 实例首参数、显式类型及局部实例初始化可定位类方法;类构造调用指向 Class。 接收者未知时仅在同模块按方法名提出候选,运行时 MRO 不在查找模型内。

具名基类复用模块绑定,唯一可证明目标为 exact,绝对导入或多个来源仍为 scoped; 动态基类表达式和缺少目标产生局部诊断。

单文件语句事实

Facts.Statements 保留语句顺序、作用域和受限表达式词汇,供消费者解释搜索路径等线索。 import 事实保存绑定名及语句挂靠。结构是语言中立的,当前只有 Python 捕获,未实现的语言为空。 图模型不依赖消费者对语句的解释。测量边界见 Python 仓库评测。

JavaScript / TypeScript / TSX

模块绑定

提取 outline 声明、源码 import、局部函数调用及前置注释 marker,包含 export 包装。 文件以 Module 组织顶层声明;具名、default、namespace import 及显式 re-export 链连接已加载目标。 显式导出优先于星号转导出,星号转导出不传播 default;循环按路径和公开名称检测。

相对路径支持 index 文件;多个匹配来源保留 scoped。 不求值 package metadata、tsconfig alias、CommonJS 导出表达式和动态属性, namespace 转导出的嵌套属性仍可能未解析。Module 不证明 ESM/CommonJS 运行时加载模式。

可见性与类型关系

Scope/Binding 区分函数、块、catch 与循环作用域,var 归最近函数。 引用与调用共用绑定索引,局部遮蔽阻止同名回退;参数和绑定模式的具体覆盖由契约测试约束。 this、显式类型、局部实例初始化及显式导入的类可提供候选方法,构造调用指向 Class。 接收者未知时只在同模块提出同名方法候选。

具名基类和显式接口关系形成 extends / implements;唯一语法绑定为 exact,多个目标保持 scoped。 继承方法查找复用已绑定类型关系,运行时分派仍未证明。 独立编译器参照与未评估范围见 TypeScript 仓库评测。

其他 grammar 与扩展

通过 gotreesitter 的 grammars.Register / RegisterExtension 注册 grammar 后,通用适配器 使用 tags 和所有权规则提取具体声明、源码贡献及声明内成员。 未知声明类别保留诊断;缺少 outline、未支持的类别及关系解析能力分别报告覆盖缺口。 仅提供 grammar 的语言以 unsupported_resolution 表示引用未覆盖,不使用通用 Symbol 节点兜底。

Java、Rust、C/C++、Ruby 有真实源码声明契约测试;grammar 接入示例见 language_extension_test.go。完整组织与绑定规则需要实现内部阶段接口, 见 语言构建流程。