Skip to content

Commit 2f27b68

Browse files
johnniwintherCommit Queue
authored andcommitted
[cfe] Cleanup NameSpace
This remove part of the NameSpace to avoid an overreliance on its implementation. This is done in preparation for hold the name space content in a single map instead of a separate map for getables and setables. The NamedBuilder interfaces is added to use for Builders that can be mapped in name spaces. This avoids the need for the NameIterator and all the associated methods. Change-Id: Ia547bdc8ddcb83f47473b51a2059428b352f8916 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/428001 Commit-Queue: Johnni Winther <[email protected]> Reviewed-by: Chloe Stefantsova <[email protected]>
1 parent ba40dce commit 2f27b68

Some content is hidden

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

49 files changed

+465
-835
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class Export {
3131
/// This set in [SourceLibraryBuilder._addDependencies].
3232
late final LibraryDependency libraryDependency;
3333

34-
bool addToExportScope(String name, Builder member) {
34+
bool addToExportScope(String name, NamedBuilder member) {
3535
if (combinators != null) {
3636
for (CombinatorBuilder combinator in combinators!) {
3737
if (combinator.isShow && !combinator.names.contains(name)) return false;

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

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import 'package:kernel/ast.dart' show LibraryDependency;
66

77
import '../builder/builder.dart';
88
import '../builder/library_builder.dart';
9-
import '../builder/name_iterator.dart';
109
import '../builder/prefix_builder.dart';
1110
import '../source/source_library_builder.dart';
1211
import 'combinator.dart' show CombinatorBuilder;
@@ -69,11 +68,11 @@ class Import {
6968
void finalizeImports(SourceCompilationUnit importer) {
7069
if (nativeImportPath != null) return;
7170

72-
void Function(String, Builder) add;
71+
void Function(String, NamedBuilder) add;
7372

7473
PrefixFragment? prefixFragment = this.prefixFragment;
7574
if (prefixFragment == null) {
76-
add = (String name, Builder builder) {
75+
add = (String name, NamedBuilder builder) {
7776
importer.addImportedBuilderToScope(
7877
name: name, builder: builder, charOffset: importOffset);
7978
};
@@ -86,16 +85,16 @@ class Import {
8685
charOffset: prefixOffset);
8786
}
8887

89-
add = (String name, Builder member) {
88+
add = (String name, NamedBuilder member) {
9089
prefixFragment.builder.addToPrefixScope(name, member,
9190
importOffset: importOffset, prefixOffset: prefixOffset);
9291
};
9392
}
94-
NameIterator<Builder> iterator = importedLibraryBuilder!.exportNameSpace
95-
.filteredNameIterator(includeDuplicates: false);
93+
Iterator<NamedBuilder> iterator = importedLibraryBuilder!.exportNameSpace
94+
.filteredIterator(includeDuplicates: false);
9695
while (iterator.moveNext()) {
97-
String name = iterator.name;
98-
Builder member = iterator.current;
96+
NamedBuilder member = iterator.current;
97+
String name = member.name;
9998
bool include = true;
10099
if (combinators != null) {
101100
for (CombinatorBuilder combinator in combinators!) {

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

Lines changed: 30 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'dart:typed_data';
88

99
import 'package:_fe_analyzer_shared/src/scanner/abstract_scanner.dart'
1010
show ScannerConfiguration;
11+
import 'package:front_end/src/base/name_space.dart';
1112
import 'package:kernel/binary/ast_from_binary.dart'
1213
show
1314
BinaryBuilderWithMetadata,
@@ -65,13 +66,12 @@ import '../api_prototype/incremental_kernel_generator.dart'
6566
import '../api_prototype/lowering_predicates.dart'
6667
show isExtensionThisName, syntheticThisName;
6768
import '../api_prototype/memory_file_system.dart' show MemoryFileSystem;
68-
import '../builder/builder.dart' show Builder;
69+
import '../builder/builder.dart' show Builder, NamedBuilder;
6970
import '../builder/declaration_builders.dart'
7071
show ClassBuilder, ExtensionBuilder, ExtensionTypeDeclarationBuilder;
7172
import '../builder/library_builder.dart'
7273
show CompilationUnit, LibraryBuilder, SourceCompilationUnit;
7374
import '../builder/member_builder.dart' show MemberBuilder;
74-
import '../builder/name_iterator.dart' show NameIterator;
7575
import '../builder/property_builder.dart';
7676
import '../codes/cfe_codes.dart';
7777
import '../dill/dill_class_builder.dart' show DillClassBuilder;
@@ -99,10 +99,9 @@ import 'compiler_context.dart' show CompilerContext;
9999
import 'hybrid_file_system.dart' show HybridFileSystem;
100100
import 'incremental_serializer.dart' show IncrementalSerializer;
101101
import 'library_graph.dart' show LibraryGraph;
102-
import 'lookup_result.dart';
103102
import 'ticker.dart' show Ticker;
104103
import 'uri_translator.dart' show UriTranslator;
105-
import 'uris.dart' show dartCore, getPartUri;
104+
import 'uris.dart' show getPartUri;
106105

107106
final Uri dartFfiUri = Uri.parse("dart:ffi");
108107

@@ -594,10 +593,11 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
594593
/// source builders. Patch that up.
595594
596595
// Maps from old library builder to map of new content.
597-
Map<LibraryBuilder, Map<String, Builder>>? replacementMap = {};
596+
Map<LibraryBuilder, Map<String, NamedBuilder>>? replacementMap = {};
598597

599598
// Maps from old library builder to map of new content.
600-
Map<LibraryBuilder, Map<String, Builder>>? replacementSettersMap = {};
599+
Map<LibraryBuilder, Map<String, NamedBuilder>>? replacementSettersMap =
600+
{};
601601

602602
_experimentalInvalidationFillReplacementMaps(
603603
convertedLibraries!, replacementMap, replacementSettersMap);
@@ -609,10 +609,10 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
609609

610610
// Clear cached calculations that points (potential) to now replaced
611611
// things.
612-
for (Builder builder in builder.libraryNameSpace.localMembers) {
613-
if (builder is DillClassBuilder) {
614-
builder.clearCachedValues();
615-
}
612+
Iterator<DillClassBuilder> iterator = builder.libraryNameSpace
613+
.filteredIterator(includeDuplicates: true);
614+
while (iterator.moveNext()) {
615+
iterator.current.clearCachedValues();
616616
}
617617
}
618618
}
@@ -652,62 +652,10 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
652652
// Coverage-ignore(suite): Not run.
653653
String? _hasEquivalentScopes(SourceLibraryBuilder sourceLibraryBuilder,
654654
DillLibraryBuilder dillLibraryBuilder) {
655-
bool isEquivalent = true;
656-
StringBuffer sb = new StringBuffer();
657-
sb.writeln('Mismatch on ${sourceLibraryBuilder.importUri}:');
658-
sourceLibraryBuilder.exportNameSpace
659-
.forEachLocalMember((String name, Builder sourceBuilder) {
660-
Builder? dillBuilder =
661-
dillLibraryBuilder.exportNameSpace.lookupLocalMember(name)?.getable;
662-
if (dillBuilder == null) {
663-
if ((name == 'dynamic' || name == 'Never') &&
664-
sourceLibraryBuilder.importUri == dartCore) {
665-
// The source library builder for dart:core has synthetically
666-
// injected builders for `dynamic` and `Never` which do not have
667-
// corresponding classes in the AST.
668-
return;
669-
}
670-
sb.writeln('No dill builder for ${name}: $sourceBuilder');
671-
isEquivalent = false;
672-
}
673-
});
674-
dillLibraryBuilder.exportNameSpace
675-
.forEachLocalMember((String name, Builder dillBuilder) {
676-
Builder? sourceBuilder =
677-
sourceLibraryBuilder.exportNameSpace.lookupLocalMember(name)?.getable;
678-
if (sourceBuilder == null) {
679-
sb.writeln('No source builder for ${name}: $dillBuilder');
680-
isEquivalent = false;
681-
}
682-
});
683-
sourceLibraryBuilder.exportNameSpace
684-
.forEachLocalSetter((String name, Builder sourceBuilder) {
685-
Builder? dillBuilder =
686-
dillLibraryBuilder.exportNameSpace.lookupLocalMember(name)?.setable;
687-
if (dillBuilder == null) {
688-
sb.writeln('No dill builder for ${name}=: $sourceBuilder');
689-
isEquivalent = false;
690-
}
691-
});
692-
dillLibraryBuilder.exportNameSpace
693-
.forEachLocalSetter((String name, Builder dillBuilder) {
694-
LookupResult? result =
695-
sourceLibraryBuilder.exportNameSpace.lookupLocalMember(name);
696-
Builder? sourceBuilder = result?.setable;
697-
if (sourceBuilder == null) {
698-
sourceBuilder = result?.getable;
699-
if (sourceBuilder is PropertyBuilder && sourceBuilder.hasSetter) {
700-
// Assignable fields can be lowered into a getter and setter.
701-
return;
702-
}
703-
sb.writeln('No source builder for ${name}=: $dillBuilder');
704-
isEquivalent = false;
705-
}
706-
});
707-
if (isEquivalent) {
708-
return null;
709-
}
710-
return sb.toString();
655+
return areNameSpacesEquivalent(
656+
importUri: sourceLibraryBuilder.importUri,
657+
sourceNameSpace: sourceLibraryBuilder.exportNameSpace,
658+
dillNameSpace: dillLibraryBuilder.exportNameSpace);
711659
}
712660

713661
/// Compute which libraries to output and which (previous) errors/warnings we
@@ -819,24 +767,24 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
819767
/// happen because of experimental invalidation.
820768
void _experimentalInvalidationFillReplacementMaps(
821769
Map<LibraryBuilder, CompilationUnit> rebuildBodiesMap,
822-
Map<LibraryBuilder, Map<String, Builder>> replacementMap,
823-
Map<LibraryBuilder, Map<String, Builder>> replacementSettersMap) {
770+
Map<LibraryBuilder, Map<String, NamedBuilder>> replacementMap,
771+
Map<LibraryBuilder, Map<String, NamedBuilder>> replacementSettersMap) {
824772
for (MapEntry<LibraryBuilder, CompilationUnit> entry
825773
in rebuildBodiesMap.entries) {
826-
Map<String, Builder> childReplacementMap = {};
827-
Map<String, Builder> childReplacementSettersMap = {};
774+
Map<String, NamedBuilder> childReplacementMap = {};
775+
Map<String, NamedBuilder> childReplacementSettersMap = {};
828776
CompilationUnit mainCompilationUnit = rebuildBodiesMap[entry.key]!;
829777
replacementMap[entry.key] = childReplacementMap;
830778
replacementSettersMap[entry.key] = childReplacementSettersMap;
831-
NameIterator iterator =
832-
mainCompilationUnit.libraryBuilder.localMembersNameIterator;
779+
Iterator<NamedBuilder> iterator =
780+
mainCompilationUnit.libraryBuilder.localMembersIterator;
833781
while (iterator.moveNext()) {
834-
Builder childBuilder = iterator.current;
782+
NamedBuilder childBuilder = iterator.current;
835783
if (childBuilder is SourceExtensionBuilder &&
836784
childBuilder.isUnnamedExtension) {
837785
continue;
838786
}
839-
String name = iterator.name;
787+
String name = childBuilder.name;
840788
Map<String, Builder> map;
841789
if (isMappedAsSetter(childBuilder)) {
842790
map = childReplacementSettersMap;
@@ -889,10 +837,10 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
889837
Map<DillLibraryBuilder, CompilationUnit> rebuildBodiesMap) {
890838
if (experimentalInvalidation != null) {
891839
// Maps from old library builder to map of new content.
892-
Map<LibraryBuilder, Map<String, Builder>> replacementMap = {};
840+
Map<LibraryBuilder, Map<String, NamedBuilder>> replacementMap = {};
893841

894842
// Maps from old library builder to map of new content.
895-
Map<LibraryBuilder, Map<String, Builder>> replacementSettersMap = {};
843+
Map<LibraryBuilder, Map<String, NamedBuilder>> replacementSettersMap = {};
896844

897845
_experimentalInvalidationFillReplacementMaps(
898846
rebuildBodiesMap, replacementMap, replacementSettersMap);
@@ -961,10 +909,10 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
961909
if (builder.isBuiltAndMarked) {
962910
// Clear cached calculations in classes which upon calculation can
963911
// mark things as needed.
964-
for (Builder builder in builder.libraryNameSpace.localMembers) {
965-
if (builder is DillClassBuilder) {
966-
builder.clearCachedValues();
967-
}
912+
Iterator<DillClassBuilder> iterator = builder.libraryNameSpace
913+
.filteredIterator(includeDuplicates: true);
914+
while (iterator.moveNext()) {
915+
iterator.current.clearCachedValues();
968916
}
969917
builder.isBuiltAndMarked = false;
970918
}
@@ -1883,7 +1831,7 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
18831831
packageLanguageVersion:
18841832
new ImplicitLanguageVersion(libraryBuilder.languageVersion),
18851833
loader: lastGoodKernelTarget.loader,
1886-
nameOrigin: libraryBuilder,
1834+
resolveInLibrary: libraryBuilder,
18871835
isUnsupported: libraryBuilder.isUnsupported,
18881836
forAugmentationLibrary: false,
18891837
forPatchLibrary: false,
@@ -1897,17 +1845,6 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
18971845

18981846
SourceLibraryBuilder debugLibrary = debugCompilationUnit.createLibrary();
18991847
debugLibrary.buildNameSpace();
1900-
libraryBuilder.libraryNameSpace.forEachLocalMember((name, member) {
1901-
debugLibrary.libraryNameSpace
1902-
.addLocalMember(name, member, setter: false);
1903-
});
1904-
libraryBuilder.libraryNameSpace.forEachLocalSetter((name, member) {
1905-
debugLibrary.libraryNameSpace
1906-
.addLocalMember(name, member, setter: true);
1907-
});
1908-
libraryBuilder.libraryNameSpace.forEachLocalExtension((member) {
1909-
debugLibrary.libraryNameSpace.addExtension(member);
1910-
});
19111848
debugLibrary.buildScopes(lastGoodKernelTarget.loader.coreLibrary);
19121849
_ticker.logMs("Created debug library");
19131850

@@ -1939,15 +1876,14 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
19391876
debugLibrary.addImportsToScope();
19401877
_ticker.logMs("Added imports");
19411878
}
1942-
SourceCompilationUnit? orgCompilationUnit = debugCompilationUnit;
19431879
debugCompilationUnit = new SourceCompilationUnitImpl(
19441880
importUri: libraryUri,
19451881
fileUri: debugExprUri,
19461882
originImportUri: libraryUri,
19471883
packageLanguageVersion:
19481884
new ImplicitLanguageVersion(libraryBuilder.languageVersion),
19491885
loader: lastGoodKernelTarget.loader,
1950-
nameOrigin: libraryBuilder,
1886+
resolveInLibrary: libraryBuilder,
19511887
parentScope: debugCompilationUnit.compilationUnitScope,
19521888
isUnsupported: libraryBuilder.isUnsupported,
19531889
forAugmentationLibrary: false,
@@ -1962,24 +1898,6 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
19621898

19631899
debugLibrary = debugCompilationUnit.createLibrary();
19641900

1965-
// Copy over the prefix namespace for extensions
1966-
// (`forEachExtensionInScope`) to be found when imported via prefixes.
1967-
// TODO(johnniwinther): Do we still need these with the new scope
1968-
// structure?
1969-
orgCompilationUnit.prefixNameSpace.forEachLocalMember((name, member) {
1970-
debugCompilationUnit.prefixNameSpace
1971-
.addLocalMember(name, member, setter: false);
1972-
});
1973-
// Does a prefix namespace ever have anything but locals?
1974-
orgCompilationUnit.prefixNameSpace.forEachLocalSetter((name, member) {
1975-
debugCompilationUnit.prefixNameSpace
1976-
.addLocalMember(name, member, setter: true);
1977-
});
1978-
orgCompilationUnit.prefixNameSpace.forEachLocalExtension((member) {
1979-
debugCompilationUnit.prefixNameSpace.addExtension(member);
1980-
});
1981-
orgCompilationUnit = null;
1982-
19831901
HybridFileSystem hfs =
19841902
lastGoodKernelTarget.fileSystem as HybridFileSystem;
19851903
MemoryFileSystem fs = hfs.memory;

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

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,17 @@ import '../builder/member_builder.dart';
77
import 'scope.dart';
88

99
abstract class LookupResult {
10-
/// The [Builder] used for reading this entity, if any.
11-
Builder? get getable;
10+
/// The [NamedBuilder] used for reading this entity, if any.
11+
NamedBuilder? get getable;
1212

13-
/// The [Builder] used for writing to this entity, if any.
14-
Builder? get setable;
13+
/// The [NamedBuilder] used for writing to this entity, if any.
14+
NamedBuilder? get setable;
1515

1616
/// Creates a [LookupResult] for [getable] and [setable] which filters
1717
/// instance members if [staticOnly] is `true`, and creates an
1818
/// [AmbiguousBuilder] for duplicates using [fileUri] and [fileOffset].
19-
static LookupResult? createProcessedResult(Builder? getable, Builder? setable,
19+
static LookupResult? createProcessedResult(
20+
NamedBuilder? getable, NamedBuilder? setable,
2021
{required String name,
2122
required Uri fileUri,
2223
required int fileOffset,
@@ -50,11 +51,13 @@ abstract class LookupResult {
5051
return _fromBuilders(getable, setable, assertNoGetterSetterConflict: true);
5152
}
5253

53-
static LookupResult? createResult(Builder? getable, Builder? setable) {
54+
static LookupResult? createResult(
55+
NamedBuilder? getable, NamedBuilder? setable) {
5456
return _fromBuilders(getable, setable, assertNoGetterSetterConflict: false);
5557
}
5658

57-
static LookupResult? _fromBuilders(Builder? getable, Builder? setable,
59+
static LookupResult? _fromBuilders(
60+
NamedBuilder? getable, NamedBuilder? setable,
5861
{required bool assertNoGetterSetterConflict}) {
5962
if (getable is LookupResult) {
6063
LookupResult lookupResult = getable as LookupResult;
@@ -98,30 +101,30 @@ abstract class LookupResult {
98101

99102
class GetableResult implements LookupResult {
100103
@override
101-
final Builder getable;
104+
final NamedBuilder getable;
102105

103106
GetableResult(this.getable);
104107

105108
@override
106-
Builder? get setable => null;
109+
NamedBuilder? get setable => null;
107110
}
108111

109112
class SetableResult implements LookupResult {
110113
@override
111-
final Builder setable;
114+
final NamedBuilder setable;
112115

113116
SetableResult(this.setable);
114117

115118
@override
116-
Builder? get getable => null;
119+
NamedBuilder? get getable => null;
117120
}
118121

119122
class GetableSetableResult implements LookupResult {
120123
@override
121-
final Builder getable;
124+
final NamedBuilder getable;
122125

123126
@override
124-
final Builder setable;
127+
final NamedBuilder setable;
125128

126129
GetableSetableResult(this.getable, this.setable);
127130
}

0 commit comments

Comments
 (0)