Skip to content

Commit d1a949a

Browse files
srujzsCommit Queue
authored and
Commit Queue
committed
Add static tests for external extension members on extension types
We have tests for whether external extension members are allowed on certain classes, but not extension types. Also rewords the error to be more accurate. Change-Id: I61c1fa4c101971986b6c8e7cc778aca94908816a Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/358380 Reviewed-by: Sigmund Cherem <[email protected]> Commit-Queue: Srujan Gaddam <[email protected]>
1 parent 1232260 commit d1a949a

File tree

5 files changed

+90
-33
lines changed

5 files changed

+90
-33
lines changed

pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10406,9 +10406,9 @@ const MessageCode messageJsInteropExternalExtensionMemberOnTypeInvalid =
1040610406
const MessageCode(
1040710407
"JsInteropExternalExtensionMemberOnTypeInvalid",
1040810408
problemMessage:
10409-
r"""JS interop or Native class required for 'external' extension members.""",
10409+
r"""JS interop type or @Native type from an SDK web library required for 'external' extension members.""",
1041010410
correctionMessage:
10411-
r"""Try adding a JS interop annotation to the on type class of the extension.""",
10411+
r"""Try making the on-type a JS interop type or an @Native SDK web library type.""",
1041210412
);
1041310413

1041410414
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.

pkg/front_end/messages.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5870,8 +5870,8 @@ JsInteropExtensionTypeUsedWithWrongJsAnnotation:
58705870
correctionMessage: "Try using the '@JS' annotation from 'dart:js_interop' annotation on this extension type instead."
58715871

58725872
JsInteropExternalExtensionMemberOnTypeInvalid:
5873-
problemMessage: "JS interop or Native class required for 'external' extension members."
5874-
correctionMessage: "Try adding a JS interop annotation to the on type class of the extension."
5873+
problemMessage: "JS interop type or @Native type from an SDK web library required for 'external' extension members."
5874+
correctionMessage: "Try making the on-type a JS interop type or an @Native SDK web library type."
58755875

58765876
JsInteropExternalExtensionMemberWithStaticDisallowed:
58775877
problemMessage: "External extension members with the keyword 'static' on JS interop and @Native types are disallowed."

tests/lib/js/external_nonjs_static_test.dart

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -102,43 +102,43 @@ class AnonymousClass {
102102
extension ExtensionNonJS on NonJSClass {
103103
external var field;
104104
// ^
105-
// [web] JS interop or Native class required for 'external' extension members.
105+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
106106
external final finalField;
107107
// ^
108-
// [web] JS interop or Native class required for 'external' extension members.
108+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
109109
external static var staticField;
110110
// ^
111-
// [web] JS interop or Native class required for 'external' extension members.
111+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
112112
external static final staticFinalField;
113113
// ^
114-
// [web] JS interop or Native class required for 'external' extension members.
114+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
115115

116116
external get getter;
117117
// ^
118-
// [web] JS interop or Native class required for 'external' extension members.
118+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
119119
external set setter(_);
120120
// ^
121-
// [web] JS interop or Native class required for 'external' extension members.
121+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
122122

123123
external static get staticGetter;
124124
// ^
125-
// [web] JS interop or Native class required for 'external' extension members.
125+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
126126
external static set staticSetter(_);
127127
// ^
128-
// [web] JS interop or Native class required for 'external' extension members.
128+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
129129

130130
external method();
131131
// ^
132-
// [web] JS interop or Native class required for 'external' extension members.
132+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
133133
external static staticMethod();
134134
// ^
135-
// [web] JS interop or Native class required for 'external' extension members.
135+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
136136
external optionalParameterMethod([int? a, int b = 0]);
137137
// ^
138-
// [web] JS interop or Native class required for 'external' extension members.
138+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
139139
external overriddenMethod();
140140
// ^
141-
// [web] JS interop or Native class required for 'external' extension members.
141+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
142142

143143
nonExternalMethod() => 1;
144144
static nonExternalStaticMethod() => 2;
@@ -151,7 +151,7 @@ class NonJSClass {
151151
extension ExtensionGenericNonJS<T> on GenericNonJSClass<T> {
152152
external T method();
153153
// ^
154-
// [web] JS interop or Native class required for 'external' extension members.
154+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
155155
}
156156

157157
class GenericNonJSClass<T> {}

tests/lib/js/external_static_test.dart

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -90,52 +90,52 @@ class AnonymousClass {
9090
extension ExtensionNonJS on NonJSClass {
9191
external var field;
9292
// ^
93-
// [web] JS interop or Native class required for 'external' extension members.
93+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
9494
external final finalField;
9595
// ^
96-
// [web] JS interop or Native class required for 'external' extension members.
96+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
9797
external static var staticField;
9898
// ^
99-
// [web] JS interop or Native class required for 'external' extension members.
99+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
100100
external static final staticFinalField;
101101
// ^
102-
// [web] JS interop or Native class required for 'external' extension members.
102+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
103103

104104
external get getter;
105105
// ^
106-
// [web] JS interop or Native class required for 'external' extension members.
106+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
107107
external set setter(_);
108108
// ^
109-
// [web] JS interop or Native class required for 'external' extension members.
109+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
110110

111111
external static get staticGetter;
112112
// ^
113-
// [web] JS interop or Native class required for 'external' extension members.
113+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
114114
external static set staticSetter(_);
115115
// ^
116-
// [web] JS interop or Native class required for 'external' extension members.
116+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
117117

118118
external method();
119119
// ^
120-
// [web] JS interop or Native class required for 'external' extension members.
120+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
121121
external static staticMethod();
122122
// ^
123-
// [web] JS interop or Native class required for 'external' extension members.
123+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
124124
external optionalParameterMethod([int? a, int b = 0]);
125125
// ^
126-
// [web] JS interop or Native class required for 'external' extension members.
126+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
127127
external overriddenMethod();
128128
// ^
129-
// [web] JS interop or Native class required for 'external' extension members.
129+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
130130

131131
@JS('fieldAnnotation')
132132
external var annotatedField;
133133
// ^
134-
// [web] JS interop or Native class required for 'external' extension members.
134+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
135135
@JS('memberAnnotation')
136136
external annotatedMethod();
137137
// ^
138-
// [web] JS interop or Native class required for 'external' extension members.
138+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
139139

140140
nonExternalMethod() => 1;
141141
static nonExternalStaticMethod() => 2;
@@ -148,7 +148,7 @@ class NonJSClass {
148148
extension ExtensionGenericNonJS<T> on GenericNonJSClass<T> {
149149
external T method();
150150
// ^
151-
// [web] JS interop or Native class required for 'external' extension members.
151+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
152152
}
153153

154154
class GenericNonJSClass<T> {}

tests/lib/js/static_interop_test/extension_type/non_interop_extension_type_static_test.dart

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
// Test that interop extension types can only work on interop types.
5+
// Test that interop extension types can only work on interop types and external
6+
// extension members can't be added to non-interop extension types.
67

78
import 'dart:html';
89
import 'dart:js_interop';
@@ -23,13 +24,23 @@ extension type EList._(List<JSAny?> _) {
2324
// [web] Extension type member is marked 'external', but the representation type of its extension type is not a valid JS interop type.
2425
}
2526

27+
extension on EObject {
28+
external int field;
29+
// ^
30+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
31+
}
32+
2633
// dart:js_interop types.
2734

2835
extension type EJSObject(JSObject _) {}
2936

3037
@JS()
3138
extension type EJSString(JSString _) {}
3239

40+
extension on EJSObject {
41+
external int field;
42+
}
43+
3344
// package:js types.
3445

3546
@pkgJs.JS()
@@ -41,6 +52,12 @@ extension type EPkgJs._(PkgJs _) {
4152
// [web] Extension type member is marked 'external', but the representation type of its extension type is not a valid JS interop type.
4253
}
4354

55+
extension on EPkgJs {
56+
external int field;
57+
// ^
58+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
59+
}
60+
4461
@pkgJs.JS()
4562
@anonymous
4663
class Anonymous {}
@@ -54,18 +71,32 @@ extension type EAnonymous._(Anonymous _) {
5471
// [web] Extension type member is marked 'external', but the representation type of its extension type is not a valid JS interop type.
5572
}
5673

74+
extension on EAnonymous {
75+
external int field;
76+
// ^
77+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
78+
}
79+
5780
@pkgJs.JS()
5881
@staticInterop
5982
class PkgJsStaticInterop {}
6083

6184
extension type EPkgJsStaticInterop(PkgJsStaticInterop _) {}
6285

86+
extension on EPkgJsStaticInterop {
87+
external int field;
88+
}
89+
6390
@JS()
6491
@staticInterop
6592
class StaticInterop {}
6693

6794
extension type EStaticInterop(StaticInterop _) {}
6895

96+
extension on EStaticInterop {
97+
external int field;
98+
}
99+
69100
// @Native types.
70101

71102
extension type EWindow(Window _) {}
@@ -84,13 +115,27 @@ extension type EUint32List(Uint32List _) {}
84115
// ^
85116
// [web] Extension type 'EUint32List' is marked with a '@JS' annotation, but its representation type is not a valid JS interop type: 'Uint32List'.
86117

118+
extension on EWindow {
119+
external int field;
120+
}
121+
122+
extension on EUint8List {
123+
external int field;
124+
// ^
125+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
126+
}
127+
87128
// Extension types.
88129

89130
extension type EExtensionType(EJSObject _) {}
90131

91132
@JS()
92133
extension type EExtensionType2(EExtensionType _) {}
93134

135+
extension on EExtensionType {
136+
external int field;
137+
}
138+
94139
@JS()
95140
extension type ENonInterop._(EObject _) {
96141
// ^
@@ -100,6 +145,12 @@ extension type ENonInterop._(EObject _) {
100145
// [web] Extension type member is marked 'external', but the representation type of its extension type is not a valid JS interop type.
101146
}
102147

148+
extension on ENonInterop {
149+
external int field;
150+
// ^
151+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
152+
}
153+
103154
extension type EExternalDartReference._(ExternalDartReference _) {
104155
external EExternalDartReference();
105156
// ^
@@ -110,3 +161,9 @@ extension type EExternalDartReference._(ExternalDartReference _) {
110161
extension type EExternalDartReference2._(ExternalDartReference _) {}
111162
// ^
112163
// [web] Extension type 'EExternalDartReference2' is marked with a '@JS' annotation, but its representation type is not a valid JS interop type: 'ExternalDartReference'.
164+
165+
extension on EExternalDartReference {
166+
external int field;
167+
// ^
168+
// [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
169+
}

0 commit comments

Comments
 (0)