1e41f4b71Sopenharmony_ci# ArkCompiler子系统变更说明
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci## cl.arkcompiler.1 ArkTS语法检查工具检查场景增加
4e41f4b71Sopenharmony_ci
5e41f4b71Sopenharmony_ci**访问级别**
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_ci其他
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ci**变更原因**
10e41f4b71Sopenharmony_ci
11e41f4b71Sopenharmony_ciArkTS语法检查工具的检查场景包括应用完整编译、增量编译、首次预览、首次热重载等,在预览和热重载场景下,增量修改代码保存后触发实时预览和热重载时,未进行ArkTS语法检查,本次变更在该场景下的编译流程中新增ArkTS语法检查,以和其他场景检查结果保持一致。
12e41f4b71Sopenharmony_ci
13e41f4b71Sopenharmony_ci**变更影响**
14e41f4b71Sopenharmony_ci
15e41f4b71Sopenharmony_ci变更前,在预览器和热重载场景下,增量修改再次预览和热重载时,不会进行ArkTS语法检查,如果引入违反ArkTS语法规则问题的代码,可以继续实时预览和热重载;变更后,在该场景下,如果引入违反ArkTS语法规则问题的代码,会阻塞编译,停止实时预览和热重载。
16e41f4b71Sopenharmony_ci
17e41f4b71Sopenharmony_ci**起始 API Level**
18e41f4b71Sopenharmony_ci
19e41f4b71Sopenharmony_ciArkTS语法检查从API 10起启用。
20e41f4b71Sopenharmony_ci
21e41f4b71Sopenharmony_ci**变更发生版本**
22e41f4b71Sopenharmony_ci
23e41f4b71Sopenharmony_ci从OpenHarmony SDK 5.0.0.18 开始。
24e41f4b71Sopenharmony_ci
25e41f4b71Sopenharmony_ci**变更的接口/组件**
26e41f4b71Sopenharmony_ci
27e41f4b71Sopenharmony_ci不涉及。
28e41f4b71Sopenharmony_ci
29e41f4b71Sopenharmony_ci**适配指导**
30e41f4b71Sopenharmony_ci
31e41f4b71Sopenharmony_ci能够完整编译成功的应用,无需额外适配。
32e41f4b71Sopenharmony_ci
33e41f4b71Sopenharmony_ci
34e41f4b71Sopenharmony_ci## cl.arkcompiler.2 ArkTS Sendable语法规则编译检查规范化
35e41f4b71Sopenharmony_ci
36e41f4b71Sopenharmony_ci**访问级别**
37e41f4b71Sopenharmony_ci
38e41f4b71Sopenharmony_ci其他
39e41f4b71Sopenharmony_ci
40e41f4b71Sopenharmony_ci**变更原因**
41e41f4b71Sopenharmony_ci
42e41f4b71Sopenharmony_ciAPI 11中ArkTS语言规范首次引入@Sendable装饰器和Sendable class相关概念,但部分Sendable语法约束规则存在编译期未校验等问题。因此在本次版本更新中我们对ArkTS Sendable语法规则在编译期检查作规范化处理,旨在明确Sendable规范定义和限制场景,以更加清晰的规则指导开发者使用ArkTS Sendable特性进行开发。
43e41f4b71Sopenharmony_ci
44e41f4b71Sopenharmony_ci**变更影响**
45e41f4b71Sopenharmony_ci
46e41f4b71Sopenharmony_ci此变更为非兼容变更,本次更新中有如下Sendable语法规则约束新增和变更:
47e41f4b71Sopenharmony_ci
48e41f4b71Sopenharmony_ci#### 规则1. *Sendable class只能继承自Sendable class*
49e41f4b71Sopenharmony_ci
50e41f4b71Sopenharmony_ci现在我们对本规则场景进行完善,当Sendable class继承自变量(即使该变量赋值为Sendable class)时,编译报错。
51e41f4b71Sopenharmony_ci
52e41f4b71Sopenharmony_ci```ts
53e41f4b71Sopenharmony_ci@Sendable
54e41f4b71Sopenharmony_ciclass A {}    // Sendable class
55e41f4b71Sopenharmony_ci
56e41f4b71Sopenharmony_cilet a = A
57e41f4b71Sopenharmony_ci
58e41f4b71Sopenharmony_ci@Sendable
59e41f4b71Sopenharmony_ciclass B extends A {}
60e41f4b71Sopenharmony_ci
61e41f4b71Sopenharmony_ci@Sendable
62e41f4b71Sopenharmony_ciclass C extends a {}    // 编译报错: Sendable class无法继承自变量
63e41f4b71Sopenharmony_ci```
64e41f4b71Sopenharmony_ci
65e41f4b71Sopenharmony_ci影响场景:Sendable class继承自变量场景(即使该变量赋值为Sendable class),在本次更新后将无法通过编译,存在兼容性影响
66e41f4b71Sopenharmony_ci
67e41f4b71Sopenharmony_ci---
68e41f4b71Sopenharmony_ci
69e41f4b71Sopenharmony_ci#### 规则2. *Non-sendable class只能继承自Non-sendable class*
70e41f4b71Sopenharmony_ci
71e41f4b71Sopenharmony_ci当Non-sendable class继承自Sendable class时,编译报错。
72e41f4b71Sopenharmony_ci
73e41f4b71Sopenharmony_ci```ts
74e41f4b71Sopenharmony_ci@Sendable
75e41f4b71Sopenharmony_ciclass A {}
76e41f4b71Sopenharmony_ci
77e41f4b71Sopenharmony_ciclass B extends A {}    // 编译报错: Non-sendable class无法继承自Sendable class
78e41f4b71Sopenharmony_ci```
79e41f4b71Sopenharmony_ci
80e41f4b71Sopenharmony_ci影响场景:当Non-sendable class继承自Sendable class时,原本在运行时报错,在本次更新后将无法通过编译,存在兼容性影响
81e41f4b71Sopenharmony_ci
82e41f4b71Sopenharmony_ci---
83e41f4b71Sopenharmony_ci
84e41f4b71Sopenharmony_ci#### 规则3. *泛型类中的Sendable class, collections.Array, collections.Map, collections.Set的模板类型必须是Sendable类型*
85e41f4b71Sopenharmony_ci
86e41f4b71Sopenharmony_ci现在编译期对Sendable类属性使用模板类型不再检查拦截,允许Sendable类属性使用模板类型;同时将检查泛型类在实例化位置的类型,当泛型类中的Sendable class的模板类型是Non-sendable类型时,编译报错。
87e41f4b71Sopenharmony_ci
88e41f4b71Sopenharmony_ci```ts
89e41f4b71Sopenharmony_ci@Sendable
90e41f4b71Sopenharmony_ciclass B {}    // Sendable class
91e41f4b71Sopenharmony_ci
92e41f4b71Sopenharmony_ci@Sendable
93e41f4b71Sopenharmony_ciclass C<T> {
94e41f4b71Sopenharmony_ci  v: T;    // 允许Sendable类属性使用模板类型,不再编译报错
95e41f4b71Sopenharmony_ci  constructor(v: T) {
96e41f4b71Sopenharmony_ci    this.v = v;
97e41f4b71Sopenharmony_ci  }
98e41f4b71Sopenharmony_ci}
99e41f4b71Sopenharmony_ci
100e41f4b71Sopenharmony_cilet c = new C<B>();
101e41f4b71Sopenharmony_ci
102e41f4b71Sopenharmony_cifunction foo(a: C<B>) {}
103e41f4b71Sopenharmony_ci```
104e41f4b71Sopenharmony_ci
105e41f4b71Sopenharmony_ci```ts
106e41f4b71Sopenharmony_ciclass B {}    // Non-sendable class
107e41f4b71Sopenharmony_ci
108e41f4b71Sopenharmony_ci@Sendable
109e41f4b71Sopenharmony_ciclass C<T> {}
110e41f4b71Sopenharmony_ci
111e41f4b71Sopenharmony_cilet c = new C<B>();    // 编译报错:泛型类中的Sendable class的模板类型禁止为Non-sendable类型
112e41f4b71Sopenharmony_ci```
113e41f4b71Sopenharmony_ci
114e41f4b71Sopenharmony_ci影响场景:1. Sendable模板类属性使用模板类型场景,将不再编译报错;2.泛型类中的Sendable class的模板类型为Non-sendable类型的场景,在本次更新后将无法通过编译,存在兼容性影响
115e41f4b71Sopenharmony_ci
116e41f4b71Sopenharmony_ci---
117e41f4b71Sopenharmony_ci
118e41f4b71Sopenharmony_ci#### 规则4. *Sendable class禁止使用其他装饰器(类装饰器、属性装饰、方法装饰器、参数装饰器)*
119e41f4b71Sopenharmony_ci
120e41f4b71Sopenharmony_ci当Sendable class使用其他装饰器时,编译报错
121e41f4b71Sopenharmony_ci
122e41f4b71Sopenharmony_ci```ts
123e41f4b71Sopenharmony_ci// a.ts
124e41f4b71Sopenharmony_ciexport function foo(a: Function) {
125e41f4b71Sopenharmony_ci  a.prototype = String
126e41f4b71Sopenharmony_ci}
127e41f4b71Sopenharmony_ci
128e41f4b71Sopenharmony_ci// b.ets
129e41f4b71Sopenharmony_ciimport { foo } from 'a'
130e41f4b71Sopenharmony_ci
131e41f4b71Sopenharmony_ci@foo
132e41f4b71Sopenharmony_ci@Sendable
133e41f4b71Sopenharmony_ciclass A {}    // 编译报错: Sendable class禁止使用其他装饰器
134e41f4b71Sopenharmony_ci```
135e41f4b71Sopenharmony_ci
136e41f4b71Sopenharmony_ci影响场景:对于Sendable class使用了其他装饰器,在本次更新后将无法通过编译,存在兼容性影响
137e41f4b71Sopenharmony_ci
138e41f4b71Sopenharmony_ci---
139e41f4b71Sopenharmony_ci
140e41f4b71Sopenharmony_ci#### 规则5. *禁止使用对象字面量或数组字面量初始化Sendable类型*
141e41f4b71Sopenharmony_ci
142e41f4b71Sopenharmony_ci现在当使用对象字面量或数组字面量初始化Sendable类型时,编译报错
143e41f4b71Sopenharmony_ci
144e41f4b71Sopenharmony_ci```ts
145e41f4b71Sopenharmony_ci@Sendable
146e41f4b71Sopenharmony_ciclass C {}
147e41f4b71Sopenharmony_ci
148e41f4b71Sopenharmony_cilet c: C = {};    // 编译报错: 禁止使用对象字面量或数组字面量初始化Sendable类型
149e41f4b71Sopenharmony_ci```
150e41f4b71Sopenharmony_ci
151e41f4b71Sopenharmony_ci影响场景:使用对象字面量或数组字面量初始化Sendable类型的变量,在本次更新后将无法通过编译,存在兼容性影响
152e41f4b71Sopenharmony_ci
153e41f4b71Sopenharmony_ci---
154e41f4b71Sopenharmony_ci
155e41f4b71Sopenharmony_ci#### 规则6. *禁止使用as将Non-sendable类型强转成Sendable类型*
156e41f4b71Sopenharmony_ci
157e41f4b71Sopenharmony_ci现在当使用as将Non-sendable类型强转成Sendable类型时,编译报错
158e41f4b71Sopenharmony_ci
159e41f4b71Sopenharmony_ci```ts
160e41f4b71Sopenharmony_ciclass A {}
161e41f4b71Sopenharmony_ci
162e41f4b71Sopenharmony_ci@Sendable
163e41f4b71Sopenharmony_ciclass B {}
164e41f4b71Sopenharmony_ci
165e41f4b71Sopenharmony_cifunction foo(a: A) {
166e41f4b71Sopenharmony_ci  a as B;    // 编译报错: 禁止使用as将Non-sendable类型强转成Sendable类型
167e41f4b71Sopenharmony_ci}
168e41f4b71Sopenharmony_ci```
169e41f4b71Sopenharmony_ci
170e41f4b71Sopenharmony_ci影响场景:强转后的Non-sendable类型的变量,在本次更新后将无法通过编译,存在兼容性影响
171e41f4b71Sopenharmony_ci
172e41f4b71Sopenharmony_ci---
173e41f4b71Sopenharmony_ci
174e41f4b71Sopenharmony_ci
175e41f4b71Sopenharmony_ci**起始 API Level**
176e41f4b71Sopenharmony_ci
177e41f4b71Sopenharmony_ciArkTS语法检查从API 10起启用。
178e41f4b71Sopenharmony_ci
179e41f4b71Sopenharmony_ci**变更发生版本**
180e41f4b71Sopenharmony_ci
181e41f4b71Sopenharmony_ci从OpenHarmony SDK 5.0.0.18 开始。
182e41f4b71Sopenharmony_ci
183e41f4b71Sopenharmony_ci**变更的接口/组件**
184e41f4b71Sopenharmony_ci
185e41f4b71Sopenharmony_ci不涉及。
186e41f4b71Sopenharmony_ci
187e41f4b71Sopenharmony_ci**适配指导**
188e41f4b71Sopenharmony_ci
189e41f4b71Sopenharmony_ci存在上述规则影响场景的ArkTS代码需按照规范要求进行适配修改
190