1/*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16import { 
17  sendableClassA,
18  sendableVar,
19  nonSendableClassB,
20  nonSendableVar,
21  sendableInterface,
22  nonSendableInterface,
23  lang,
24} from './@arkts.lang';
25
26// sendable class
27@Sendable
28class localSendableClassA {}
29
30// sendable class var
31let localSendableVar = localSendableClassA
32
33
34// non-sendable class
35class localNonSendableClassB {}
36
37// non-sendable class var
38let localNonSendableVar = localNonSendableClassB
39
40// sendable interface
41interface localSendableInterface extends lang.ISendable {}
42
43// non-sendable interface
44interface localNonSendableInterface {}
45
46// sendable interface type alias
47type localSendableInterfaceAlias = localSendableInterface
48
49// non-sendable interface type alias
50type localNonSendableInterfaceAlias = localNonSendableInterface
51
52// left: sendable class
53
54// class + class
55
56// case1: extends import var
57// == case1.1: extends sendable
58@Sendable
59class sendableClass1 extends sendableVar {} // ERROR
60
61// == case1.2: extends non-sendable
62@Sendable
63class sendableClass2 extends nonSendableVar {} // ERROR
64
65// case2: extends local var
66// == case2.1: extends sendable
67@Sendable
68class sendableClass3 extends localSendableVar {} // ERROR
69
70// == case2.2: extends non-sendable
71@Sendable
72class sendableClass4 extends localNonSendableVar {} // ERROR
73
74// case3: extends import class
75// == case3.1: extends sendable
76@Sendable
77class sendableClass5 extends sendableClassA {} // OK
78
79// == case3.2: extends non-sendable
80@Sendable
81class sendableClass6 extends nonSendableClassB {} // ERROR
82
83// case4: extends local class
84// == case4.1: extends sendable
85@Sendable
86class sendableClass7 extends localSendableClassA {} // OK
87
88// == case4.2: extends non-sendable
89@Sendable
90class sendableClass8 extends localNonSendableClassB {} // ERROR
91
92// class + interface
93
94// case1: implements local interface
95// == case1.1: implements sendable
96@Sendable
97class sendableClass9 implements localSendableInterface {} // OK
98
99// == case1.2: implements non-sendable
100@Sendable
101class sendableClass10 implements localNonSendableInterface {} // OK
102
103// case2: implements import interface
104// == case2.1: implements sendable
105@Sendable
106class sendableClass11 implements sendableInterface {} // OK
107
108// == case2.2: implements non-sendable
109@Sendable
110class sendableClass12 implements nonSendableInterface {} // OK
111
112// case3: implements type alias
113// == case3.1: implements sendable
114@Sendable
115class sendableClass13 implements localSendableInterfaceAlias {} // OK
116
117// == case3.2: implements non-sendable
118@Sendable
119class sendableClass14 implements localNonSendableInterfaceAlias {} // OK
120
121// left: non sendable class
122
123// case1: extends import var
124// == case1.1: extends sendable
125class sendableClass15 extends sendableVar {} // ERROR
126
127// == case1.2: extends non-sendable
128class sendableClass16 extends nonSendableVar {} // OK
129
130// case2: extends local var
131// == case2.1: extends sendable
132class sendableClass17 extends localSendableVar {} // ERROR
133
134// == case2.2: extends non-sendable
135class sendableClass18 extends localNonSendableVar {} // OK
136
137// case3: extends import class
138// == case3.1: extends sendable
139class sendableClass19 extends sendableClassA {} // ERROR
140
141// == case3.2: extends non-sendable
142class sendableClass20 extends nonSendableClassB {} // OK
143
144// case4: extends local class
145// == case4.1: extends sendable
146class sendableClass21 extends localSendableClassA {} // ERROR
147
148// == case4.2: extends non-sendable
149class sendableClass22 extends localNonSendableClassB {} // OK
150
151// class + interface
152
153// case1: implements local interface
154// == case1.1: implements sendable
155class sendableClass23 implements localSendableInterface {} // ERROR
156
157// == case1.2: implements non-sendable
158class sendableClass24 implements localNonSendableInterface {} // OK
159
160// case2: implements import interface
161// == case2.1: implements sendable
162class sendableClass25 implements sendableInterface {} // ERROR
163
164// == case2.2: implements non-sendable
165class sendableClass26 implements nonSendableInterface {} // OK
166
167// case3: implements type alias
168// == case4.1: implements sendable
169class sendableClass27 implements localSendableInterfaceAlias {} // ERROR
170
171// == case4.2: implements non-sendable
172class sendableClass28 implements localNonSendableInterfaceAlias {} // OK
173
174// ISendable created by developer is not a sendable interface
175
176interface ISendable {}
177
178interface fakeSendableInterface extends ISendable {}
179
180// fake sendable interface type alias
181type fakeSendableInterfaceAlias = fakeSendableInterface
182
183class sendableClass29 implements fakeSendableInterface {} // OK
184
185class sendableClass30 implements fakeSendableInterfaceAlias {} // OK