@@ -179,14 +179,14 @@ abstract class DeferredLoadTask extends CompilerTask {
179
179
///
180
180
/// The collected dependent elements and constants are are added to
181
181
/// [elements] and [constants] respectively.
182
- void _collectDirectMemberDependencies (
182
+ void _collectDirectMemberDependencies (KClosedWorld closedWorld,
183
183
MemberEntity element, Dependencies dependencies) {
184
184
// TODO(sigurdm): We want to be more specific about this - need a better
185
185
// way to query "liveness".
186
186
if (! compiler.resolutionWorldBuilder.isMemberUsed (element)) {
187
187
return ;
188
188
}
189
- _collectDependenciesFromImpact (element, dependencies);
189
+ _collectDependenciesFromImpact (closedWorld, element, dependencies);
190
190
collectConstantsInBody (element, dependencies);
191
191
}
192
192
@@ -195,15 +195,17 @@ abstract class DeferredLoadTask extends CompilerTask {
195
195
///
196
196
/// Adds the results to [elements] and [constants] .
197
197
void _collectAllElementsAndConstantsResolvedFromClass (
198
- ClassEntity element, Dependencies dependencies) {
198
+ KClosedWorld closedWorld,
199
+ ClassEntity element,
200
+ Dependencies dependencies) {
199
201
// If we see a class, add everything its live instance members refer
200
202
// to. Static members are not relevant, unless we are processing
201
203
// extra dependencies due to mirrors.
202
204
void addLiveInstanceMember (MemberEntity member) {
203
205
if (! compiler.resolutionWorldBuilder.isMemberUsed (member)) return ;
204
206
if (! member.isInstanceMember) return ;
205
207
dependencies.addMember (member);
206
- _collectDirectMemberDependencies (member, dependencies);
208
+ _collectDirectMemberDependencies (closedWorld, member, dependencies);
207
209
}
208
210
209
211
ClassEntity cls = element;
@@ -219,21 +221,24 @@ abstract class DeferredLoadTask extends CompilerTask {
219
221
///
220
222
/// Adds the results to [elements] and [constants] .
221
223
void _collectAllElementsAndConstantsResolvedFromMember (
222
- MemberEntity element, Dependencies dependencies) {
224
+ KClosedWorld closedWorld,
225
+ MemberEntity element,
226
+ Dependencies dependencies) {
223
227
if (element is FunctionEntity ) {
224
228
_collectTypeDependencies (
225
229
elementEnvironment.getFunctionType (element), dependencies);
226
230
}
227
231
if (element.isStatic || element.isTopLevel || element.isConstructor) {
228
232
dependencies.addMember (element);
229
- _collectDirectMemberDependencies (element, dependencies);
233
+ _collectDirectMemberDependencies (closedWorld, element, dependencies);
230
234
}
231
235
if (element is ConstructorEntity && element.isGenerativeConstructor) {
232
236
// When instantiating a class, we record a reference to the
233
237
// constructor, not the class itself. We must add all the
234
238
// instance members of the constructor's class.
235
239
ClassEntity cls = element.enclosingClass;
236
- _collectAllElementsAndConstantsResolvedFromClass (cls, dependencies);
240
+ _collectAllElementsAndConstantsResolvedFromClass (
241
+ closedWorld, cls, dependencies);
237
242
}
238
243
239
244
// Other elements, in particular instance members, are ignored as
@@ -265,13 +270,14 @@ abstract class DeferredLoadTask extends CompilerTask {
265
270
}
266
271
267
272
/// Extract any dependencies that are known from the impact of [element] .
268
- void _collectDependenciesFromImpact (
273
+ void _collectDependenciesFromImpact (KClosedWorld closedWorld,
269
274
MemberEntity element, Dependencies dependencies) {
270
275
WorldImpact worldImpact = compiler.impactCache[element];
271
276
compiler.impactStrategy.visitImpact (
272
277
element,
273
278
worldImpact,
274
- new WorldImpactVisitorImpl (visitStaticUse: (StaticUse staticUse) {
279
+ new WorldImpactVisitorImpl (
280
+ visitStaticUse: (MemberEntity member, StaticUse staticUse) {
275
281
Entity usedEntity = staticUse.element;
276
282
if (usedEntity is MemberEntity ) {
277
283
dependencies.addMember (usedEntity, staticUse.deferredImport);
@@ -306,7 +312,7 @@ abstract class DeferredLoadTask extends CompilerTask {
306
312
break ;
307
313
default :
308
314
}
309
- }, visitTypeUse: (TypeUse typeUse) {
315
+ }, visitTypeUse: (MemberEntity member, TypeUse typeUse) {
310
316
DartType type = typeUse.type;
311
317
switch (typeUse.kind) {
312
318
case TypeUseKind .TYPE_LITERAL :
@@ -327,17 +333,21 @@ abstract class DeferredLoadTask extends CompilerTask {
327
333
_collectTypeDependencies (type, dependencies);
328
334
break ;
329
335
case TypeUseKind .AS_CAST :
330
- if (! compiler.options .omitAsCasts) {
336
+ if (! closedWorld.annotationsData .omitAsCasts (element) ) {
331
337
_collectTypeDependencies (type, dependencies);
332
338
}
333
339
break ;
334
340
case TypeUseKind .IMPLICIT_CAST :
335
- if (compiler.options.implicitDowncastCheckPolicy.isEmitted) {
341
+ if (closedWorld.annotationsData
342
+ .getImplicitDowncastCheckPolicy (element)
343
+ .isEmitted) {
336
344
_collectTypeDependencies (type, dependencies);
337
345
}
338
346
break ;
339
347
case TypeUseKind .PARAMETER_CHECK :
340
- if (compiler.options.parameterCheckPolicy.isEmitted) {
348
+ if (closedWorld.annotationsData
349
+ .getParameterCheckPolicy (element)
350
+ .isEmitted) {
341
351
_collectTypeDependencies (type, dependencies);
342
352
}
343
353
break ;
@@ -346,7 +356,7 @@ abstract class DeferredLoadTask extends CompilerTask {
346
356
failedAt (element, "Unexpected type use: $typeUse ." );
347
357
break ;
348
358
}
349
- }, visitDynamicUse: (DynamicUse dynamicUse) {
359
+ }, visitDynamicUse: (MemberEntity member, DynamicUse dynamicUse) {
350
360
// TODO(johnniwinther): Use rti need data to skip unneeded type
351
361
// arguments.
352
362
_collectTypeArgumentDependencies (
@@ -360,8 +370,12 @@ abstract class DeferredLoadTask extends CompilerTask {
360
370
/// import set, we stop and enqueue a new recursive update in [queue] .
361
371
///
362
372
/// Invariants: oldSet is either null or a subset of newSet.
363
- void _updateConstantRecursive (ConstantValue constant, ImportSet oldSet,
364
- ImportSet newSet, WorkQueue queue) {
373
+ void _updateConstantRecursive (
374
+ KClosedWorld closedWorld,
375
+ ConstantValue constant,
376
+ ImportSet oldSet,
377
+ ImportSet newSet,
378
+ WorkQueue queue) {
365
379
if (constant == null ) return ;
366
380
var currentSet = _constantToSet[constant];
367
381
@@ -375,19 +389,21 @@ abstract class DeferredLoadTask extends CompilerTask {
375
389
_constantToSet[constant] = newSet;
376
390
if (constant is ConstructedConstantValue ) {
377
391
ClassEntity cls = constant.type.element;
378
- _updateClassRecursive (cls, oldSet, newSet, queue);
392
+ _updateClassRecursive (closedWorld, cls, oldSet, newSet, queue);
379
393
}
380
394
if (constant is InstantiationConstantValue ) {
381
395
for (DartType type in constant.typeArguments) {
382
396
if (type is InterfaceType ) {
383
- _updateClassRecursive (type.element, oldSet, newSet, queue);
397
+ _updateClassRecursive (
398
+ closedWorld, type.element, oldSet, newSet, queue);
384
399
}
385
400
}
386
401
}
387
402
constant.getDependencies ().forEach ((ConstantValue dependency) {
388
403
// Constants are not allowed to refer to deferred constants, so
389
404
// no need to check for a deferred type literal here.
390
- _updateConstantRecursive (dependency, oldSet, newSet, queue);
405
+ _updateConstantRecursive (
406
+ closedWorld, dependency, oldSet, newSet, queue);
391
407
});
392
408
} else {
393
409
assert (
@@ -401,8 +417,8 @@ abstract class DeferredLoadTask extends CompilerTask {
401
417
}
402
418
}
403
419
404
- void _updateClassRecursive (ClassEntity element, ImportSet oldSet ,
405
- ImportSet newSet, WorkQueue queue) {
420
+ void _updateClassRecursive (KClosedWorld closedWorld, ClassEntity element ,
421
+ ImportSet oldSet, ImportSet newSet, WorkQueue queue) {
406
422
if (element == null ) return ;
407
423
408
424
ImportSet currentSet = _classToSet[element];
@@ -419,17 +435,18 @@ abstract class DeferredLoadTask extends CompilerTask {
419
435
_classToSet[element] = newSet;
420
436
421
437
Dependencies dependencies = new Dependencies ();
422
- _collectAllElementsAndConstantsResolvedFromClass (element, dependencies);
438
+ _collectAllElementsAndConstantsResolvedFromClass (
439
+ closedWorld, element, dependencies);
423
440
LibraryEntity library = element.library;
424
441
_processDependencies (
425
- library, dependencies, oldSet, newSet, queue, element);
442
+ closedWorld, library, dependencies, oldSet, newSet, queue, element);
426
443
} else {
427
444
queue.addClass (element, newSet);
428
445
}
429
446
}
430
447
431
- void _updateMemberRecursive (MemberEntity element, ImportSet oldSet ,
432
- ImportSet newSet, WorkQueue queue) {
448
+ void _updateMemberRecursive (KClosedWorld closedWorld, MemberEntity element ,
449
+ ImportSet oldSet, ImportSet newSet, WorkQueue queue) {
433
450
if (element == null ) return ;
434
451
435
452
ImportSet currentSet = _memberToSet[element];
@@ -446,11 +463,12 @@ abstract class DeferredLoadTask extends CompilerTask {
446
463
_memberToSet[element] = newSet;
447
464
448
465
Dependencies dependencies = new Dependencies ();
449
- _collectAllElementsAndConstantsResolvedFromMember (element, dependencies);
466
+ _collectAllElementsAndConstantsResolvedFromMember (
467
+ closedWorld, element, dependencies);
450
468
451
469
LibraryEntity library = element.library;
452
470
_processDependencies (
453
- library, dependencies, oldSet, newSet, queue, element);
471
+ closedWorld, library, dependencies, oldSet, newSet, queue, element);
454
472
} else {
455
473
queue.addMember (element, newSet);
456
474
}
@@ -542,8 +560,14 @@ abstract class DeferredLoadTask extends CompilerTask {
542
560
}
543
561
}
544
562
545
- void _processDependencies (LibraryEntity library, Dependencies dependencies,
546
- ImportSet oldSet, ImportSet newSet, WorkQueue queue, Spannable context) {
563
+ void _processDependencies (
564
+ KClosedWorld closedWorld,
565
+ LibraryEntity library,
566
+ Dependencies dependencies,
567
+ ImportSet oldSet,
568
+ ImportSet newSet,
569
+ WorkQueue queue,
570
+ Spannable context) {
547
571
dependencies.classes.forEach ((ClassEntity cls, DependencyInfo info) {
548
572
_fixClassDependencyInfo (info, cls, library, context);
549
573
if (info.isDeferred) {
@@ -553,7 +577,7 @@ abstract class DeferredLoadTask extends CompilerTask {
553
577
}
554
578
}
555
579
} else {
556
- _updateClassRecursive (cls, oldSet, newSet, queue);
580
+ _updateClassRecursive (closedWorld, cls, oldSet, newSet, queue);
557
581
}
558
582
});
559
583
@@ -566,7 +590,7 @@ abstract class DeferredLoadTask extends CompilerTask {
566
590
}
567
591
}
568
592
} else {
569
- _updateMemberRecursive (member, oldSet, newSet, queue);
593
+ _updateMemberRecursive (closedWorld, member, oldSet, newSet, queue);
570
594
}
571
595
});
572
596
@@ -584,7 +608,7 @@ abstract class DeferredLoadTask extends CompilerTask {
584
608
}
585
609
}
586
610
} else {
587
- _updateConstantRecursive (constant, oldSet, newSet, queue);
611
+ _updateConstantRecursive (closedWorld, constant, oldSet, newSet, queue);
588
612
}
589
613
});
590
614
}
@@ -773,7 +797,7 @@ abstract class DeferredLoadTask extends CompilerTask {
773
797
void emptyQueue () {
774
798
while (queue.isNotEmpty) {
775
799
WorkItem item = queue.nextItem ();
776
- item.update (this , queue);
800
+ item.update (this , closedWorld, queue);
777
801
}
778
802
}
779
803
@@ -1167,7 +1191,7 @@ abstract class WorkItem {
1167
1191
1168
1192
WorkItem (this .importsToAdd);
1169
1193
1170
- void update (DeferredLoadTask task, WorkQueue queue);
1194
+ void update (DeferredLoadTask task, KClosedWorld closedWorld, WorkQueue queue);
1171
1195
}
1172
1196
1173
1197
/// Summary of the work that needs to be done on a class.
@@ -1178,11 +1202,12 @@ class ClassWorkItem extends WorkItem {
1178
1202
ClassWorkItem (this .cls, ImportSet newSet) : super (newSet);
1179
1203
1180
1204
@override
1181
- void update (DeferredLoadTask task, WorkQueue queue) {
1205
+ void update (
1206
+ DeferredLoadTask task, KClosedWorld closedWorld, WorkQueue queue) {
1182
1207
queue.pendingClasses.remove (cls);
1183
1208
ImportSet oldSet = task._classToSet[cls];
1184
1209
ImportSet newSet = task.importSets.union (oldSet, importsToAdd);
1185
- task._updateClassRecursive (cls, oldSet, newSet, queue);
1210
+ task._updateClassRecursive (closedWorld, cls, oldSet, newSet, queue);
1186
1211
}
1187
1212
}
1188
1213
@@ -1194,11 +1219,12 @@ class MemberWorkItem extends WorkItem {
1194
1219
MemberWorkItem (this .member, ImportSet newSet) : super (newSet);
1195
1220
1196
1221
@override
1197
- void update (DeferredLoadTask task, WorkQueue queue) {
1222
+ void update (
1223
+ DeferredLoadTask task, KClosedWorld closedWorld, WorkQueue queue) {
1198
1224
queue.pendingMembers.remove (member);
1199
1225
ImportSet oldSet = task._memberToSet[member];
1200
1226
ImportSet newSet = task.importSets.union (oldSet, importsToAdd);
1201
- task._updateMemberRecursive (member, oldSet, newSet, queue);
1227
+ task._updateMemberRecursive (closedWorld, member, oldSet, newSet, queue);
1202
1228
}
1203
1229
}
1204
1230
@@ -1210,11 +1236,12 @@ class ConstantWorkItem extends WorkItem {
1210
1236
ConstantWorkItem (this .constant, ImportSet newSet) : super (newSet);
1211
1237
1212
1238
@override
1213
- void update (DeferredLoadTask task, WorkQueue queue) {
1239
+ void update (
1240
+ DeferredLoadTask task, KClosedWorld closedWorld, WorkQueue queue) {
1214
1241
queue.pendingConstants.remove (constant);
1215
1242
ImportSet oldSet = task._constantToSet[constant];
1216
1243
ImportSet newSet = task.importSets.union (oldSet, importsToAdd);
1217
- task._updateConstantRecursive (constant, oldSet, newSet, queue);
1244
+ task._updateConstantRecursive (closedWorld, constant, oldSet, newSet, queue);
1218
1245
}
1219
1246
}
1220
1247
0 commit comments