Skip to content

Latest commit

 

History

History
200 lines (162 loc) · 4.83 KB

File metadata and controls

200 lines (162 loc) · 4.83 KB

ArkTS 泛型功能实现总结

修改概述

根据 HarmonyOS ArkTS 官方文档 中关于泛型的内容,对 tree-sitter-arkts 进行了全面的泛型支持增强。

主要修改

1. 语法规则改进

grammar.js 中的关键修改:

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), ')'))
))

2. 冲突解决

添加了以下冲突规则来处理泛型语法的歧义:

conflicts: $ => [
  // ... 现有冲突 ...
  [$.binary_expression, $.conditional_expression, $.call_expression],
  [$.expression, $.array_type],
  [$.tuple_type, $.array_literal],
  [$.boolean_literal, $.primary_type]
]

3. 新增测试文件

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>

与官方文档的对照

1. 泛型类和接口 ✅

class CustomStack<Element> {
  public push(e: Element): void { }
}

状态: 完全支持

2. 泛型约束 ✅

interface Hashable {
  hash(): number
}
class HashMap<Key extends Hashable, Value> { }

状态: 完全支持

3. 泛型函数 ✅

function identity<T>(arg: T): T {
  return arg;
}

状态: 完全支持

4. 泛型默认值 ✅

class Container<T = string> { }

状态: 完全支持

已知问题和限制

  1. UI 组件调用语法: 在 build() 方法中,UI 组件调用后不应添加分号(符合 ArkUI DSL 规范)

    build() {
      Text("Hello")  // ✅ 正确
      // Text("Hello");  // ❌ 错误
    }
  2. 条件类型复杂嵌套: 极端复杂的条件类型嵌套可能需要进一步测试

文档更新

新增以下文档:

  • GENERICS_SUPPORT.md - 泛型功能详细文档
  • GENERICS_SUMMARY.md - 本文档

后续建议

  1. 添加更多泛型边界情况的测试
  2. 测试泛型在复杂 ArkUI 组件中的使用
  3. 完善语法高亮规则(queries/highlights.scm)
  4. 添加泛型相关的代码导航标签(queries/tags.scm)

参考资料


实现日期: 2025-10-16
修改文件: grammar.js
测试文件: test/test_generics.ets, test/test_generic_component.ets