Skip to content

Commit b8638d9

Browse files
johnniwintherCommit Queue
authored andcommitted
[cfe] Add SyntheticDeclaration
This adds a SyntheticDeclaration interface and uses it to add enum values. Change-Id: I91b5a255032a5071dfc286358970d5d50108223b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/437223 Reviewed-by: Chloe Stefantsova <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent bb9252a commit b8638d9

17 files changed

+190
-115
lines changed

pkg/front_end/lib/src/kernel/hierarchy/members_node.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,9 @@ abstract class MembersNodeBuilder {
9494
declarationBuilder.fileUri,
9595
context: _inheritedConflictContext(a, b));
9696
}
97-
} else if (a.isStatic != b.isStatic) {
97+
}
98+
// Coverage-ignore(suite): Not run.
99+
else if (a.isStatic != b.isStatic) {
98100
ClassMember staticMember;
99101
ClassMember instanceMember;
100102
if (a.isStatic) {

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,9 +276,12 @@ class SourceClassBuilder extends ClassBuilderImpl
276276
containerType: ContainerType.Class,
277277
containerName: new ClassName(name),
278278
constructorBuilders: _constructorBuilders,
279-
memberBuilders: _memberBuilders);
279+
memberBuilders: _memberBuilders,
280+
syntheticDeclarations: createSyntheticDeclarations());
280281
}
281282

283+
Map<String, SyntheticDeclaration>? createSyntheticDeclarations() => null;
284+
282285
bool _hasComputedSupertypes = false;
283286

284287
void computeSupertypeBuilder({

pkg/front_end/lib/src/source/source_enum_builder.dart

Lines changed: 24 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ class SourceEnumBuilder extends SourceClassBuilder {
135135

136136
@override
137137
void buildScopes(LibraryBuilder coreLibrary) {
138+
_createTypeBuilders(coreLibrary);
138139
super.buildScopes(coreLibrary);
139140
_createSynthesizedMembers(coreLibrary);
140141

@@ -149,7 +150,20 @@ class SourceEnumBuilder extends SourceClassBuilder {
149150
}
150151
}
151152

152-
void _createSynthesizedMembers(LibraryBuilder coreLibrary) {
153+
@override
154+
Map<String, SyntheticDeclaration>? createSyntheticDeclarations() {
155+
_enumValuesFieldDeclaration =
156+
new _EnumValuesFieldDeclaration(this, listType);
157+
return {
158+
'values': new EnumValuesDeclaration(
159+
name: 'values',
160+
uriOffset: new UriOffset(fileUri, fileOffset),
161+
field: _enumValuesFieldDeclaration,
162+
getter: _enumValuesFieldDeclaration),
163+
};
164+
}
165+
166+
void _createTypeBuilders(LibraryBuilder coreLibrary) {
153167
// TODO(ahe): These types shouldn't be looked up in scope, they come
154168
// directly from dart:core.
155169
objectType = new NamedTypeBuilderImpl(
@@ -167,7 +181,9 @@ class SourceEnumBuilder extends SourceClassBuilder {
167181
arguments: <TypeBuilder>[selfType],
168182
instanceTypeParameterAccess:
169183
InstanceTypeParameterAccessState.Unexpected);
184+
}
170185

186+
void _createSynthesizedMembers(LibraryBuilder coreLibrary) {
171187
// metadata class E extends _Enum {
172188
// const E(int index, String name) : super(index, name);
173189
// static const E id0 = const E(0, 'id0');
@@ -183,36 +199,12 @@ class SourceEnumBuilder extends SourceClassBuilder {
183199
? new LibraryName(indexedClass!.library.reference)
184200
: libraryBuilder.libraryName;
185201

186-
NameScheme staticFieldNameScheme = new NameScheme(
187-
isInstanceMember: false,
188-
containerName: new ClassName(name),
189-
containerType: ContainerType.Class,
190-
libraryName: libraryName);
191-
192202
Reference? toStringReference;
193203
if (indexedClass != null) {
194204
toStringReference = indexedClass!.lookupGetterReference(
195205
new Name("_enumToString", coreLibrary.library));
196206
}
197207

198-
PropertyReferences valuesReferences = new PropertyReferences(
199-
"values", staticFieldNameScheme, indexedClass,
200-
fieldIsLateWithLowering: false);
201-
202-
NamedBuilder? customValuesDeclaration =
203-
nameSpace.lookupLocalMember("values")?.getable;
204-
if (customValuesDeclaration != null) {
205-
// Retrieve the earliest declaration for error reporting.
206-
while (customValuesDeclaration?.next != null) {
207-
customValuesDeclaration = customValuesDeclaration?.next;
208-
}
209-
libraryBuilder.addProblem(
210-
messageEnumContainsValuesDeclaration,
211-
customValuesDeclaration!.fileOffset,
212-
customValuesDeclaration.fullNameForErrors.length,
213-
fileUri);
214-
}
215-
216208
for (String restrictedInstanceMemberName in const [
217209
"index",
218210
"hashCode",
@@ -244,36 +236,6 @@ class SourceEnumBuilder extends SourceClassBuilder {
244236
}
245237
}
246238

247-
_enumValuesFieldDeclaration =
248-
new _EnumValuesFieldDeclaration(this, listType);
249-
250-
SourcePropertyBuilder valuesBuilder = new SourcePropertyBuilder(
251-
fileUri: fileUri,
252-
fileOffset: fileOffset,
253-
name: "values",
254-
libraryBuilder: libraryBuilder,
255-
declarationBuilder: this,
256-
nameScheme: staticFieldNameScheme,
257-
fieldDeclaration: _enumValuesFieldDeclaration,
258-
getterDeclaration: _enumValuesFieldDeclaration,
259-
getterAugmentations: const [],
260-
setterDeclaration: null,
261-
setterAugmentations: const [],
262-
references: valuesReferences,
263-
isStatic: true);
264-
_enumValuesFieldDeclaration.builder = valuesBuilder;
265-
266-
if (customValuesDeclaration != null) {
267-
customValuesDeclaration.next = valuesBuilder;
268-
nameSpaceBuilder.checkTypeParameterConflict(libraryBuilder,
269-
valuesBuilder.name, valuesBuilder, valuesBuilder.fileUri);
270-
addMemberInternal(valuesBuilder, addToNameSpace: false);
271-
} else {
272-
addMemberInternal(valuesBuilder, addToNameSpace: true);
273-
nameSpaceBuilder.checkTypeParameterConflict(libraryBuilder,
274-
valuesBuilder.name, valuesBuilder, valuesBuilder.fileUri);
275-
}
276-
277239
// The default constructor is added if no generative or unnamed factory
278240
// constructors are declared.
279241
bool needsSynthesizedDefaultConstructor = true;
@@ -354,7 +316,6 @@ class SourceEnumBuilder extends SourceClassBuilder {
354316
unboundNominalParameters: const [],
355317
encodingStrategy: encodingStrategy);
356318

357-
constructorBuilder.registerInitializedField(valuesBuilder);
358319
addConstructorInternal(constructorBuilder, addToNameSpace: true);
359320
nameSpaceBuilder.checkTypeParameterConflict(
360321
libraryBuilder,
@@ -387,11 +348,6 @@ class SourceEnumBuilder extends SourceClassBuilder {
387348
toStringBuilder.name, toStringBuilder, toStringBuilder.fileUri);
388349

389350
selfType.bind(libraryBuilder, this);
390-
391-
if (name == "values") {
392-
libraryBuilder.addProblem(
393-
messageEnumWithNameValues, this.fileOffset, name.length, fileUri);
394-
}
395351
}
396352

397353
@override
@@ -643,8 +599,9 @@ class _EnumValuesFieldDeclaration
643599
}
644600

645601
@override
646-
// Coverage-ignore(suite): Not run.
647-
void createFieldEncoding(SourcePropertyBuilder builder) {}
602+
void createFieldEncoding(SourcePropertyBuilder builder) {
603+
this.builder = builder;
604+
}
648605

649606
@override
650607
Initializer buildErroneousInitializer(Expression effect, Expression value,
@@ -705,12 +662,12 @@ class _EnumValuesFieldDeclaration
705662
isFinal: false,
706663
isConst: true,
707664
isStatic: true,
708-
fileUri: builder.fileUri,
665+
fileUri: uriOffset.fileUri,
709666
fieldReference: references.fieldReference,
710667
getterReference: references.getterReference,
711668
isEnumElement: false)
712-
..fileOffset = builder.fileOffset
713-
..fileEndOffset = builder.fileOffset;
669+
..fileOffset = uriOffset.fileOffset
670+
..fileEndOffset = uriOffset.fileOffset;
714671
nameScheme
715672
.getFieldMemberName(FieldNameType.Field, name, isSynthesized: false)
716673
.attachMember(_field!);
@@ -764,7 +721,6 @@ class _EnumValuesFieldDeclaration
764721
bool get isFinal => false;
765722

766723
@override
767-
// Coverage-ignore(suite): Not run.
768724
bool get isLate => false;
769725

770726
@override
@@ -838,7 +794,6 @@ class _EnumValuesFieldDeclaration
838794
}
839795

840796
@override
841-
// Coverage-ignore(suite): Not run.
842797
void createGetterEncoding(
843798
ProblemReporting problemReporting,
844799
SourcePropertyBuilder builder,
@@ -981,6 +936,7 @@ class _EnumValuesClassMember implements ClassMember {
981936
bool get isStatic => true;
982937

983938
@override
939+
// Coverage-ignore(suite): Not run.
984940
bool get isSynthesized => true;
985941

986942
@override

0 commit comments

Comments
 (0)