Skip to content

Commit 3b553b3

Browse files
johnniwintherCommit Queue
authored andcommitted
[cfe] Add Mutable(Declaration)NameSpace
This removes the mutators from the (Declaration)NameSpace interface and adds concrete subclasses for the various use cases. Change-Id: I0728acdd93659d2e118aadfe02749cee3a47afb5 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/427703 Reviewed-by: Chloe Stefantsova <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent 2ee0e99 commit 3b553b3

15 files changed

+193
-168
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import 'combinator.dart' show CombinatorBuilder;
1010
import 'uri_offset.dart';
1111

1212
class Export {
13-
/// The compilation unit that is exporting [exported];
14-
final CompilationUnit exporter;
13+
/// The compilation unit that is exporting [exported].
14+
final SourceCompilationUnit exporter;
1515

1616
/// The library being exported.
1717
CompilationUnit exportedCompilationUnit;

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

Lines changed: 46 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,6 @@ import 'scope.dart';
1313
import 'uris.dart';
1414

1515
abstract class NameSpace {
16-
void addLocalMember(String name, NamedBuilder member, {required bool setter});
17-
18-
/// Adds [builder] to the extensions in this name space.
19-
void addExtension(ExtensionBuilder builder);
20-
2116
/// Returns the [LookupResult] for the [Builder]s of the given [name] in the
2217
/// name space.
2318
///
@@ -54,11 +49,18 @@ abstract class NameSpace {
5449
{required bool includeDuplicates});
5550
}
5651

52+
abstract class MutableNameSpace implements NameSpace {
53+
factory MutableNameSpace() = NameSpaceImpl._;
54+
55+
void addLocalMember(String name, NamedBuilder member, {required bool setter});
56+
57+
/// Adds [builder] to the extensions in this name space.
58+
void addExtension(ExtensionBuilder builder);
59+
}
60+
5761
abstract class DeclarationNameSpace implements NameSpace {
5862
MemberBuilder? lookupConstructor(String name);
5963

60-
void addConstructor(String name, MemberBuilder builder);
61-
6264
/// Returns an iterator of all constructors mapped in this scope,
6365
/// including duplicate constructors mapped to the same name.
6466
Iterator<MemberBuilder> get unfilteredConstructorIterator;
@@ -73,12 +75,17 @@ abstract class DeclarationNameSpace implements NameSpace {
7375
{required bool includeDuplicates});
7476
}
7577

76-
class NameSpaceImpl implements NameSpace {
78+
abstract class MutableDeclarationNameSpace
79+
implements DeclarationNameSpace, MutableNameSpace {
80+
void addConstructor(String name, MemberBuilder builder);
81+
}
82+
83+
base class NameSpaceImpl implements NameSpace, MutableNameSpace {
7784
Map<String, NamedBuilder>? _getables;
7885
Map<String, NamedBuilder>? _setables;
7986
Set<ExtensionBuilder>? _extensions;
8087

81-
NameSpaceImpl(
88+
NameSpaceImpl._(
8289
{Map<String, NamedBuilder>? getables,
8390
Map<String, NamedBuilder>? setables,
8491
Set<ExtensionBuilder>? extensions})
@@ -139,6 +146,14 @@ class NameSpaceImpl implements NameSpace {
139146
_extensions?.iterator);
140147
}
141148

149+
final class SourceLibraryNameSpace extends NameSpaceImpl {
150+
SourceLibraryNameSpace(
151+
{required Map<String, NamedBuilder> super.getables,
152+
required Map<String, NamedBuilder> super.setables,
153+
required Set<ExtensionBuilder> super.extensions})
154+
: super._();
155+
}
156+
142157
// Coverage-ignore(suite): Not run.
143158
/// Returns a string with an error message if [sourceNameSpace] and
144159
/// [dillNameSpace] are not equivalent.
@@ -218,16 +233,17 @@ String? areNameSpacesEquivalent(
218233
return sb.toString();
219234
}
220235

221-
class DeclarationNameSpaceImpl extends NameSpaceImpl
222-
implements DeclarationNameSpace {
236+
abstract base class DeclarationNameSpaceBase extends NameSpaceImpl
237+
implements DeclarationNameSpace, MutableDeclarationNameSpace {
223238
Map<String, MemberBuilder>? _constructors;
224239

225-
DeclarationNameSpaceImpl(
240+
DeclarationNameSpaceBase._(
226241
{super.getables,
227242
super.setables,
228243
super.extensions,
229244
Map<String, MemberBuilder>? constructors})
230-
: _constructors = constructors;
245+
: _constructors = constructors,
246+
super._();
231247

232248
@override
233249
void addConstructor(String name, MemberBuilder builder) {
@@ -251,7 +267,21 @@ class DeclarationNameSpaceImpl extends NameSpaceImpl
251267
}
252268
}
253269

254-
abstract class LazyNameSpace extends NameSpaceImpl {
270+
final class SourceDeclarationNameSpace extends DeclarationNameSpaceBase {
271+
SourceDeclarationNameSpace(
272+
{required Map<String, NamedBuilder> super.getables,
273+
required Map<String, NamedBuilder> super.setables,
274+
required Map<String, MemberBuilder>? super.constructors})
275+
: super._();
276+
}
277+
278+
final class DillDeclarationNameSpace extends DeclarationNameSpaceBase {
279+
DillDeclarationNameSpace() : super._();
280+
}
281+
282+
abstract base class LazyNameSpace extends NameSpaceImpl {
283+
LazyNameSpace() : super._();
284+
255285
/// Override this method to lazily populate the scope before access.
256286
void ensureNameSpace();
257287

@@ -274,7 +304,7 @@ abstract class LazyNameSpace extends NameSpaceImpl {
274304
}
275305
}
276306

277-
class DillLibraryNameSpace extends LazyNameSpace {
307+
final class DillLibraryNameSpace extends LazyNameSpace {
278308
final DillLibraryBuilder _libraryBuilder;
279309

280310
DillLibraryNameSpace(this._libraryBuilder);
@@ -285,7 +315,7 @@ class DillLibraryNameSpace extends LazyNameSpace {
285315
}
286316
}
287317

288-
class DillExportNameSpace extends LazyNameSpace {
318+
final class DillExportNameSpace extends LazyNameSpace {
289319
final DillLibraryBuilder _libraryBuilder;
290320

291321
DillExportNameSpace(this._libraryBuilder);

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

Lines changed: 1 addition & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,28 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
6-
import 'package:front_end/src/builder/property_builder.dart';
76
import 'package:kernel/ast.dart' show Annotatable, Library, Version;
87
import 'package:kernel/reference_from_index.dart';
98

109
import '../api_prototype/experimental_flags.dart';
1110
import '../base/combinator.dart' show CombinatorBuilder;
1211
import '../base/export.dart' show Export;
1312
import '../base/loader.dart' show Loader;
14-
import '../base/lookup_result.dart';
1513
import '../base/messages.dart'
1614
show
1715
FormattedMessage,
1816
LocatedMessage,
1917
Message,
2018
ProblemReporting,
2119
noLength,
22-
templateDuplicatedExport,
2320
templateInternalProblemConstructorNotFound,
2421
templateInternalProblemNotFoundIn,
2522
templateInternalProblemPrivateConstructorAccess;
2623
import '../base/name_space.dart';
2724
import '../base/problems.dart' show internalProblem;
2825
import '../base/scope.dart';
29-
import '../base/uri_offset.dart';
3026
import '../fragment/fragment.dart';
3127
import '../kernel/body_builder_context.dart';
32-
import '../kernel/load_library_builder.dart';
3328
import '../source/offset_map.dart';
3429
import '../source/outline_builder.dart';
3530
import '../source/source_class_builder.dart';
@@ -83,7 +78,7 @@ sealed class CompilationUnit {
8378

8479
List<Export> get exporters;
8580

86-
void addExporter(CompilationUnit exporter,
81+
void addExporter(SourceCompilationUnit exporter,
8782
List<CombinatorBuilder>? combinators, int charOffset);
8883

8984
/// Add a problem with a severity determined by the severity of the message.
@@ -376,10 +371,6 @@ abstract class LibraryBuilder implements Builder, ProblemReporting {
376371
/// Duplicates and augmenting members are _not_ included.
377372
Iterator<T> fullMemberIterator<T extends NamedBuilder>();
378373

379-
/// Returns true if the export scope was modified.
380-
bool addToExportScope(String name, NamedBuilder member,
381-
{required UriOffset uriOffset});
382-
383374
/// Looks up [constructorName] in the class named [className].
384375
///
385376
/// The class is looked up in this library's export scope unless
@@ -478,92 +469,6 @@ abstract class LibraryBuilderImpl extends BuilderImpl
478469
problemOnLibrary: true);
479470
}
480471

481-
/// Computes a builder for the export collision between [declaration] and
482-
/// [other]. If [declaration] is declared in [libraryNameSpace] then this is
483-
/// returned instead of reporting a collision.
484-
NamedBuilder _computeAmbiguousDeclarationForExport(
485-
String name, NamedBuilder declaration, NamedBuilder other,
486-
{required UriOffset uriOffset}) {
487-
// Prefix builders and load library builders are not part of an export
488-
// scope.
489-
assert(declaration is! PrefixBuilder,
490-
"Unexpected prefix builder $declaration.");
491-
assert(other is! PrefixBuilder, "Unexpected prefix builder $other.");
492-
assert(declaration is! LoadLibraryBuilder,
493-
"Unexpected load library builder $declaration.");
494-
assert(other is! LoadLibraryBuilder,
495-
"Unexpected load library builder $other.");
496-
497-
if (declaration == other) return declaration;
498-
if (declaration is InvalidTypeDeclarationBuilder) return declaration;
499-
if (other is InvalidTypeDeclarationBuilder) return other;
500-
NamedBuilder? preferred;
501-
Uri? uri;
502-
Uri? otherUri;
503-
if (libraryNameSpace.lookupLocalMember(name)?.getable == declaration) {
504-
return declaration;
505-
} else {
506-
uri = computeLibraryUri(declaration);
507-
otherUri = computeLibraryUri(other);
508-
if (otherUri.isScheme("dart") && !uri.isScheme("dart")) {
509-
preferred = declaration;
510-
} else if (uri.isScheme("dart") && !otherUri.isScheme("dart")) {
511-
preferred = other;
512-
}
513-
}
514-
if (preferred != null) {
515-
return preferred;
516-
}
517-
518-
Uri firstUri = uri;
519-
Uri secondUri = otherUri;
520-
if (firstUri.toString().compareTo(secondUri.toString()) > 0) {
521-
firstUri = secondUri;
522-
secondUri = uri;
523-
}
524-
525-
// TODO(ahe): We should probably use a context object here
526-
// instead of including URIs in this message.
527-
Message message =
528-
templateDuplicatedExport.withArguments(name, firstUri, secondUri);
529-
addProblem(message, uriOffset.fileOffset, noLength, uriOffset.uri);
530-
// We report the error lazily (setting suppressMessage to false) because the
531-
// spec 18.1 states that 'It is not an error if N is introduced by two or
532-
// more imports but never referred to.'
533-
return new InvalidTypeDeclarationBuilder(name,
534-
message.withLocation(uriOffset.uri, uriOffset.fileOffset, name.length),
535-
suppressMessage: false);
536-
}
537-
538-
@override
539-
bool addToExportScope(String name, NamedBuilder member,
540-
{required UriOffset uriOffset}) {
541-
if (name.startsWith("_")) return false;
542-
if (member is PrefixBuilder) return false;
543-
bool isSetter = isMappedAsSetter(member);
544-
LookupResult? result = exportNameSpace.lookupLocalMember(name);
545-
NamedBuilder? existing = isSetter ? result?.setable : result?.getable;
546-
if (existing == member) {
547-
return false;
548-
} else {
549-
if (member is MemberBuilder && member.isConflictingSetter) {
550-
// TODO(johnniwinther): Remove this case when getables and setables are
551-
// contained in the same map in the name space.
552-
exportNameSpace.addLocalMember(name, member, setter: isSetter);
553-
return true;
554-
} else if (existing != null) {
555-
NamedBuilder result = _computeAmbiguousDeclarationForExport(
556-
name, existing, member,
557-
uriOffset: uriOffset);
558-
exportNameSpace.addLocalMember(name, result, setter: isSetter);
559-
return result != existing;
560-
} else {
561-
exportNameSpace.addLocalMember(name, member, setter: isSetter);
562-
return true;
563-
}
564-
}
565-
}
566-
567472
@override
568473
MemberBuilder getConstructor(String className,
569474
{String? constructorName, bool bypassLibraryPrivacy = false}) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class PrefixBuilder extends NamedBuilderImpl implements LookupResult {
2222
@override
2323
final String name;
2424

25-
final NameSpace _prefixNameSpace = new NameSpaceImpl();
25+
final MutableNameSpace _prefixNameSpace = new MutableNameSpace();
2626

2727
late final LookupScope _prefixScope =
2828
new NameSpaceLookupScope(_prefixNameSpace, ScopeKind.library);

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class DillClassBuilder extends ClassBuilderImpl
3636
@override
3737
final Class cls;
3838

39-
final DeclarationNameSpace _nameSpace;
39+
final MutableDeclarationNameSpace _nameSpace;
4040

4141
List<NominalParameterBuilder>? _typeParameters;
4242

@@ -45,7 +45,7 @@ class DillClassBuilder extends ClassBuilderImpl
4545
List<TypeBuilder>? _interfaceBuilders;
4646

4747
DillClassBuilder(this.cls, this.parent)
48-
: _nameSpace = new DeclarationNameSpaceImpl();
48+
: _nameSpace = new DillDeclarationNameSpace();
4949

5050
@override
5151
int get fileOffset => cls.fileOffset;

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ class DillExtensionBuilder extends ExtensionBuilderImpl
2020
@override
2121
final Extension extension;
2222

23-
final DeclarationNameSpace _nameSpace;
23+
final MutableDeclarationNameSpace _nameSpace;
2424

2525
List<NominalParameterBuilder>? _typeParameters;
2626
TypeBuilder? _onType;
2727

2828
DillExtensionBuilder(this.extension, this.libraryBuilder)
29-
: _nameSpace = new DeclarationNameSpaceImpl() {
29+
: _nameSpace = new DillDeclarationNameSpace() {
3030
for (ExtensionMemberDescriptor descriptor in extension.memberDescriptors) {
3131
if (descriptor.isInternalImplementation) continue;
3232

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class DillExtensionTypeDeclarationBuilder
2121

2222
final ExtensionTypeDeclaration _extensionTypeDeclaration;
2323

24-
final DeclarationNameSpace _nameSpace;
24+
final MutableDeclarationNameSpace _nameSpace;
2525

2626
List<NominalParameterBuilder>? _typeParameters;
2727

@@ -31,7 +31,7 @@ class DillExtensionTypeDeclarationBuilder
3131

3232
DillExtensionTypeDeclarationBuilder(
3333
this._extensionTypeDeclaration, this.libraryBuilder)
34-
: _nameSpace = new DeclarationNameSpaceImpl() {
34+
: _nameSpace = new DillDeclarationNameSpace() {
3535
for (Procedure procedure in _extensionTypeDeclaration.procedures) {
3636
String name = procedure.name.text;
3737
switch (procedure.kind) {

0 commit comments

Comments
 (0)