Skip to content

Commit b8cfc77

Browse files
johnniwintherCommit Queue
authored andcommitted
[cfe] Lookup classes/extension type from references
This adds a ReferenceMap for mapping reference from previous incremental compilation steps to source builders in the current compilation. This replaces the `buildersCreatedWithReferences` map, encapsulating its usage. When create TypeBuilder for DartType, the AST nodes might not have been fully created yet, so in order to avoid relying on the parent relation, we first lookup whether the Reference have a corresponding builder. Fixes flutter/flutter#171963 Change-Id: I866e2b73d3d77ce58ea5dc5f49504e5b165fabb5 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/441800 Reviewed-by: Jens Johansen <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent 0400b4e commit b8cfc77

20 files changed

+318
-48
lines changed

pkg/front_end/lib/src/base/incremental_compiler.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -612,7 +612,7 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
612612
replacementNameSpaceMap = null;
613613
}
614614
}
615-
nextGoodKernelTarget.loader.buildersCreatedWithReferences.clear();
615+
nextGoodKernelTarget.loader.referenceMap.clear();
616616
nextGoodKernelTarget.loader.hierarchyBuilder.clear();
617617
nextGoodKernelTarget.loader.membersBuilder.clear();
618618
nextGoodKernelTarget.loader.referenceFromIndex = null;

pkg/front_end/lib/src/dill/dill_library_builder.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import '../codes/cfe_codes.dart'
2727
import '../kernel/constructor_tearoff_lowering.dart';
2828
import '../kernel/utils.dart';
2929
import '../source/name_scheme.dart';
30+
import '../util/reference_map.dart';
3031
import 'dill_class_builder.dart' show DillClassBuilder;
3132
import 'dill_extension_builder.dart';
3233
import 'dill_extension_type_declaration_builder.dart';
@@ -418,11 +419,11 @@ class DillLibraryBuilder extends LibraryBuilderImpl {
418419
_exportNameSpace.addLocalMember(name, declaration, setter: false);
419420
});
420421

421-
Map<Reference, NamedBuilder>? sourceBuildersMap =
422-
loader.currentSourceLoader?.buildersCreatedWithReferences;
422+
ReferenceMap? sourceBuildersMap = loader.currentSourceLoader?.referenceMap;
423423
for (Reference reference in library.additionalExports) {
424424
NamedNode node = reference.node as NamedNode;
425-
NamedBuilder? declaration = sourceBuildersMap?[reference];
425+
NamedBuilder? declaration =
426+
sourceBuildersMap?.lookupNamedBuilder(reference);
426427
String name;
427428
if (declaration != null) {
428429
// Coverage-ignore-block(suite): Not run.

pkg/front_end/lib/src/dill/dill_loader.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,9 +324,15 @@ severity: $severity
324324

325325
@override
326326
ClassBuilder computeClassBuilderFromTargetClass(Class cls) {
327+
ClassBuilder? classBuilder =
328+
currentSourceLoader?.referenceMap.lookupClassBuilder(cls.reference);
329+
if (classBuilder != null) {
330+
return classBuilder;
331+
}
327332
Library kernelLibrary = cls.enclosingLibrary;
328333
LibraryBuilder? library = lookupLibraryBuilder(kernelLibrary.importUri);
329334
if (library == null) {
335+
// Coverage-ignore-block(suite): Not run.
330336
library = currentSourceLoader
331337
?.lookupLoadedLibraryBuilder(kernelLibrary.importUri);
332338
}
@@ -337,9 +343,16 @@ severity: $severity
337343
ExtensionTypeDeclarationBuilder
338344
computeExtensionTypeBuilderFromTargetExtensionType(
339345
ExtensionTypeDeclaration extensionType) {
346+
ExtensionTypeDeclarationBuilder? extensionTypeDeclarationBuilder =
347+
currentSourceLoader?.referenceMap
348+
.lookupExtensionTypeDeclarationBuilder(extensionType.reference);
349+
if (extensionTypeDeclarationBuilder != null) {
350+
return extensionTypeDeclarationBuilder;
351+
}
340352
Library library = extensionType.enclosingLibrary;
341353
LibraryBuilder? libraryBuilder = lookupLibraryBuilder(library.importUri);
342354
if (libraryBuilder == null) {
355+
// Coverage-ignore-block(suite): Not run.
343356
libraryBuilder =
344357
currentSourceLoader?.lookupLoadedLibraryBuilder(library.importUri);
345358
}

pkg/front_end/lib/src/kernel/kernel_target.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,8 @@ class KernelTarget {
626626
sortedSourceClassBuilders = null;
627627

628628
return new BuildResult(component: component);
629-
}, () => loader.currentUriForCrashReporting);
629+
}, // Coverage-ignore(suite): Not run.
630+
() => loader.currentUriForCrashReporting);
630631
}
631632

632633
/// Build the kernel representation of the component loaded by this

pkg/front_end/lib/src/source/builder_factory.dart

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -298,8 +298,8 @@ class BuilderFactory {
298298
augmentations.clear();
299299
}
300300
if (indexedClass != null) {
301-
_loader.buildersCreatedWithReferences[indexedClass.reference] =
302-
classBuilder;
301+
_loader.referenceMap
302+
.registerNamedBuilder(indexedClass.reference, classBuilder);
303303
}
304304
_builderRegistry.registerBuilder(
305305
declaration: classBuilder,
@@ -343,7 +343,8 @@ class BuilderFactory {
343343
introductory: constructorDeclaration,
344344
augmentations: augmentationDeclarations,
345345
isConst: isConst);
346-
constructorReferences.registerReference(_loader, constructorBuilder);
346+
constructorReferences.registerReference(
347+
_loader.referenceMap, constructorBuilder);
347348

348349
constructorDeclaration.createEncoding(
349350
problemReporting: _problemReporting,
@@ -585,8 +586,8 @@ class BuilderFactory {
585586
fragment.builder = enumBuilder;
586587
fragment.bodyScope.declarationBuilder = enumBuilder;
587588
if (indexedClass != null) {
588-
_loader.buildersCreatedWithReferences[indexedClass.reference] =
589-
enumBuilder;
589+
_loader.referenceMap
590+
.registerNamedBuilder(indexedClass.reference, enumBuilder);
590591
}
591592
_builderRegistry.registerBuilder(
592593
declaration: enumBuilder,
@@ -671,7 +672,7 @@ class BuilderFactory {
671672
nameSpaceBuilder: nameSpaceBuilder,
672673
reference: reference);
673674
if (reference != null) {
674-
_loader.buildersCreatedWithReferences[reference] = extensionBuilder;
675+
_loader.referenceMap.registerNamedBuilder(reference, extensionBuilder);
675676
}
676677
_builderRegistry.registerBuilder(
677678
declaration: extensionBuilder,
@@ -706,8 +707,8 @@ class BuilderFactory {
706707
indexedContainer: indexedContainer,
707708
representationFieldFragment: representationFieldFragment);
708709
if (indexedContainer?.reference != null) {
709-
_loader.buildersCreatedWithReferences[indexedContainer!.reference] =
710-
extensionTypeDeclarationBuilder;
710+
_loader.referenceMap.registerNamedBuilder(
711+
indexedContainer!.reference, extensionTypeDeclarationBuilder);
711712
}
712713
_builderRegistry.registerBuilder(
713714
declaration: extensionTypeDeclarationBuilder,
@@ -776,7 +777,7 @@ class BuilderFactory {
776777
encodingStrategy: encodingStrategy);
777778
}
778779

779-
factoryReferences.registerReference(_loader, factoryBuilder);
780+
factoryReferences.registerReference(_loader.referenceMap, factoryBuilder);
780781
_builderRegistry.registerBuilder(
781782
declaration: factoryBuilder, uriOffset: uriOffset, inPatch: inPatch);
782783
}
@@ -877,7 +878,8 @@ class BuilderFactory {
877878
}
878879

879880
if (procedureReference != null) {
880-
_loader.buildersCreatedWithReferences[procedureReference] = methodBuilder;
881+
_loader.referenceMap
882+
.registerNamedBuilder(procedureReference, methodBuilder);
881883
}
882884
_builderRegistry.registerBuilder(
883885
declaration: methodBuilder,
@@ -910,8 +912,8 @@ class BuilderFactory {
910912
fragment.builder = mixinBuilder;
911913
fragment.bodyScope.declarationBuilder = mixinBuilder;
912914
if (indexedClass != null) {
913-
_loader.buildersCreatedWithReferences[indexedClass.reference] =
914-
mixinBuilder;
915+
_loader.referenceMap
916+
.registerNamedBuilder(indexedClass.reference, mixinBuilder);
915917
}
916918
_builderRegistry.registerBuilder(
917919
declaration: mixinBuilder,
@@ -955,8 +957,8 @@ class BuilderFactory {
955957
_mixinApplications[classBuilder] = mixin;
956958
fragment.builder = classBuilder;
957959
if (referencesFromIndexedClass != null) {
958-
_loader.buildersCreatedWithReferences[
959-
referencesFromIndexedClass.reference] = classBuilder;
960+
_loader.referenceMap.registerNamedBuilder(
961+
referencesFromIndexedClass.reference, classBuilder);
960962
}
961963
_builderRegistry.registerBuilder(
962964
declaration: classBuilder,
@@ -1059,7 +1061,7 @@ class BuilderFactory {
10591061
propertyEncodingStrategy, _typeParameterFactory);
10601062
}
10611063

1062-
references.registerReference(_loader, propertyBuilder);
1064+
references.registerReference(_loader.referenceMap, propertyBuilder);
10631065

10641066
_builderRegistry.registerBuilder(
10651067
declaration: propertyBuilder, uriOffset: uriOffset, inPatch: inPatch);
@@ -1088,7 +1090,7 @@ class BuilderFactory {
10881090
fragment: fragment,
10891091
reference: reference);
10901092
if (reference != null) {
1091-
_loader.buildersCreatedWithReferences[reference] = typedefBuilder;
1093+
_loader.referenceMap.registerNamedBuilder(reference, typedefBuilder);
10921094
}
10931095
_builderRegistry.registerBuilder(
10941096
declaration: typedefBuilder,

pkg/front_end/lib/src/source/source_class_builder.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,8 +315,8 @@ class SourceClassBuilder extends ClassBuilderImpl
315315
onAnonymousMixin: (SourceClassBuilder anonymousMixinBuilder) {
316316
Reference? reference = anonymousMixinBuilder.indexedClass?.reference;
317317
if (reference != null) {
318-
loader.buildersCreatedWithReferences[reference] =
319-
anonymousMixinBuilder;
318+
loader.referenceMap
319+
.registerNamedBuilder(reference, anonymousMixinBuilder);
320320
}
321321
addAnonymousMixinClassBuilder(anonymousMixinBuilder);
322322
anonymousMixinBuilder.buildScopes(loader.coreLibrary);

pkg/front_end/lib/src/source/source_constructor_builder.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import '../kernel/kernel_helper.dart' show DelayedDefaultValueCloner;
3535
import '../kernel/type_algorithms.dart';
3636
import '../type_inference/inference_results.dart';
3737
import '../type_inference/type_inference_engine.dart';
38+
import '../util/reference_map.dart';
3839
import 'name_scheme.dart';
3940
import 'source_class_builder.dart';
4041
import 'source_library_builder.dart' show SourceLibraryBuilder;
@@ -667,12 +668,12 @@ class ConstructorReferences {
667668
/// This must be called before [constructorReference] and [tearOffReference]
668669
/// are accessed.
669670
void registerReference(
670-
SourceLoader loader, SourceConstructorBuilder builder) {
671+
ReferenceMap referenceMap, SourceConstructorBuilder builder) {
671672
if (_constructorReference != null) {
672-
loader.buildersCreatedWithReferences[_constructorReference!] = builder;
673+
referenceMap.registerNamedBuilder(_constructorReference!, builder);
673674
}
674675
if (_tearOffReference != null) {
675-
loader.buildersCreatedWithReferences[_tearOffReference!] = builder;
676+
referenceMap.registerNamedBuilder(_tearOffReference!, builder);
676677
}
677678
}
678679

pkg/front_end/lib/src/source/source_factory_builder.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import '../kernel/hierarchy/class_member.dart';
2121
import '../kernel/kernel_helper.dart';
2222
import '../kernel/type_algorithms.dart';
2323
import '../type_inference/type_inference_engine.dart';
24+
import '../util/reference_map.dart';
2425
import 'name_scheme.dart';
2526
import 'source_class_builder.dart';
2627
import 'source_library_builder.dart' show SourceLibraryBuilder;
@@ -405,12 +406,13 @@ class FactoryReferences {
405406
///
406407
/// This must be called before [factoryReference] and [tearOffReference] are
407408
/// accessed.
408-
void registerReference(SourceLoader loader, SourceFactoryBuilder builder) {
409+
void registerReference(
410+
ReferenceMap referenceMap, SourceFactoryBuilder builder) {
409411
if (_factoryReference != null) {
410-
loader.buildersCreatedWithReferences[_factoryReference!] = builder;
412+
referenceMap.registerNamedBuilder(_factoryReference!, builder);
411413
}
412414
if (_tearOffReference != null) {
413-
loader.buildersCreatedWithReferences[_tearOffReference!] = builder;
415+
referenceMap.registerNamedBuilder(_tearOffReference!, builder);
414416
}
415417
}
416418

pkg/front_end/lib/src/source/source_loader.dart

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ import '../kernel/kernel_target.dart' show KernelTarget;
7070
import '../kernel/type_builder_computer.dart' show TypeBuilderComputer;
7171
import '../type_inference/type_inference_engine.dart';
7272
import '../type_inference/type_inferrer.dart';
73+
import '../util/reference_map.dart';
7374
import 'diet_listener.dart' show DietListener;
7475
import 'diet_parser.dart' show DietParser, useImplicitCreationExpressionInCfe;
7576
import 'offset_map.dart';
@@ -109,10 +110,7 @@ class SourceLoader extends Loader {
109110
CoreTypes? _coreTypes;
110111
TypeEnvironment? _typeEnvironment;
111112

112-
/// For builders created with a reference, this maps from that reference to
113-
/// that builder. This is used for looking up source builders when finalizing
114-
/// exports in dill builders.
115-
Map<Reference, NamedBuilder> buildersCreatedWithReferences = {};
113+
final ReferenceMap referenceMap = new ReferenceMap();
116114

117115
/// Used when checking whether a return type of an async function is valid.
118116
///
@@ -2736,6 +2734,10 @@ severity: $severity
27362734

27372735
@override
27382736
ClassBuilder computeClassBuilderFromTargetClass(Class cls) {
2737+
ClassBuilder? classBuilder = referenceMap.lookupClassBuilder(cls.reference);
2738+
if (classBuilder != null) {
2739+
return classBuilder;
2740+
}
27392741
Library library = cls.enclosingLibrary;
27402742
LibraryBuilder? libraryBuilder =
27412743
lookupLoadedLibraryBuilder(library.importUri);
@@ -2749,6 +2751,12 @@ severity: $severity
27492751
ExtensionTypeDeclarationBuilder
27502752
computeExtensionTypeBuilderFromTargetExtensionType(
27512753
ExtensionTypeDeclaration extensionType) {
2754+
ExtensionTypeDeclarationBuilder? extensionTypeDeclarationBuilder =
2755+
referenceMap
2756+
.lookupExtensionTypeDeclarationBuilder(extensionType.reference);
2757+
if (extensionTypeDeclarationBuilder != null) {
2758+
return extensionTypeDeclarationBuilder;
2759+
}
27522760
Library kernelLibrary = extensionType.enclosingLibrary;
27532761
LibraryBuilder? library =
27542762
lookupLoadedLibraryBuilder(kernelLibrary.importUri);

pkg/front_end/lib/src/source/source_property_builder.dart

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ import '../kernel/hierarchy/members_builder.dart';
2424
import '../kernel/kernel_helper.dart';
2525
import '../kernel/member_covariance.dart';
2626
import '../kernel/type_algorithms.dart';
27+
import '../util/reference_map.dart';
2728
import 'name_scheme.dart';
2829
import 'source_class_builder.dart';
2930
import 'source_library_builder.dart';
30-
import 'source_loader.dart';
3131
import 'source_member_builder.dart';
3232

3333
class SourcePropertyBuilder extends SourceMemberBuilderImpl
@@ -901,15 +901,16 @@ class PropertyReferences {
901901
///
902902
/// This must be called before [fieldReference], [getterReference] and
903903
/// [setterReference] are accessed.
904-
void registerReference(SourceLoader loader, SourcePropertyBuilder builder) {
904+
void registerReference(
905+
ReferenceMap referenceMap, SourcePropertyBuilder builder) {
905906
if (_fieldReference != null) {
906-
loader.buildersCreatedWithReferences[_fieldReference!] = builder;
907+
referenceMap.registerNamedBuilder(_fieldReference!, builder);
907908
}
908909
if (_getterReference != null) {
909-
loader.buildersCreatedWithReferences[_getterReference!] = builder;
910+
referenceMap.registerNamedBuilder(_getterReference!, builder);
910911
}
911912
if (_setterReference != null) {
912-
loader.buildersCreatedWithReferences[_setterReference!] = builder;
913+
referenceMap.registerNamedBuilder(_setterReference!, builder);
913914
}
914915
}
915916

0 commit comments

Comments
 (0)