Skip to content

Commit d56caba

Browse files
johnniwintherCommit Queue
authored and
Commit Queue
committed
[cfe] Remove member/constructor iterators from NameSpace
This remove the iterators from the NameSpace interface and instead collects the list of builders belonging to a library or declaration directly inside these builders. Adds ComputedNameSpace for import, export and prefix name spaces. This allows for replacing a member and has a filteredIterator function. These name spaces are computed from import/exports and therefore need to be iterated through directly and replace builder when two builders collide. Change-Id: Iec974656c5331498aa1cfca7973300ac6e044994 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/428820 Commit-Queue: Johnni Winther <johnniwinther@google.com> Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
1 parent 843a936 commit d56caba

File tree

365 files changed

+3058
-2310
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

365 files changed

+3058
-2310
lines changed

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,8 @@ class Import {
9090
importOffset: importOffset, prefixOffset: prefixOffset);
9191
};
9292
}
93-
Iterator<NamedBuilder> iterator = importedLibraryBuilder!.exportNameSpace
94-
.filteredIterator(includeDuplicates: false);
93+
Iterator<NamedBuilder> iterator =
94+
importedLibraryBuilder!.exportNameSpace.filteredIterator();
9595
while (iterator.moveNext()) {
9696
NamedBuilder member = iterator.current;
9797
String name = member.name;

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

+37-53
Original file line numberDiff line numberDiff line change
@@ -33,55 +33,42 @@ abstract class NameSpace {
3333
LookupResult? lookupLocalMember(String name);
3434

3535
void forEachLocalExtension(void Function(ExtensionBuilder member) f);
36+
}
3637

37-
/// Returns an iterator of all members and setters mapped in this name space,
38-
/// including duplicate members mapped to the same name.
39-
Iterator<NamedBuilder> get unfilteredIterator;
38+
abstract class MutableNameSpace implements NameSpace {
39+
void addLocalMember(String name, NamedBuilder member, {required bool setter});
4040

41+
/// Adds [builder] to the extensions in this name space.
42+
void addExtension(ExtensionBuilder builder);
43+
}
44+
45+
abstract class ComputedNameSpace implements NameSpace {
4146
/// Returns a filtered iterator of members and setters mapped in this name
4247
/// space.
4348
///
4449
/// Only members of type [T] are included. If [parent] is provided, on members
45-
/// declared in [parent] are included. If [includeDuplicates] is `true`, all
46-
/// duplicates of the same name are included, otherwise, only the first
47-
/// declared member is included.
48-
Iterator<T> filteredIterator<T extends NamedBuilder>(
49-
{required bool includeDuplicates});
50+
/// declared in [parent] are included. Duplicates are not included.
51+
Iterator<T> filteredIterator<T extends NamedBuilder>();
5052
}
5153

52-
abstract class MutableNameSpace implements NameSpace {
53-
factory MutableNameSpace() = NameSpaceImpl._;
54-
55-
void addLocalMember(String name, NamedBuilder member,
56-
{required bool setter, bool allowReplace = false});
54+
abstract class ComputedMutableNameSpace
55+
implements MutableNameSpace, ComputedNameSpace {
56+
factory ComputedMutableNameSpace() = NameSpaceImpl._;
5757

58-
/// Adds [builder] to the extensions in this name space.
59-
void addExtension(ExtensionBuilder builder);
58+
void replaceLocalMember(String name, NamedBuilder member,
59+
{required bool setter});
6060
}
6161

6262
abstract class DeclarationNameSpace implements NameSpace {
6363
MemberBuilder? lookupConstructor(String name);
64-
65-
/// Returns an iterator of all constructors mapped in this scope,
66-
/// including duplicate constructors mapped to the same name.
67-
Iterator<MemberBuilder> get unfilteredConstructorIterator;
68-
69-
/// Returns a filtered iterator of constructors mapped in this scope.
70-
///
71-
/// Only members of type [T] are included. If [parent] is provided, on members
72-
/// declared in [parent] are included. If [includeDuplicates] is `true`, all
73-
/// duplicates of the same name are included, otherwise, only the first
74-
/// declared member is included.
75-
Iterator<T> filteredConstructorIterator<T extends MemberBuilder>(
76-
{required bool includeDuplicates});
7764
}
7865

7966
abstract class MutableDeclarationNameSpace
8067
implements DeclarationNameSpace, MutableNameSpace {
8168
void addConstructor(String name, MemberBuilder builder);
8269
}
8370

84-
base class NameSpaceImpl implements NameSpace, MutableNameSpace {
71+
base class NameSpaceImpl implements NameSpace, ComputedMutableNameSpace {
8572
Map<String, NamedBuilder>? _getables;
8673
Map<String, NamedBuilder>? _setables;
8774
Set<ExtensionBuilder>? _extensions;
@@ -96,7 +83,12 @@ base class NameSpaceImpl implements NameSpace, MutableNameSpace {
9683

9784
@override
9885
void addLocalMember(String name, NamedBuilder member,
99-
{required bool setter, bool allowReplace = false}) {
86+
{required bool setter}) {
87+
_addLocalMember(name, member, setter: setter, allowReplace: false);
88+
}
89+
90+
void _addLocalMember(String name, NamedBuilder member,
91+
{required bool setter, required bool allowReplace}) {
10092
if (setter) {
10193
assert(
10294
_setables == null ||
@@ -118,16 +110,27 @@ base class NameSpaceImpl implements NameSpace, MutableNameSpace {
118110
}
119111
}
120112

113+
@override
114+
void replaceLocalMember(String name, NamedBuilder member,
115+
{required bool setter}) {
116+
_addLocalMember(name, member, setter: setter, allowReplace: true);
117+
}
118+
121119
@override
122120
void addExtension(ExtensionBuilder builder) {
123121
(_extensions ??= {}).add(builder);
124122
}
125123

126124
@override
127-
Iterator<T> filteredIterator<T extends NamedBuilder>(
128-
{required bool includeDuplicates}) {
129-
return new FilteredIterator<T>(unfilteredIterator,
130-
includeDuplicates: includeDuplicates);
125+
Iterator<T> filteredIterator<T extends NamedBuilder>() {
126+
return new FilteredIterator<T>(
127+
new ScopeIterator(
128+
_getables?.values.iterator,
129+
_setables?.values.iterator,
130+
_extensions
131+
// Coverage-ignore(suite): Not run.
132+
?.iterator),
133+
includeDuplicates: false);
131134
}
132135

133136
@override
@@ -153,12 +156,6 @@ base class NameSpaceImpl implements NameSpace, MutableNameSpace {
153156
LookupResult? lookupLocalMember(String name) {
154157
return LookupResult.createResult(_getables?[name], _setables?[name]);
155158
}
156-
157-
@override
158-
Iterator<NamedBuilder> get unfilteredIterator => new ScopeIterator(
159-
_getables?.values.iterator,
160-
_setables?.values.iterator,
161-
_extensions?.iterator);
162159
}
163160

164161
final class SourceLibraryNameSpace extends NameSpaceImpl {
@@ -267,19 +264,6 @@ abstract base class DeclarationNameSpaceBase extends NameSpaceImpl
267264

268265
@override
269266
MemberBuilder? lookupConstructor(String name) => _constructors?[name];
270-
271-
/// Returns an iterator of all constructors mapped in this scope,
272-
/// including duplicate constructors mapped to the same name.
273-
@override
274-
Iterator<MemberBuilder> get unfilteredConstructorIterator =>
275-
new ConstructorNameSpaceIterator(_constructors?.values.iterator);
276-
277-
@override
278-
Iterator<T> filteredConstructorIterator<T extends MemberBuilder>(
279-
{required bool includeDuplicates}) {
280-
return new FilteredIterator<T>(unfilteredConstructorIterator,
281-
includeDuplicates: includeDuplicates);
282-
}
283267
}
284268

285269
final class SourceDeclarationNameSpace extends DeclarationNameSpaceBase {

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

+4-37
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import 'package:kernel/type_environment.dart';
99
import '../builder/builder.dart';
1010
import '../builder/declaration_builders.dart';
1111
import '../builder/library_builder.dart';
12-
import '../builder/member_builder.dart';
1312
import '../builder/metadata_builder.dart';
1413
import '../builder/prefix_builder.dart';
1514
import '../kernel/hierarchy/class_member.dart' show ClassMember;
@@ -275,7 +274,7 @@ class CompilationUnitScope extends BaseNameSpaceLookupScope {
275274
/// The scope containing the prefixes imported into a compilation unit.
276275
class CompilationUnitPrefixScope extends BaseNameSpaceLookupScope {
277276
@override
278-
final NameSpace _nameSpace;
277+
final ComputedNameSpace _nameSpace;
279278

280279
@override
281280
final LookupScope? _parent;
@@ -292,8 +291,7 @@ class CompilationUnitPrefixScope extends BaseNameSpaceLookupScope {
292291
void forEachExtension(void Function(ExtensionBuilder) f) {
293292
if (_extensions == null) {
294293
Set<ExtensionBuilder> extensions = _extensions = {};
295-
Iterator<PrefixBuilder> iterator =
296-
_nameSpace.filteredIterator(includeDuplicates: false);
294+
Iterator<PrefixBuilder> iterator = _nameSpace.filteredIterator();
297295
while (iterator.moveNext()) {
298296
iterator.current.forEachExtension((e) {
299297
extensions.add(e);
@@ -573,6 +571,7 @@ class ScopeIterator implements Iterator<NamedBuilder> {
573571
bool moveNext() {
574572
NamedBuilder? next = _current?.next;
575573
if (next != null) {
574+
// Coverage-ignore-block(suite): Not run.
576575
_current = next;
577576
return true;
578577
}
@@ -591,6 +590,7 @@ class ScopeIterator implements Iterator<NamedBuilder> {
591590
setters = null;
592591
}
593592
if (extensions != null) {
593+
// Coverage-ignore-block(suite): Not run.
594594
while (extensions!.moveNext()) {
595595
Builder extension = extensions!.current;
596596
// Named extensions have already been included throw [local] so we skip
@@ -614,39 +614,6 @@ class ScopeIterator implements Iterator<NamedBuilder> {
614614
}
615615
}
616616

617-
/// Iterator over builders mapped in a [ConstructorNameSpace], including
618-
/// duplicates for each directly mapped builder.
619-
class ConstructorNameSpaceIterator implements Iterator<MemberBuilder> {
620-
Iterator<MemberBuilder>? _local;
621-
622-
MemberBuilder? _current;
623-
624-
ConstructorNameSpaceIterator(this._local);
625-
626-
@override
627-
bool moveNext() {
628-
MemberBuilder? next = _current?.next as MemberBuilder?;
629-
if (next != null) {
630-
_current = next;
631-
return true;
632-
}
633-
if (_local != null) {
634-
if (_local!.moveNext()) {
635-
_current = _local!.current;
636-
return true;
637-
}
638-
_local = null;
639-
}
640-
return false;
641-
}
642-
643-
@override
644-
MemberBuilder get current {
645-
return _current ?? // Coverage-ignore(suite): Not run.
646-
(throw new StateError('No element'));
647-
}
648-
}
649-
650617
/// Filtered builder [Iterator].
651618
class FilteredIterator<T extends NamedBuilder> implements Iterator<T> {
652619
final Iterator<NamedBuilder> _iterator;

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

+1-43
Original file line numberDiff line numberDiff line change
@@ -6,49 +6,7 @@ part of 'declaration_builders.dart';
66

77
const Uri? noUri = null;
88

9-
abstract class ClassMemberAccess {
10-
/// [Iterator] for all constructors declared in this class or any of its
11-
/// augmentations.
12-
///
13-
/// Duplicates and augmenting constructor are _not_ included.
14-
///
15-
/// For instance:
16-
///
17-
/// class Class {
18-
/// Class(); // declared, so it is included
19-
/// Class.named(); // declared, so it is included
20-
/// Class.named(); // duplicate, so it is *not* included
21-
/// }
22-
///
23-
/// augment class Class {
24-
/// augment Class(); // augmenting, so it is *not* included
25-
/// Class.extra(); // declared, so it is included
26-
/// }
27-
///
28-
Iterator<T> fullConstructorIterator<T extends MemberBuilder>();
29-
30-
/// [Iterator] for all members declared in this class or any of its
31-
/// augmentations.
32-
///
33-
/// Duplicates and augmenting members are _not_ included.
34-
///
35-
/// For instance:
36-
///
37-
/// class Class {
38-
/// method() {} // Declared, so it is included.
39-
/// method2() {} // Declared, so it is included.
40-
/// method2() {} // Duplicate, so it is *not* included.
41-
/// }
42-
///
43-
/// augment class Class {
44-
/// augment method() {} // Augmenting, so it is *not* included.
45-
/// extra() {} // Declared, so it is included.
46-
/// }
47-
///
48-
Iterator<T> fullMemberIterator<T extends NamedBuilder>();
49-
}
50-
51-
abstract class ClassBuilder implements DeclarationBuilder, ClassMemberAccess {
9+
abstract class ClassBuilder implements DeclarationBuilder {
5210
/// The type in the `extends` clause of a class declaration.
5311
///
5412
/// Currently this also holds the synthesized super class for a mixin

pkg/front_end/lib/src/builder/declaration_builder.dart

+20
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,26 @@ abstract class IDeclarationBuilder implements ITypeDeclarationBuilder {
4343

4444
List<DartType> buildAliasedTypeArguments(LibraryBuilder library,
4545
List<TypeBuilder>? arguments, ClassHierarchyBase? hierarchy);
46+
47+
/// Returns an iterator of all members declared in this declaration, including
48+
/// duplicate declarations.
49+
Iterator<MemberBuilder> get unfilteredMembersIterator;
50+
51+
/// [Iterator] for all members declared in this declaration of type [T].
52+
///
53+
/// If [includeDuplicates] is `true`, duplicate declarations are included.
54+
Iterator<T> filteredMembersIterator<T extends MemberBuilder>(
55+
{required bool includeDuplicates});
56+
57+
/// Returns an iterator of all constructors declared in this declaration,
58+
/// including duplicate declarations.
59+
Iterator<MemberBuilder> get unfilteredConstructorsIterator;
60+
61+
/// [Iterator] for all constructors declared in this declaration of type [T].
62+
///
63+
/// If [includeDuplicates] is `true`, duplicate declarations are included.
64+
Iterator<T> filteredConstructorsIterator<T extends MemberBuilder>(
65+
{required bool includeDuplicates});
4666
}
4767

4868
abstract class DeclarationBuilderImpl extends TypeDeclarationBuilderImpl

pkg/front_end/lib/src/builder/extension_type_declaration_builder.dart

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44

55
part of 'declaration_builders.dart';
66

7-
abstract class ExtensionTypeDeclarationBuilder
8-
implements DeclarationBuilder, ClassMemberAccess {
7+
abstract class ExtensionTypeDeclarationBuilder implements DeclarationBuilder {
98
/// The type of the underlying representation.
109
DartType get declaredRepresentationType;
1110

pkg/front_end/lib/src/builder/library_builder.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ abstract class SourceCompilationUnit
319319
abstract class LibraryBuilder implements Builder, ProblemReporting {
320320
NameSpace get libraryNameSpace;
321321

322-
NameSpace get exportNameSpace;
322+
ComputedNameSpace get exportNameSpace;
323323

324324
List<Export> get exporters;
325325

pkg/front_end/lib/src/builder/prefix_builder.dart

+3-3
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ class PrefixBuilder extends NamedBuilderImpl implements LookupResult {
2222
@override
2323
final String name;
2424

25-
final MutableNameSpace _prefixNameSpace = new MutableNameSpace();
25+
final ComputedMutableNameSpace _prefixNameSpace =
26+
new ComputedMutableNameSpace();
2627

2728
late final LookupScope _prefixScope =
2829
new NameSpaceLookupScope(_prefixNameSpace, ScopeKind.library);
@@ -85,8 +86,7 @@ class PrefixBuilder extends NamedBuilderImpl implements LookupResult {
8586
NamedBuilder result = computeAmbiguousDeclarationForImport(
8687
parent, name, existing, member,
8788
uriOffset: new UriOffset(fileUri, prefixOffset));
88-
_prefixNameSpace.addLocalMember(name, result,
89-
setter: isSetter, allowReplace: true);
89+
_prefixNameSpace.replaceLocalMember(name, result, setter: isSetter);
9090
} else {
9191
_prefixNameSpace.addLocalMember(name, member, setter: isSetter);
9292
}

0 commit comments

Comments
 (0)