Skip to content

Commit fe4c2c3

Browse files
srujzsCommit Queue
authored andcommitted
[dart2js/ddc] Support '.' in @js renames in extension type and extension members
Fixes #61411 This was previously disallowed for static members in pkg:js classes, but an error was never added for dart:js_interop types. We could add an error, but this is useful for both static and non-static members so users don't have to introduce new top-levels or types just to access a nested member. This also makes it consistent with dart2wasm. Updates some front_end expectations tests as well to test more syntax and renamed members. Change-Id: I690d53d64fedc5869e1bdd9f7cfd86d256d7f75b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/447482 Commit-Queue: Srujan Gaddam <[email protected]> Reviewed-by: Johnni Winther <[email protected]> Reviewed-by: Ömer Ağacan <[email protected]> Reviewed-by: Stephen Adams <[email protected]>
1 parent 8b98f2b commit fe4c2c3

31 files changed

+4188
-938
lines changed

pkg/_js_interop_checks/lib/js_interop_checks.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -436,10 +436,11 @@ class JsInteropChecks extends RecursiveVisitor {
436436
_checkNoNamedParameters(node.function);
437437
}
438438

439-
// JS static methods cannot use a JS name with dots.
439+
// `package:js` JS static methods cannot use a JS name with dots.
440440
if (node.isStatic &&
441441
node.enclosingClass != null &&
442-
getJSName(node).contains('.')) {
442+
getJSName(node).contains('.') &&
443+
!hasDartJSInteropAnnotation(node.enclosingClass!)) {
443444
report(codeJsInteropInvalidStaticClassMemberName);
444445
}
445446

pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart

Lines changed: 133 additions & 99 deletions
Large diffs are not rendered by default.

pkg/front_end/test/spell_checking_list_tests.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -766,6 +766,8 @@ series
766766
services
767767
setups
768768
severe
769+
sf
770+
sg
769771
sharp
770772
sheets
771773
shipped
@@ -783,6 +785,7 @@ slashes
783785
sleep
784786
slight
785787
sliver
788+
sm
786789
smoke
787790
snull
788791
somehow

pkg/front_end/testcases/dart2js/extension_types/external.dart

Lines changed: 134 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,47 @@ library static_interop;
88
import 'dart:js_interop';
99

1010
@JS()
11-
@staticInterop
12-
class A {}
13-
14-
@JS()
15-
extension type B._(A a) {
16-
external B(A a);
11+
extension type B._(JSObject a) implements JSObject {
12+
// Constructors.
13+
external B(JSObject a);
1714

1815
external B.named(int i);
1916

20-
external A field;
17+
external factory B.factory(JSObject a);
18+
19+
external factory B.namedParams({JSObject a});
20+
21+
// Non-static fields.
22+
external JSObject field;
23+
24+
external final JSObject finalField;
25+
26+
@JS('renamedF')
27+
external JSObject renamedField;
28+
29+
@JS('renamedF1.F2')
30+
external JSObject renamedField2;
31+
32+
@JS('renamedF1.F2.F3')
33+
external JSObject renamedField3;
34+
35+
// Non-static methods.
36+
external JSObject method();
37+
38+
@JS('renamedM')
39+
external JSObject renamedMethod();
40+
41+
@JS('renamedM1.M2')
42+
external JSObject renamedMethod2();
2143

22-
external A method();
44+
@JS('renamedM1.M2.M3')
45+
external JSObject renamedMethod3();
2346

2447
external T genericMethod<T extends B>(T t);
2548

49+
external B methodWithOptionalArgument([B? b]);
50+
51+
// Non-static getters and setters.
2652
external B get getter;
2753

2854
external void set setter(B b);
@@ -31,12 +57,51 @@ extension type B._(A a) {
3157

3258
external void set property(B b);
3359

34-
external static A staticField;
60+
@JS('renamedG')
61+
external B get renamedGetter;
62+
63+
@JS('renamedG1.G2')
64+
external B get renamedGetter2;
65+
66+
@JS('renamedG1.G2.G3')
67+
external B get renamedGetter3;
68+
69+
@JS('renamedS')
70+
external void set renamedSetter(B b);
71+
72+
@JS('renamedS1.S2')
73+
external void set renamedSetter2(B b);
74+
75+
@JS('renamedS1.S2.S3')
76+
external void set renamedSetter3(B b);
77+
78+
// Static fields.
79+
external static JSObject staticField;
80+
81+
@JS('renamedSF')
82+
external static JSObject renamedStaticField;
83+
84+
@JS('renamedSF1.SF2')
85+
external static JSObject renamedStaticField2;
3586

36-
external static A staticMethod();
87+
@JS('renamedSF1.SF2.SF3')
88+
external static JSObject renamedStaticField3;
89+
90+
// Static methods.
91+
external static JSObject staticMethod();
92+
93+
@JS('renamedSM')
94+
external static JSObject renamedStaticMethod();
95+
96+
@JS('renamedSM1.SM2')
97+
external static JSObject renamedStaticMethod2();
98+
99+
@JS('renamedSM1.SM2.SM3')
100+
external static JSObject renamedStaticMethod3();
37101

38102
external static T staticGenericMethod<T extends B>(T t);
39103

104+
// Static getters and setters.
40105
external static B get staticGetter;
41106

42107
external static void set staticSetter(B b);
@@ -45,26 +110,81 @@ extension type B._(A a) {
45110

46111
external static void set staticProperty(B b);
47112

48-
external B methodWithOptionalArgument([B? b]);
113+
@JS('renamedSG')
114+
external static B get renamedStaticGetter;
115+
116+
@JS('renamedSG1.SG2')
117+
external static B get renamedStaticGetter2;
118+
119+
@JS('renamedSG1.SG2.SG3')
120+
external static B get renamedStaticGetter3;
121+
122+
@JS('renamedSS')
123+
external static void set renamedStaticSetter(B b);
124+
125+
@JS('renamedSS1.SS2')
126+
external static void set renamedStaticSetter2(B b);
127+
128+
@JS('renamedSS1.SS2.SS3')
129+
external static void set renamedStaticSetter3(B b);
49130
}
50131

51-
void method(A a) {
132+
void method(JSObject a) {
52133
B b1 = new B(a);
53134
B b2 = new B.named(0);
135+
B b3 = B.factory(b2);
136+
B b4 = B.namedParams(a: a);
137+
54138
a = b1.field;
55139
b1.field = a;
140+
a = b1.finalField;
141+
a = b1.renamedField;
142+
a = b1.renamedField2;
143+
a = b1.renamedField3;
144+
b1.renamedField = a;
145+
b1.renamedField2 = a;
146+
b1.renamedField3 = a;
147+
56148
a = b1.method();
149+
a = b1.renamedMethod();
150+
a = b1.renamedMethod2();
151+
a = b1.renamedMethod3();
57152
b2 = b2.genericMethod(b2);
153+
b2 = b1.methodWithOptionalArgument(b2);
154+
b1 = b2.methodWithOptionalArgument();
155+
58156
b1 = b2.getter;
59157
b1.setter = b2;
60158
b1.property = b2.property;
159+
b1 = b2.renamedGetter;
160+
b1 = b2.renamedGetter2;
161+
b1 = b2.renamedGetter3;
162+
b1.renamedSetter = b2;
163+
b1.renamedSetter2 = b2;
164+
b1.renamedSetter3 = b2;
165+
61166
a = B.staticField;
62167
B.staticField = a;
168+
a = B.renamedStaticField;
169+
a = B.renamedStaticField2;
170+
a = B.renamedStaticField3;
171+
B.renamedStaticField = a;
172+
B.renamedStaticField2 = a;
173+
B.renamedStaticField3 = a;
174+
63175
a = B.staticMethod();
176+
B.renamedStaticMethod();
177+
B.renamedStaticMethod2();
178+
B.renamedStaticMethod3();
64179
b2 = B.staticGenericMethod(b2);
180+
65181
b1 = B.staticGetter;
66182
B.staticSetter = b2;
67183
B.staticProperty = B.staticProperty;
68-
b2 = b1.methodWithOptionalArgument(b2);
69-
b1 = b2.methodWithOptionalArgument();
184+
b1 = B.renamedStaticGetter;
185+
b1 = B.renamedStaticGetter2;
186+
b1 = B.renamedStaticGetter3;
187+
B.renamedStaticSetter = b2;
188+
B.renamedStaticSetter2 = b2;
189+
B.renamedStaticSetter3 = b2;
70190
}

0 commit comments

Comments
 (0)