Skip to content

Commit 20f7737

Browse files
johnniwintherCommit Queue
authored andcommitted
[cfe] Compute name spaces for dill directly
This changes the computation of the name space for dill libraries and declarations to directly filling out the underlying maps. This is a step towards avoiding computation of lookup results for conflicting upon lookup. Name spaces from dill can have no conflicts so the computation is not needed. The remaining piece is name spaces for exports and prefixes. These also cannot have conflicts but instead of ambiguous lookups which only trigger errors on use. Change-Id: Ibe93620c66f4820027eb7b3e71fafab96c6b5ba6 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/441940 Reviewed-by: Chloe Stefantsova <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent f49d92a commit 20f7737

13 files changed

+579
-433
lines changed

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

Lines changed: 18 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,7 @@ abstract class LookupResult {
6666
/// instance members if [staticOnly] is `true`, and creates an
6767
/// [AmbiguousBuilder] for duplicates using [fileUri] and [fileOffset].
6868
static LookupResult? createProcessedResult(LookupResult? result,
69-
{required String name,
70-
required Uri fileUri,
71-
required int fileOffset,
72-
required bool staticOnly}) {
69+
{required String name, required Uri fileUri, required int fileOffset}) {
7370
if (result == null) return null;
7471
NamedBuilder? getable = result.getable;
7572
NamedBuilder? setable = result.setable;
@@ -80,26 +77,19 @@ abstract class LookupResult {
8077
getable = new AmbiguousBuilder(name, getable, fileOffset, fileUri);
8178
changed = true;
8279
}
83-
if (staticOnly && getable.isDeclarationInstanceMember) {
84-
getable = null;
85-
changed = true;
86-
}
8780
}
8881
if (setable != null) {
8982
if (setable.next != null) {
9083
// Coverage-ignore-block(suite): Not run.
9184
setable = new AmbiguousBuilder(name, setable, fileOffset, fileUri);
9285
changed = true;
9386
}
94-
if (staticOnly && setable.isDeclarationInstanceMember) {
95-
setable = null;
96-
changed = true;
97-
}
9887
}
9988
if (!changed) {
10089
return result;
10190
}
10291

92+
// Coverage-ignore(suite): Not run.
10393
return _fromBuilders(getable, setable, assertNoGetterSetterConflict: true);
10494
}
10595

@@ -155,32 +145,6 @@ abstract class LookupResult {
155145
}
156146
}
157147
}
158-
159-
static void addNamedBuilder(
160-
Map<String, LookupResult> content, String name, NamedBuilder member,
161-
{required bool setter}) {
162-
LookupResult? existing = content[name];
163-
if (existing != null) {
164-
if (setter) {
165-
assert(existing.getable != null,
166-
"No existing getable for $name: $existing, trying to add $member.");
167-
content[name] = new GetableSetableResult(existing.getable!, member);
168-
return;
169-
} else {
170-
assert(existing.setable != null,
171-
"No existing setable for $name: $existing, trying to add $member.");
172-
content[name] = new GetableSetableResult(member, existing.setable!);
173-
return;
174-
}
175-
}
176-
if (member is LookupResult) {
177-
content[name] = member as LookupResult;
178-
} else {
179-
// Coverage-ignore-block(suite): Not run.
180-
content[name] =
181-
setter ? new SetableResult(member) : new GetableResult(member);
182-
}
183-
}
184148
}
185149

186150
abstract class InvalidLookupResult implements LookupResult {
@@ -275,6 +239,22 @@ class GetableSetableResult with LookupResultMixin implements LookupResult {
275239
GetableSetableResult(this.getable, this.setable);
276240
}
277241

242+
class GetableSetableMemberResult
243+
with LookupResultMixin
244+
implements MemberLookupResult {
245+
@override
246+
final MemberBuilder getable;
247+
248+
@override
249+
final MemberBuilder setable;
250+
251+
@override
252+
final bool isStatic;
253+
254+
GetableSetableMemberResult(this.getable, this.setable,
255+
{required this.isStatic});
256+
}
257+
278258
mixin LookupResultMixin implements LookupResult {
279259
@override
280260
bool get isInvalidLookup =>

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

Lines changed: 28 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,10 @@ abstract class NameSpace {
1313
/// Returns the [LookupResult] for the [Builder]s of the given [name] in the
1414
/// name space.
1515
///
16-
/// If [staticOnly] is `true`, instance members are not returned.
17-
///
1816
/// If the [Builder]s are duplicates, an [AmbiguousBuilder] is created for
1917
/// the access, using the [fileUri] and [fileOffset].
2018
LookupResult? lookupLocal(String name,
21-
{required Uri fileUri,
22-
required int fileOffset,
23-
required bool staticOnly});
19+
{required Uri fileUri, required int fileOffset});
2420

2521
/// Returns the [LookupResult] for the [Builder]s of the given [name] in the
2622
/// name space.
@@ -57,49 +53,27 @@ abstract class ComputedMutableNameSpace
5753
}
5854

5955
abstract class DeclarationNameSpace implements NameSpace {
60-
MemberLookupResult? lookupConstructor(String name);
61-
}
62-
63-
abstract class MutableDeclarationNameSpace
64-
implements DeclarationNameSpace, MutableNameSpace {
65-
void addConstructor(String name, MemberLookupResult builder);
66-
}
67-
68-
base class NameSpaceImpl implements MutableNameSpace {
69-
Map<String, LookupResult>? _content;
70-
Set<ExtensionBuilder>? _extensions;
56+
final Map<String, MemberLookupResult> _content;
57+
final Map<String, MemberLookupResult> _constructors;
7158

72-
NameSpaceImpl._(
73-
{Map<String, LookupResult>? content, Set<ExtensionBuilder>? extensions})
59+
DeclarationNameSpace(
60+
{required Map<String, MemberLookupResult> content,
61+
required Map<String, MemberLookupResult> constructors})
7462
: _content = content,
75-
_extensions = extensions;
63+
_constructors = constructors;
7664

7765
@override
78-
void addLocalMember(String name, NamedBuilder member,
79-
{required bool setter}) {
80-
LookupResult.addNamedBuilder(_content ??= {}, name, member, setter: setter);
81-
}
66+
void forEachLocalExtension(void Function(ExtensionBuilder member) f) {}
8267

8368
@override
84-
// Coverage-ignore(suite): Not run.
85-
void forEachLocalExtension(void Function(ExtensionBuilder member) f) {
86-
_extensions?.forEach(f);
87-
}
69+
MemberLookupResult? lookupLocal(String name,
70+
{required Uri fileUri, required int fileOffset}) =>
71+
_content[name];
8872

8973
@override
90-
LookupResult? lookupLocal(String name,
91-
{required Uri fileUri,
92-
required int fileOffset,
93-
required bool staticOnly}) {
94-
return LookupResult.createProcessedResult(_content?[name],
95-
name: name,
96-
fileUri: fileUri,
97-
fileOffset: fileOffset,
98-
staticOnly: staticOnly);
99-
}
74+
MemberLookupResult? lookupLocalMember(String name) => _content[name];
10075

101-
@override
102-
LookupResult? lookupLocalMember(String name) => _content?[name];
76+
MemberLookupResult? lookupConstructor(String name) => _constructors[name];
10377
}
10478

10579
base class ComputedMutableNameSpaceImpl implements ComputedMutableNameSpace {
@@ -207,31 +181,25 @@ base class ComputedMutableNameSpaceImpl implements ComputedMutableNameSpace {
207181

208182
@override
209183
LookupResult? lookupLocal(String name,
210-
{required Uri fileUri,
211-
required int fileOffset,
212-
required bool staticOnly}) {
184+
{required Uri fileUri, required int fileOffset}) {
213185
return LookupResult.createProcessedResult(_content?[name],
214-
name: name,
215-
fileUri: fileUri,
216-
fileOffset: fileOffset,
217-
staticOnly: staticOnly);
186+
name: name, fileUri: fileUri, fileOffset: fileOffset);
218187
}
219188

220189
@override
221190
LookupResult? lookupLocalMember(String name) => _content?[name];
222191
}
223192

224-
final class SourceLibraryNameSpace implements NameSpace {
193+
final class LibraryNameSpace implements NameSpace {
225194
final Map<String, LookupResult> _content;
226-
Set<ExtensionBuilder>? _extensions;
195+
final Set<ExtensionBuilder>? _extensions;
227196

228-
SourceLibraryNameSpace(
197+
LibraryNameSpace(
229198
{required Map<String, LookupResult> content,
230199
required Set<ExtensionBuilder> extensions})
231200
: _content = content,
232201
_extensions = extensions;
233202

234-
// Coverage-ignore(suite): Not run.
235203
void addLocalMember(String name, LookupResult member) {
236204
assert(!_content.containsKey(name),
237205
"Unexpected replacement of ${_content[name]} by $member.");
@@ -245,9 +213,7 @@ final class SourceLibraryNameSpace implements NameSpace {
245213

246214
@override
247215
LookupResult? lookupLocal(String name,
248-
{required Uri fileUri,
249-
required int fileOffset,
250-
required bool staticOnly}) {
216+
{required Uri fileUri, required int fileOffset}) {
251217
return _content[name];
252218
}
253219

@@ -325,37 +291,15 @@ String? areNameSpacesEquivalent(
325291
return sb.toString();
326292
}
327293

328-
abstract base class DeclarationNameSpaceBase extends NameSpaceImpl
329-
implements DeclarationNameSpace, MutableDeclarationNameSpace {
330-
Map<String, MemberLookupResult>? _constructors;
331-
332-
DeclarationNameSpaceBase._(
333-
{super.content,
334-
super.extensions,
335-
Map<String, MemberLookupResult>? constructors})
336-
: _constructors = constructors,
337-
super._();
338-
339-
@override
340-
void addConstructor(String name, MemberLookupResult constructor) {
341-
(_constructors ??= {})[name] = constructor;
342-
}
343-
344-
@override
345-
MemberLookupResult? lookupConstructor(String name) => _constructors?[name];
346-
}
347-
348-
final class SourceDeclarationNameSpace implements DeclarationNameSpace {
349-
final Map<String, MemberLookupResult> _content;
350-
final Map<String, MemberLookupResult> _constructors;
351-
294+
final class SourceDeclarationNameSpace extends DeclarationNameSpace {
352295
SourceDeclarationNameSpace(
353-
{required Map<String, MemberLookupResult> content,
354-
required Map<String, MemberLookupResult> constructors})
355-
: _content = content,
356-
_constructors = constructors;
296+
{required super.content, required super.constructors});
357297

358298
void addConstructor(String name, MemberLookupResult constructor) {
299+
assert(
300+
!_constructors.containsKey(name),
301+
"Unexpected existing constructor ${_constructors[name]}, "
302+
"trying to add ${constructor}.");
359303
_constructors[name] = constructor;
360304
}
361305

@@ -364,35 +308,11 @@ final class SourceDeclarationNameSpace implements DeclarationNameSpace {
364308
"Unexpected replacement of ${_content[name]} by $member.");
365309
_content[name] = member;
366310
}
367-
368-
@override
369-
void forEachLocalExtension(void Function(ExtensionBuilder member) f) {}
370-
371-
@override
372-
MemberLookupResult? lookupLocal(String name,
373-
{required Uri fileUri,
374-
required int fileOffset,
375-
required bool staticOnly}) {
376-
MemberLookupResult? result = _content[name];
377-
if (staticOnly && result != null && !result.isStatic) {
378-
result = null;
379-
}
380-
return result;
381-
}
382-
383-
@override
384-
LookupResult? lookupLocalMember(String name) => _content[name];
385-
386-
@override
387-
MemberLookupResult? lookupConstructor(String name) => _constructors[name];
388-
}
389-
390-
final class DillDeclarationNameSpace extends DeclarationNameSpaceBase {
391-
DillDeclarationNameSpace() : super._();
392311
}
393312

394-
final class DillLibraryNameSpace extends ComputedMutableNameSpaceImpl {
395-
DillLibraryNameSpace() : super._();
313+
final class DillDeclarationNameSpace extends DeclarationNameSpace {
314+
DillDeclarationNameSpace(
315+
{required super.content, required super.constructors});
396316
}
397317

398318
final class DillExportNameSpace extends ComputedMutableNameSpaceImpl {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ abstract class BaseNameSpaceLookupScope implements LookupScope {
141141
@override
142142
LookupResult? lookup(String name, int fileOffset, Uri fileUri) {
143143
return _nameSpace.lookupLocal(name,
144-
fileUri: fileUri, fileOffset: fileOffset, staticOnly: false) ??
144+
fileUri: fileUri, fileOffset: fileOffset) ??
145145
_parent?.lookup(name, fileOffset, fileUri);
146146
}
147147

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,18 @@ import 'type_builder.dart';
2121
mixin DeclarationBuilderMixin implements IDeclarationBuilder {
2222
/// Lookup a static member of this declaration.
2323
@override
24-
LookupResult? findStaticBuilder(String name, int fileOffset, Uri fileUri,
25-
LibraryBuilder accessingLibrary) {
24+
MemberLookupResult? findStaticBuilder(String name, int fileOffset,
25+
Uri fileUri, LibraryBuilder accessingLibrary) {
2626
if (accessingLibrary.nameOriginBuilder !=
2727
libraryBuilder.nameOriginBuilder &&
2828
name.startsWith("_")) {
2929
return null;
3030
}
31-
return nameSpace.lookupLocal(name,
32-
fileUri: fileUri, fileOffset: fileOffset, staticOnly: true);
31+
MemberLookupResult? result = nameSpace.lookupLocalMember(name);
32+
if (result != null && !result.isStatic) {
33+
result = null;
34+
}
35+
return result;
3336
}
3437

3538
@override

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ abstract class IDeclarationBuilder implements ITypeDeclarationBuilder {
1818
Uri get fileUri;
1919

2020
/// Lookup a member accessed statically through this declaration.
21-
LookupResult? findStaticBuilder(String name, int fileOffset, Uri fileUri,
22-
LibraryBuilder accessingLibrary);
21+
MemberLookupResult? findStaticBuilder(String name, int fileOffset,
22+
Uri fileUri, LibraryBuilder accessingLibrary);
2323

2424
MemberLookupResult? findConstructorOrFactory(
2525
String name, LibraryBuilder accessingLibrary);

0 commit comments

Comments
 (0)