Skip to content

Commit fa65863

Browse files
author
Dart CI
committed
Version 2.19.0-382.0.dev
Merge 5af9f02 into dev
2 parents 4fcefaf + 5af9f02 commit fa65863

File tree

9 files changed

+247
-92
lines changed

9 files changed

+247
-92
lines changed

pkg/front_end/lib/src/fasta/builder/class_builder.dart

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import 'declaration_builder.dart';
3434
import 'library_builder.dart';
3535
import 'member_builder.dart';
3636
import 'metadata_builder.dart';
37+
import 'name_iterator.dart';
3738
import 'nullability_builder.dart';
3839
import 'type_builder.dart';
3940
import 'type_variable_builder.dart';
@@ -80,8 +81,6 @@ abstract class ClassBuilder implements DeclarationBuilder {
8081
MemberBuilder? findConstructorOrFactory(
8182
String name, int charOffset, Uri uri, LibraryBuilder accessingLibrary);
8283

83-
void forEach(void f(String name, Builder builder));
84-
8584
/// The [Class] built by this builder.
8685
///
8786
/// For a patch class the origin class is returned.
@@ -125,8 +124,32 @@ abstract class ClassBuilder implements DeclarationBuilder {
125124
Member? lookupInstanceMember(ClassHierarchy hierarchy, Name name,
126125
{bool isSetter = false, bool isSuper = false});
127126

128-
/// Calls [f] for each constructor declared in this class.
129-
void forEachConstructor(void Function(String, MemberBuilder) f);
127+
// TODO(johnniwinther): Support filtering on the returns builder types in
128+
// these:
129+
130+
/// [Iterator] for all members declared in this class or any of its
131+
/// augmentations.
132+
///
133+
/// Duplicates and augmenting constructor are _not_ included.
134+
Iterator<MemberBuilder> get fullConstructorIterator;
135+
136+
/// [NameIterator] for all constructors declared in this class or any of its
137+
/// augmentations.
138+
///
139+
/// Duplicates and augmenting constructors are _not_ included.
140+
NameIterator<MemberBuilder> get fullConstructorNameIterator;
141+
142+
/// [Iterator] for all members declared in this class or any of its
143+
/// augmentations.
144+
///
145+
/// Duplicates and augmenting members are _not_ included.
146+
Iterator<Builder> get fullMemberIterator;
147+
148+
/// [NameIterator] for all members declared in this class or any of its
149+
/// augmentations.
150+
///
151+
/// Duplicates and augmenting members are _not_ included.
152+
NameIterator<Builder> get fullMemberNameIterator;
130153
}
131154

132155
abstract class ClassBuilderImpl extends DeclarationBuilderImpl

pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import '../builder/builder.dart';
1111
import '../builder/class_builder.dart';
1212
import '../builder/library_builder.dart';
1313
import '../builder/member_builder.dart';
14+
import '../builder/name_iterator.dart';
1415
import '../builder/type_builder.dart';
1516
import '../builder/type_variable_builder.dart';
1617
import '../modifier.dart' show abstractMask, namedMixinApplicationMask;
@@ -184,15 +185,19 @@ class DillClassBuilder extends ClassBuilderImpl {
184185
}
185186

186187
@override
187-
void forEach(void f(String name, Builder builder)) {
188-
scope.unfilteredNameIterator.forEach(f);
189-
}
188+
Iterator<MemberBuilder> get fullConstructorIterator =>
189+
constructorScope.unfilteredIterator;
190190

191191
@override
192-
void forEachConstructor(void Function(String, MemberBuilder) f,
193-
{bool includeInjectedConstructors = false}) {
194-
constructorScope.unfilteredNameIterator.forEach(f);
195-
}
192+
NameIterator<MemberBuilder> get fullConstructorNameIterator =>
193+
constructorScope.unfilteredNameIterator;
194+
195+
@override
196+
Iterator<Builder> get fullMemberIterator => scope.unfilteredIterator;
197+
198+
@override
199+
NameIterator<Builder> get fullMemberNameIterator =>
200+
scope.unfilteredNameIterator;
196201

197202
void clearCachedValues() {
198203
supertypeBuilder = null;

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

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -942,7 +942,11 @@ class KernelTarget extends TargetImplementation {
942942
bool isConstructorAdded = false;
943943
Map<TypeParameter, DartType>? substitutionMap;
944944

945-
void addSyntheticConstructor(String name, MemberBuilder memberBuilder) {
945+
NameIterator<MemberBuilder> iterator =
946+
superclassBuilder.fullConstructorNameIterator;
947+
while (iterator.moveNext()) {
948+
String name = iterator.name;
949+
MemberBuilder memberBuilder = iterator.current;
946950
if (memberBuilder.member is Constructor) {
947951
substitutionMap ??= builder.getSubstitutionMap(superclassBuilder.cls);
948952
Reference? constructorReference;
@@ -972,15 +976,13 @@ class KernelTarget extends TargetImplementation {
972976
builder,
973977
builder.cls.mixin,
974978
memberBuilder as MemberBuilderImpl,
975-
substitutionMap!,
979+
substitutionMap,
976980
constructorReference,
977981
tearOffReference));
978982
isConstructorAdded = true;
979983
}
980984
}
981985

982-
superclassBuilder.forEachConstructor(addSyntheticConstructor);
983-
984986
if (!isConstructorAdded) {
985987
builder.addSyntheticConstructor(_makeDefaultConstructor(
986988
builder, constructorReference, tearOffReference));
@@ -1547,11 +1549,12 @@ class KernelTarget extends TargetImplementation {
15471549
isSynthesized: fieldBuilder.isLateLowered,
15481550
));
15491551
});
1550-
builder.forEach((String name, Builder builder) {
1551-
if (builder is FieldBuilder) {
1552-
patchFieldNames.remove(name);
1552+
NameIterator<Builder> fieldIterator = builder.fullMemberNameIterator;
1553+
while (fieldIterator.moveNext()) {
1554+
if (fieldIterator.current is FieldBuilder) {
1555+
patchFieldNames.remove(fieldIterator.name);
15531556
}
1554-
});
1557+
}
15551558
Set<String> kernelFieldNames = cls.fields.map((f) => f.name.text).toSet();
15561559
return kernelFieldNames.containsAll(patchFieldNames);
15571560
}(),

pkg/front_end/lib/src/fasta/kernel/macro/macro.dart

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1100,7 +1100,9 @@ class _TypeIntrospector implements macro.TypeIntrospector {
11001100
}
11011101
ClassBuilder classBuilder = macroApplications._getClassBuilder(type);
11021102
List<macro.ConstructorDeclaration> result = [];
1103-
classBuilder.forEachConstructor((_, MemberBuilder memberBuilder) {
1103+
Iterator<MemberBuilder> iterator = classBuilder.fullConstructorIterator;
1104+
while (iterator.moveNext()) {
1105+
MemberBuilder memberBuilder = iterator.current;
11041106
if (memberBuilder is DeclaredSourceConstructorBuilder) {
11051107
// TODO(johnniwinther): Should we support synthesized constructors?
11061108
result.add(macroApplications._getMemberDeclaration(memberBuilder)
@@ -1109,7 +1111,7 @@ class _TypeIntrospector implements macro.TypeIntrospector {
11091111
result.add(macroApplications._getMemberDeclaration(memberBuilder)
11101112
as macro.ConstructorDeclaration);
11111113
}
1112-
});
1114+
}
11131115
return new Future.value(result);
11141116
}
11151117

@@ -1120,12 +1122,14 @@ class _TypeIntrospector implements macro.TypeIntrospector {
11201122
}
11211123
ClassBuilder classBuilder = macroApplications._getClassBuilder(type);
11221124
List<macro.FieldDeclaration> result = [];
1123-
classBuilder.forEach((_, Builder memberBuilder) {
1125+
Iterator<Builder> iterator = classBuilder.fullMemberIterator;
1126+
while (iterator.moveNext()) {
1127+
Builder memberBuilder = iterator.current;
11241128
if (memberBuilder is SourceFieldBuilder) {
11251129
result.add(macroApplications._getMemberDeclaration(memberBuilder)
11261130
as macro.FieldDeclaration);
11271131
}
1128-
});
1132+
}
11291133
return new Future.value(result);
11301134
}
11311135

@@ -1137,12 +1141,14 @@ class _TypeIntrospector implements macro.TypeIntrospector {
11371141
}
11381142
ClassBuilder classBuilder = macroApplications._getClassBuilder(type);
11391143
List<macro.MethodDeclaration> result = [];
1140-
classBuilder.forEach((_, Builder memberBuilder) {
1144+
Iterator<Builder> iterator = classBuilder.fullMemberIterator;
1145+
while (iterator.moveNext()) {
1146+
Builder memberBuilder = iterator.current;
11411147
if (memberBuilder is SourceProcedureBuilder) {
11421148
result.add(macroApplications._getMemberDeclaration(memberBuilder)
11431149
as macro.MethodDeclaration);
11441150
}
1145-
});
1151+
}
11461152
return new Future.value(result);
11471153
}
11481154
}

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

Lines changed: 112 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -374,14 +374,20 @@ class SourceClassBuilder extends ClassBuilderImpl
374374
}
375375

376376
@override
377-
void forEach(void f(String name, Builder builder)) {
378-
new ClassMemberNameIterator(this, includeDuplicates: false).forEach(f);
379-
}
377+
Iterator<Builder> get fullMemberIterator =>
378+
new ClassMemberIterator(this, includeDuplicates: false);
380379

381380
@override
382-
void forEachConstructor(void Function(String, MemberBuilder) f) {
383-
new ClassConstructorNameIterator(this, includeDuplicates: false).forEach(f);
384-
}
381+
NameIterator<Builder> get fullMemberNameIterator =>
382+
new ClassMemberNameIterator(this, includeDuplicates: false);
383+
384+
@override
385+
Iterator<MemberBuilder> get fullConstructorIterator =>
386+
new ClassConstructorIterator(this, includeDuplicates: false);
387+
388+
@override
389+
NameIterator<MemberBuilder> get fullConstructorNameIterator =>
390+
new ClassConstructorNameIterator(this, includeDuplicates: false);
385391

386392
void forEachDeclaredField(
387393
void Function(String name, SourceFieldBuilder fieldBuilder) callback) {
@@ -1042,7 +1048,9 @@ class SourceClassBuilder extends ClassBuilderImpl
10421048
}
10431049

10441050
void checkTypesInOutline(TypeEnvironment typeEnvironment) {
1045-
forEach((String name, Builder builder) {
1051+
Iterator<Builder> memberIterator = fullMemberIterator;
1052+
while (memberIterator.moveNext()) {
1053+
Builder builder = memberIterator.current;
10461054
if (builder is SourceMemberBuilder) {
10471055
builder.checkVariance(this, typeEnvironment);
10481056
builder.checkTypes(libraryBuilder, typeEnvironment);
@@ -1052,16 +1060,18 @@ class SourceClassBuilder extends ClassBuilderImpl
10521060
"Unexpected class member builder $builder "
10531061
"(${builder.runtimeType})");
10541062
}
1055-
});
1063+
}
10561064

1057-
forEachConstructor((String name, MemberBuilder builder) {
1065+
Iterator<MemberBuilder> constructorIterator = fullConstructorIterator;
1066+
while (constructorIterator.moveNext()) {
1067+
MemberBuilder builder = constructorIterator.current;
10581068
if (builder is SourceMemberBuilder) {
10591069
builder.checkTypes(libraryBuilder, typeEnvironment);
10601070
} else {
10611071
assert(false,
10621072
"Unexpected constructor builder $builder (${builder.runtimeType})");
10631073
}
1064-
});
1074+
}
10651075
}
10661076

10671077
void addSyntheticConstructor(
@@ -2613,6 +2623,52 @@ class _RedirectingConstructorsFieldBuilder extends DillFieldBuilder
26132623
SourceLibraryBuilder library, TypeEnvironment typeEnvironment) {}
26142624
}
26152625

2626+
class ClassMemberIterator<T extends Builder> implements Iterator<T> {
2627+
Iterator<T>? _iterator;
2628+
Iterator<SourceClassBuilder>? augmentationBuilders;
2629+
final bool includeDuplicates;
2630+
2631+
factory ClassMemberIterator(SourceClassBuilder classBuilder,
2632+
{required bool includeDuplicates}) {
2633+
return new ClassMemberIterator._(classBuilder.origin,
2634+
includeDuplicates: includeDuplicates);
2635+
}
2636+
2637+
ClassMemberIterator._(SourceClassBuilder classBuilder,
2638+
{required this.includeDuplicates})
2639+
: _iterator = classBuilder.scope.filteredIterator<T>(
2640+
parent: classBuilder,
2641+
includeDuplicates: includeDuplicates,
2642+
includeAugmentations: false),
2643+
augmentationBuilders = classBuilder._patches?.iterator;
2644+
2645+
@override
2646+
bool moveNext() {
2647+
if (_iterator != null) {
2648+
if (_iterator!.moveNext()) {
2649+
return true;
2650+
}
2651+
}
2652+
if (augmentationBuilders != null && augmentationBuilders!.moveNext()) {
2653+
SourceClassBuilder augmentationClassBuilder =
2654+
augmentationBuilders!.current;
2655+
_iterator = augmentationClassBuilder.scope.filteredIterator<T>(
2656+
parent: augmentationClassBuilder,
2657+
includeDuplicates: includeDuplicates,
2658+
includeAugmentations: false);
2659+
}
2660+
if (_iterator != null) {
2661+
if (_iterator!.moveNext()) {
2662+
return true;
2663+
}
2664+
}
2665+
return false;
2666+
}
2667+
2668+
@override
2669+
T get current => _iterator?.current ?? (throw new StateError('No element'));
2670+
}
2671+
26162672
class ClassMemberNameIterator<T extends Builder> implements NameIterator<T> {
26172673
NameIterator<T>? _iterator;
26182674
Iterator<SourceClassBuilder>? augmentationBuilders;
@@ -2662,6 +2718,52 @@ class ClassMemberNameIterator<T extends Builder> implements NameIterator<T> {
26622718
String get name => _iterator?.name ?? (throw new StateError('No element'));
26632719
}
26642720

2721+
class ClassConstructorIterator<T extends MemberBuilder> implements Iterator<T> {
2722+
Iterator<T>? _iterator;
2723+
Iterator<SourceClassBuilder>? augmentationBuilders;
2724+
final bool includeDuplicates;
2725+
2726+
factory ClassConstructorIterator(SourceClassBuilder classBuilder,
2727+
{required bool includeDuplicates}) {
2728+
return new ClassConstructorIterator._(classBuilder.origin,
2729+
includeDuplicates: includeDuplicates);
2730+
}
2731+
2732+
ClassConstructorIterator._(SourceClassBuilder classBuilder,
2733+
{required this.includeDuplicates})
2734+
: _iterator = classBuilder.constructorScope.filteredIterator<T>(
2735+
parent: classBuilder,
2736+
includeDuplicates: includeDuplicates,
2737+
includeAugmentations: false),
2738+
augmentationBuilders = classBuilder._patches?.iterator;
2739+
2740+
@override
2741+
bool moveNext() {
2742+
if (_iterator != null) {
2743+
if (_iterator!.moveNext()) {
2744+
return true;
2745+
}
2746+
}
2747+
if (augmentationBuilders != null && augmentationBuilders!.moveNext()) {
2748+
SourceClassBuilder augmentationClassBuilder =
2749+
augmentationBuilders!.current;
2750+
_iterator = augmentationClassBuilder.constructorScope.filteredIterator<T>(
2751+
parent: augmentationClassBuilder,
2752+
includeDuplicates: includeDuplicates,
2753+
includeAugmentations: false);
2754+
}
2755+
if (_iterator != null) {
2756+
if (_iterator!.moveNext()) {
2757+
return true;
2758+
}
2759+
}
2760+
return false;
2761+
}
2762+
2763+
@override
2764+
T get current => _iterator?.current ?? (throw new StateError('No element'));
2765+
}
2766+
26652767
class ClassConstructorNameIterator<T extends MemberBuilder>
26662768
implements NameIterator<T> {
26672769
NameIterator<T>? _iterator;

0 commit comments

Comments
 (0)