2
2
// for details. All rights reserved. Use of this source code is governed by a
3
3
// BSD-style license that can be found in the LICENSE file.
4
4
5
- // @dart = 2.10
6
-
7
5
library js_backend.interceptor_data;
8
6
9
7
import '../common/elements.dart'
@@ -176,18 +174,13 @@ class InterceptorDataImpl implements InterceptorData {
176
174
177
175
@override
178
176
bool isInterceptedMixinSelector (
179
- Selector selector, AbstractValue mask, JClosedWorld closedWorld) {
180
- Set <MemberEntity > elements =
181
- _interceptedMixinElements.putIfAbsent (selector.name, () {
182
- Set <MemberEntity > elements = interceptedMembers[selector.name];
183
- if (elements == null ) return null ;
184
- return elements
185
- .where ((element) => classesMixedIntoInterceptedClasses
186
- .contains (element.enclosingClass))
187
- .toSet ();
188
- });
189
-
190
- if (elements == null ) return false ;
177
+ Selector selector, AbstractValue ? mask, JClosedWorld closedWorld) {
178
+ Set <MemberEntity > elements = _interceptedMixinElements[selector.name] ?? =
179
+ (interceptedMembers[selector.name]
180
+ ? .where ((element) => classesMixedIntoInterceptedClasses
181
+ .contains (element.enclosingClass))
182
+ .toSet () ??
183
+ const {});
191
184
if (elements.isEmpty) return false ;
192
185
return elements.any ((element) {
193
186
return selector.applies (element) &&
@@ -216,21 +209,21 @@ class InterceptorDataImpl implements InterceptorData {
216
209
@override
217
210
Set <ClassEntity > getInterceptedClassesOn (
218
211
String name, JClosedWorld closedWorld) {
219
- Set < MemberEntity > intercepted = interceptedMembers[name];
212
+ final intercepted = interceptedMembers[name];
220
213
if (intercepted == null ) return _noClasses;
221
214
return _interceptedClassesCache.putIfAbsent (name, () {
222
215
// Populate the cache by running through all the elements and
223
216
// determine if the given selector applies to them.
224
217
Set <ClassEntity > result = {};
225
218
for (MemberEntity element in intercepted) {
226
- ClassEntity classElement = element.enclosingClass;
219
+ final classElement = element.enclosingClass! ;
227
220
if (_isCompileTimeOnlyClass (classElement)) continue ;
228
221
if (_nativeData.isNativeOrExtendsNative (classElement) ||
229
222
interceptedClasses.contains (classElement)) {
230
223
result.add (classElement);
231
224
}
232
225
if (classesMixedIntoInterceptedClasses.contains (classElement)) {
233
- Set < ClassEntity > nativeSubclasses =
226
+ final nativeSubclasses =
234
227
nativeSubclassesOfMixin (classElement, closedWorld);
235
228
if (nativeSubclasses != null ) result.addAll (nativeSubclasses);
236
229
}
@@ -239,16 +232,15 @@ class InterceptorDataImpl implements InterceptorData {
239
232
});
240
233
}
241
234
242
- Set <ClassEntity > nativeSubclassesOfMixin (
235
+ Set <ClassEntity >? nativeSubclassesOfMixin (
243
236
ClassEntity mixin , JClosedWorld closedWorld) {
244
237
Iterable <ClassEntity > uses = closedWorld.mixinUsesOf (mixin );
245
- Set <ClassEntity > result = null ;
238
+ Set <ClassEntity >? result;
246
239
for (ClassEntity use in uses) {
247
240
closedWorld.classHierarchy.forEachStrictSubclassOf (use,
248
241
(ClassEntity subclass) {
249
242
if (_nativeData.isNativeOrExtendsNative (subclass)) {
250
- if (result == null ) result = {};
251
- result.add (subclass);
243
+ (result ?? = {}).add (subclass);
252
244
}
253
245
return IterationStep .CONTINUE ;
254
246
});
@@ -257,7 +249,7 @@ class InterceptorDataImpl implements InterceptorData {
257
249
}
258
250
259
251
@override
260
- bool isInterceptedClass (ClassEntity element) {
252
+ bool isInterceptedClass (ClassEntity ? element) {
261
253
if (element == null ) return false ;
262
254
if (_nativeData.isNativeOrExtendsNative (element)) return true ;
263
255
if (interceptedClasses.contains (element)) return true ;
@@ -276,7 +268,7 @@ class InterceptorDataImpl implements InterceptorData {
276
268
277
269
if (! closedWorld.dartTypes.treatAsRawType (type)) return false ;
278
270
if (type is FutureOrType ) return false ;
279
- InterfaceType interfaceType = type;
271
+ final interfaceType = type as InterfaceType ;
280
272
ClassEntity classElement = interfaceType.element;
281
273
if (isInterceptedClass (classElement)) return false ;
282
274
return closedWorld.classHierarchy.hasOnlySubclasses (classElement);
@@ -321,7 +313,7 @@ class InterceptorDataBuilderImpl implements InterceptorDataBuilder {
321
313
if (member.name == Identifiers .call) return ;
322
314
// All methods on [Object] are shadowed by [Interceptor].
323
315
if (cls == _commonElements.objectClass) return ;
324
- Set < MemberEntity > set = _interceptedElements[member.name] ?? = {};
316
+ final set = _interceptedElements[member.name! ] ?? = {};
325
317
set .add (member);
326
318
});
327
319
@@ -338,7 +330,7 @@ class InterceptorDataBuilderImpl implements InterceptorDataBuilder {
338
330
(ClassEntity cls, MemberEntity member) {
339
331
// All methods on [Object] are shadowed by [Interceptor].
340
332
if (cls == _commonElements.objectClass) return ;
341
- Set < MemberEntity > set = _interceptedElements[member.name] ?? = {};
333
+ final set = _interceptedElements[member.name! ] ?? = {};
342
334
set .add (member);
343
335
});
344
336
}
@@ -391,7 +383,7 @@ class OneShotInterceptorData {
391
383
return namer.nameForOneShotInterceptor (selector, classes);
392
384
}
393
385
394
- void registerSpecializedGetInterceptor (Set <ClassEntity > classes) {
386
+ void registerSpecializedGetInterceptor (Iterable <ClassEntity > classes) {
395
387
if (classes.contains (_commonElements.jsInterceptorClass)) {
396
388
// We can't use a specialized [getInterceptorMethod], so we make
397
389
// sure we emit the one with all checks.
0 commit comments