@@ -35,6 +35,9 @@ class NativeBasicDataBuilder {
3535 /// The JavaScript members implemented via typed JavaScript interop.
3636 final Map <MemberEntity , String > _jsInteropMembers = {};
3737
38+ /// The JavaScript interop members annotated with `@ObjectLiteral` .
39+ final Set <MemberEntity > _jsInteropObjectLiterals = {};
40+
3841 /// Sets the native tag info for [cls] .
3942 ///
4043 /// The tag info string contains comma-separated 'words' which are either
@@ -99,14 +102,16 @@ class NativeBasicDataBuilder {
99102
100103 /// Marks [element] as an explicit part of js interop and sets the explicit js
101104 /// interop [name] for the member [element] .
102- void markAsJsInteropMember (MemberEntity element, String name) {
105+ void markAsJsInteropMember (MemberEntity element, String name,
106+ {required bool isJsInteropObjectLiteral}) {
103107 assert (
104108 ! _closed,
105109 failedAt (
106110 element,
107111 "NativeBasicDataBuilder is closed. "
108112 "Trying to mark $element as a js-interop member." ));
109113 _jsInteropMembers[element] = name;
114+ if (isJsInteropObjectLiteral) _jsInteropObjectLiterals.add (element);
110115 }
111116
112117 /// Creates the [NativeBasicData] object for the data collected in this
@@ -120,7 +125,8 @@ class NativeBasicDataBuilder {
120125 _jsInteropLibraries,
121126 _jsInteropClasses,
122127 _anonymousJsInteropClasses,
123- _jsInteropMembers);
128+ _jsInteropMembers,
129+ _jsInteropObjectLiterals);
124130 }
125131
126132 void reopenForTesting () {
@@ -156,14 +162,18 @@ class NativeBasicData {
156162 /// The JavaScript members implemented via typed JavaScript interop.
157163 final Map <MemberEntity , String ?> _jsInteropMembers;
158164
165+ /// JavaScript interop constructors annotated with `@ObjectLiteral` .
166+ final Set <MemberEntity > _jsInteropObjectLiterals;
167+
159168 NativeBasicData (
160169 this ._env,
161170 this ._isAllowInteropUsed,
162171 this ._nativeClassTagInfo,
163172 this ._jsInteropLibraries,
164173 this ._jsInteropClasses,
165174 this ._anonymousJsInteropClasses,
166- this ._jsInteropMembers);
175+ this ._jsInteropMembers,
176+ this ._jsInteropObjectLiterals);
167177
168178 factory NativeBasicData .fromIr (
169179 KernelToElementMap map, IrAnnotationData data) {
@@ -173,6 +183,7 @@ class NativeBasicData {
173183 Map <ClassEntity , String > jsInteropClasses = {};
174184 Set <ClassEntity > anonymousJsInteropClasses = {};
175185 Map <MemberEntity , String ?> jsInteropMembers = {};
186+ Set <MemberEntity > jsInteropObjectLiterals = {};
176187
177188 data.forEachNativeClass ((ir.Class node, String text) {
178189 nativeClassTagInfo[map.getClass (node)] = NativeClassTag (text);
@@ -189,17 +200,27 @@ class NativeBasicData {
189200 anonymousJsInteropClasses.add (cls);
190201 }
191202 });
192- data.forEachJsInteropMember ((ir.Member node, String ? name) {
203+ data.forEachJsInteropMember ((ir.Member node, String ? name,
204+ {required bool isJsInteropObjectLiteral}) {
193205 // TODO(49428): Are there other members that we should ignore here?
194206 // There are non-external and unannotated members because the source code
195207 // doesn't contain them. (e.g. default constructor) Does it make sense to
196208 // consider these valid JS members?
197209 if (memberIsIgnorable (node)) return ;
198210 jsInteropMembers[map.getMember (node)] = name;
211+ if (isJsInteropObjectLiteral)
212+ jsInteropObjectLiterals.add (map.getMember (node));
199213 });
200214
201- return NativeBasicData (env, false , nativeClassTagInfo, jsInteropLibraries,
202- jsInteropClasses, anonymousJsInteropClasses, jsInteropMembers);
215+ return NativeBasicData (
216+ env,
217+ false ,
218+ nativeClassTagInfo,
219+ jsInteropLibraries,
220+ jsInteropClasses,
221+ anonymousJsInteropClasses,
222+ jsInteropMembers,
223+ jsInteropObjectLiterals);
203224 }
204225
205226 /// Deserializes a [NativeBasicData] object from [source] .
@@ -220,6 +241,7 @@ class NativeBasicData {
220241 Set <ClassEntity > anonymousJsInteropClasses = source.readClasses ().toSet ();
221242 Map <MemberEntity , String ?> jsInteropMembers = source
222243 .readMemberMap ((MemberEntity member) => source.readStringOrNull ());
244+ Set <MemberEntity > jsInteropObjectLiterals = source.readMembers ().toSet ();
223245 source.end (tag);
224246 return NativeBasicData (
225247 elementEnvironment,
@@ -228,7 +250,8 @@ class NativeBasicData {
228250 jsInteropLibraries,
229251 jsInteropClasses,
230252 anonymousJsInteropClasses,
231- jsInteropMembers);
253+ jsInteropMembers,
254+ jsInteropObjectLiterals);
232255 }
233256
234257 /// Serializes this [NativeBasicData] to [sink] .
@@ -244,6 +267,7 @@ class NativeBasicData {
244267 sink.writeClasses (_anonymousJsInteropClasses);
245268 sink.writeMemberMap (_jsInteropMembers,
246269 (MemberEntity member, String ? name) => sink.writeStringOrNull (name));
270+ sink.writeMembers (_jsInteropObjectLiterals);
247271 sink.end (tag);
248272 }
249273
@@ -348,14 +372,17 @@ class NativeBasicData {
348372 map.toBackendClassSet (_anonymousJsInteropClasses);
349373 Map <MemberEntity , String ?> jsInteropMembers =
350374 map.toBackendMemberMap (_jsInteropMembers, identity);
375+ Set <MemberEntity > jsInteropObjectLiterals =
376+ map.toBackendMemberSet (_jsInteropObjectLiterals);
351377 return NativeBasicData (
352378 environment,
353379 isAllowInteropUsed,
354380 nativeClassTagInfo,
355381 jsInteropLibraries,
356382 jsInteropClasses,
357383 anonymousJsInteropClasses,
358- jsInteropMembers);
384+ jsInteropMembers,
385+ jsInteropObjectLiterals);
359386 }
360387}
361388
@@ -569,11 +596,20 @@ class NativeData implements NativeBasicData {
569596 Map <MemberEntity , String ?> get _jsInteropMembers =>
570597 _nativeBasicData._jsInteropMembers;
571598
599+ @override
600+ Set <MemberEntity > get _jsInteropObjectLiterals =>
601+ _nativeBasicData._jsInteropObjectLiterals;
602+
572603 /// Returns `true` if [element] has an `@Anonymous` annotation.
573604 bool isAnonymousJsInteropClass (ClassEntity element) {
574605 return _anonymousJsInteropClasses.contains (element);
575606 }
576607
608+ /// Returns `true` if [element] has an `@ObjectLiteral` annotation.
609+ bool isJsInteropObjectLiteral (MemberEntity element) {
610+ return _jsInteropObjectLiterals.contains (element);
611+ }
612+
577613 @override
578614 bool isNativeClass (ClassEntity element) =>
579615 _nativeBasicData.isNativeClass (element);
0 commit comments