根据 HarmonyOS ArkTS 官方文档 中关于泛型的内容,对 tree-sitter-arkts 进行了全面的泛型支持增强。
a. 类型参数定义
// 支持泛型约束和默认值
type_parameter: $ => seq(
$.identifier,
optional(seq('extends', $.type_annotation)), // 泛型约束
optional(seq('=', $.type_annotation)) // 泛型默认值
),b. 接口方法签名
type_member: $ => choice(
// 方法签名(更高优先级)
prec(1, seq(
$.identifier,
optional($.type_parameters),
$.parameter_list,
optional(seq(':', $.type_annotation))
)),
// 属性签名
seq($.identifier, optional('?'), ':', $.type_annotation)
),c. implements 子句
implements_clause: $ => seq(
'implements',
commaSep(choice(
$.identifier,
$.generic_type // 支持实现泛型接口
))
),d. 新增类型支持
- 元组类型:
[A, B, C] - 条件类型:
T extends U ? X : Y - 索引访问表达式:
arr[index]
e. 泛型表达式
// 支持泛型函数调用
call_expression: $ => prec.left(1, seq(
$.expression,
optional($.type_arguments), // func<T>()
'(',
commaSep($.expression),
')'
)),
// 支持泛型实例化
new_expression: $ => prec.right(21, seq(
'new',
$.expression,
optional($.type_arguments), // new Class<T>()
optional(seq('(', commaSep($.expression), ')'))
))添加了以下冲突规则来处理泛型语法的歧义:
conflicts: $ => [
// ... 现有冲突 ...
[$.binary_expression, $.conditional_expression, $.call_expression],
[$.expression, $.array_type],
[$.tuple_type, $.array_literal],
[$.boolean_literal, $.primary_type]
]test/test_generics.ets
- 泛型类(带类型参数)
- 泛型接口
- 泛型函数
- 泛型约束(extends)
- 多个泛型参数
- 泛型默认值
- 泛型数组类型
- 嵌套泛型
- 泛型类型别名
- 条件类型
- 泛型组件
test/test_generic_component.ets
- ArkTS 泛型组件示例
✅ test/test_generics.ets: 0 个 ERROR
✅ test/test_generic_component.ets: 0 个 ERROR
所有泛型特性均可正确解析,无语法错误。
| 功能 | 状态 | 示例 |
|---|---|---|
| 泛型类 | ✅ | class Stack<T> |
| 泛型接口 | ✅ | interface IData<T> |
| 泛型函数 | ✅ | function fn<T>(arg: T) |
| 泛型约束 | ✅ | <T extends Base> |
| 泛型默认值 | ✅ | <T = string> |
| 多个类型参数 | ✅ | <A, B, C> |
| 泛型调用 | ✅ | fn<number>(42) |
| 泛型实例化 | ✅ | new Class<T>() |
| implements 泛型接口 | ✅ | implements IData<T> |
| 元组类型 | ✅ | [string, number] |
| 条件类型 | ✅ | T extends U ? X : Y |
| 嵌套泛型 | ✅ | Array<Array<T>> |
| 索引访问 | ✅ | arr[0] |
| 泛型组件 | ✅ | struct Comp<T> |
class CustomStack<Element> {
public push(e: Element): void { }
}状态: 完全支持
interface Hashable {
hash(): number
}
class HashMap<Key extends Hashable, Value> { }状态: 完全支持
function identity<T>(arg: T): T {
return arg;
}状态: 完全支持
class Container<T = string> { }状态: 完全支持
-
UI 组件调用语法: 在
build()方法中,UI 组件调用后不应添加分号(符合 ArkUI DSL 规范)build() { Text("Hello") // ✅ 正确 // Text("Hello"); // ❌ 错误 }
-
条件类型复杂嵌套: 极端复杂的条件类型嵌套可能需要进一步测试
新增以下文档:
GENERICS_SUPPORT.md- 泛型功能详细文档GENERICS_SUMMARY.md- 本文档
- 添加更多泛型边界情况的测试
- 测试泛型在复杂 ArkUI 组件中的使用
- 完善语法高亮规则(queries/highlights.scm)
- 添加泛型相关的代码导航标签(queries/tags.scm)
实现日期: 2025-10-16
修改文件: grammar.js
测试文件: test/test_generics.ets, test/test_generic_component.ets