[cfe] Create declarations directly in _PropertyPreBuilder
This is done in preparation for including synthetic declarations in
the same SourcePropertyBuilder is the corresponding user defined aspect.
Change-Id: I26928301d710682dd2301122df159a3a941c0e6a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/431502
Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
diff --git a/pkg/front_end/lib/src/fragment/getter/declaration.dart b/pkg/front_end/lib/src/fragment/getter/declaration.dart
index dd2a7de..26757ac 100644
--- a/pkg/front_end/lib/src/fragment/getter/declaration.dart
+++ b/pkg/front_end/lib/src/fragment/getter/declaration.dart
@@ -34,7 +34,7 @@
abstract class GetterDeclaration {
Uri get fileUri;
- UriOffsetLength? get uriOffset;
+ UriOffsetLength get uriOffset;
GetterQuality get getterQuality;
diff --git a/pkg/front_end/lib/src/fragment/setter/declaration.dart b/pkg/front_end/lib/src/fragment/setter/declaration.dart
index 39df426..b925523 100644
--- a/pkg/front_end/lib/src/fragment/setter/declaration.dart
+++ b/pkg/front_end/lib/src/fragment/setter/declaration.dart
@@ -34,7 +34,7 @@
abstract class SetterDeclaration {
Uri get fileUri;
- UriOffsetLength? get uriOffset;
+ UriOffsetLength get uriOffset;
List<MetadataBuilder>? get metadata;
diff --git a/pkg/front_end/lib/src/source/type_parameter_scope_builder.dart b/pkg/front_end/lib/src/source/type_parameter_scope_builder.dart
index e4f976c..c0cfbdc 100644
--- a/pkg/front_end/lib/src/source/type_parameter_scope_builder.dart
+++ b/pkg/front_end/lib/src/source/type_parameter_scope_builder.dart
@@ -140,32 +140,70 @@
final String name;
final UriOffsetLength uriOffset;
final bool isStatic;
- _FragmentName? getter;
- _FragmentName? setter;
- List<_FragmentName> augmentations = [];
+ FieldDeclaration? _field;
+ GetterDeclaration? _getter;
+ _PropertyKind? _getterPropertyKind;
+ SetterDeclaration? _setter;
+ _PropertyKind? _setterPropertyKind;
+ List<GetterDeclaration> _getterAugmentations = [];
+ List<SetterDeclaration> _setterAugmentations = [];
// TODO(johnniwinther): Report error if [getter] is augmenting.
- _PropertyPreBuilder.forGetter(_FragmentName this.getter)
+ _PropertyPreBuilder.forGetter(_FragmentName getter)
: isStatic = getter.isStatic,
inPatch = getter.inPatch,
name = getter.name,
- uriOffset = getter.fragment.uriOffset;
+ uriOffset = getter.fragment.uriOffset,
+ _getterPropertyKind = getter.propertyKind {
+ _Declarations declarations = _createDeclarations(getter.fragment);
+ assert(declarations.field == null,
+ "Unexpected field declaration from getter ${getter.fragment}.");
+ assert(declarations.getter != null,
+ "Unexpected getter declaration from getter ${getter.fragment}.");
+ assert(declarations.setter == null,
+ "Unexpected setter declaration from getter ${getter.fragment}.");
+ _getter = declarations.getter;
+ }
// TODO(johnniwinther): Report error if [setter] is augmenting.
- _PropertyPreBuilder.forSetter(_FragmentName this.setter)
+ _PropertyPreBuilder.forSetter(_FragmentName setter)
: isStatic = setter.isStatic,
inPatch = setter.inPatch,
name = setter.name,
- uriOffset = setter.fragment.uriOffset;
+ uriOffset = setter.fragment.uriOffset,
+ _setterPropertyKind = setter.propertyKind {
+ _Declarations declarations = _createDeclarations(setter.fragment);
+ assert(declarations.field == null,
+ "Unexpected field declaration from setter ${setter.fragment}.");
+ assert(declarations.getter == null,
+ "Unexpected getter declaration from setter ${setter.fragment}.");
+ assert(declarations.setter != null,
+ "Unexpected setter declaration from setter ${setter.fragment}.");
+ _setter = declarations.setter;
+ }
- // TODO(johnniwinther): Report error if [getter] is augmenting.
- _PropertyPreBuilder.forField(_FragmentName this.getter)
- : isStatic = getter.isStatic,
- inPatch = getter.inPatch,
- name = getter.name,
- uriOffset = getter.fragment.uriOffset {
- if (getter!.propertyKind == _PropertyKind.Field) {
- setter = getter;
+ // TODO(johnniwinther): Report error if [field] is augmenting.
+ _PropertyPreBuilder.forField(_FragmentName field)
+ : isStatic = field.isStatic,
+ inPatch = field.inPatch,
+ name = field.name,
+ uriOffset = field.fragment.uriOffset,
+ _getterPropertyKind = field.propertyKind {
+ _Declarations declarations = _createDeclarations(field.fragment);
+ assert(declarations.field != null,
+ "Unexpected field declaration from field ${field.fragment}.");
+ assert(declarations.getter != null,
+ "Unexpected getter declaration from field ${field.fragment}.");
+ assert(
+ (declarations.setter != null) ==
+ (_getterPropertyKind == _PropertyKind.Field),
+ "Unexpected setter declaration from field ${field.fragment}.");
+ _field = declarations.field;
+ _getter = declarations.getter;
+ _setter = declarations.setter;
+
+ if (_getterPropertyKind == _PropertyKind.Field) {
+ _setterPropertyKind = field.propertyKind;
}
}
@@ -176,7 +214,7 @@
if (propertyKind != null) {
switch (propertyKind) {
case _PropertyKind.Getter:
- if (getter == null) {
+ if (_getter == null) {
// Example:
//
// void set foo(_) {}
@@ -206,7 +244,7 @@
context: [
templateStaticConflictsWithInstanceCause
.withArguments(name)
- .withLocation2(setter!.fragment.uriOffset)
+ .withLocation2(_setter!.uriOffset)
]);
} else {
// Example:
@@ -222,12 +260,25 @@
context: [
templateInstanceConflictsWithStaticCause
.withArguments(name)
- .withLocation2(setter!.fragment.uriOffset)
+ .withLocation2(_setter!.uriOffset)
]);
}
return false;
} else {
- getter = fragmentName;
+ _Declarations declarations =
+ _createDeclarations(fragmentName.fragment);
+ assert(
+ declarations.field == null,
+ "Unexpected field declaration from getter "
+ "${fragmentName.fragment}.");
+ assert(
+ declarations.setter == null,
+ "Unexpected setter declaration from getter "
+ "${fragmentName.fragment}.");
+ _getter = declarations.getter;
+ assert(_getterPropertyKind == null,
+ "Unexpected setter property kind for $_setter");
+ _getterPropertyKind == propertyKind;
return true;
}
} else {
@@ -237,7 +288,17 @@
// int get foo => 42;
// augment int get foo => 87;
//
- augmentations.add(fragmentName);
+ _Declarations declarations =
+ _createDeclarations(fragmentName.fragment);
+ assert(
+ declarations.field == null,
+ "Unexpected field declaration from getter "
+ "${fragmentName.fragment}.");
+ assert(
+ declarations.setter == null,
+ "Unexpected setter declaration from getter "
+ "${fragmentName.fragment}.");
+ _getterAugmentations.add(declarations.getter!);
return true;
} else {
// Example:
@@ -251,13 +312,13 @@
context: <LocatedMessage>[
templateDuplicatedDeclarationCause
.withArguments(name)
- .withLocation2(getter!.fragment.uriOffset)
+ .withLocation2(_getter!.uriOffset)
]);
return false;
}
}
case _PropertyKind.Setter:
- if (setter == null) {
+ if (_setter == null) {
// Examples:
//
// int get foo => 42;
@@ -289,7 +350,7 @@
context: [
templateStaticConflictsWithInstanceCause
.withArguments(name)
- .withLocation2(getter!.fragment.uriOffset)
+ .withLocation2(_getter!.uriOffset)
]);
return false;
} else {
@@ -306,12 +367,25 @@
context: [
templateInstanceConflictsWithStaticCause
.withArguments(name)
- .withLocation2(getter!.fragment.uriOffset)
+ .withLocation2(_getter!.uriOffset)
]);
return false;
}
} else {
- setter = fragmentName;
+ _Declarations declarations =
+ _createDeclarations(fragmentName.fragment);
+ assert(
+ declarations.field == null,
+ "Unexpected field declaration from setter "
+ "${fragmentName.fragment}.");
+ assert(
+ declarations.getter == null,
+ "Unexpected getter declaration from setter "
+ "${fragmentName.fragment}.");
+ _setter = declarations.setter;
+ assert(_setterPropertyKind == null,
+ "Unexpected setter property kind for $_getter");
+ _setterPropertyKind == propertyKind;
return true;
}
} else {
@@ -321,10 +395,20 @@
// void set foo(_) {}
// augment void set foo(_) {}
//
- augmentations.add(fragmentName);
+ _Declarations declarations =
+ _createDeclarations(fragmentName.fragment);
+ assert(
+ declarations.field == null,
+ "Unexpected field declaration from setter "
+ "${fragmentName.fragment}.");
+ assert(
+ declarations.getter == null,
+ "Unexpected getter declaration from setter "
+ "${fragmentName.fragment}.");
+ _setterAugmentations.add(declarations.setter!);
return true;
} else {
- if (setter!.propertyKind == _PropertyKind.Field) {
+ if (_setterPropertyKind == _PropertyKind.Field) {
// Example:
//
// int? foo;
@@ -336,7 +420,7 @@
context: [
templateConflictsWithImplicitSetterCause
.withArguments(name)
- .withLocation2(setter!.fragment.uriOffset)
+ .withLocation2(_setter!.uriOffset)
]);
return false;
} else {
@@ -351,20 +435,20 @@
context: <LocatedMessage>[
templateDuplicatedDeclarationCause
.withArguments(name)
- .withLocation2(setter!.fragment.uriOffset)
+ .withLocation2(_setter!.uriOffset)
]);
return false;
}
}
}
case _PropertyKind.Field:
- if (getter == null) {
+ if (_getter == null) {
// Example:
//
// void set foo(_) {}
// int? foo;
//
- assert(getter == null && setter != null);
+ assert(_getter == null && _setter != null);
// We have an explicit setter.
problemReporting.addProblem2(
templateConflictsWithSetter.withArguments(name),
@@ -372,10 +456,10 @@
context: [
templateConflictsWithSetterCause
.withArguments(name)
- .withLocation2(setter!.fragment.uriOffset)
+ .withLocation2(_setter!.uriOffset)
]);
return false;
- } else if (setter != null) {
+ } else if (_setter != null) {
// Examples:
//
// int? foo;
@@ -389,17 +473,21 @@
// void set baz(_) {}
// int baz = 87;
//
- assert(getter != null && setter != null);
+ assert(_getter != null && _setter != null);
// We have both getter and setter
if (fragmentName.isAugment) {
// Coverage-ignore-block(suite): Not run.
- if (getter!.propertyKind == fragmentName.propertyKind) {
+ if (_getterPropertyKind == fragmentName.propertyKind) {
// Example:
//
// int foo = 42;
// augment int foo = 87;
//
- augmentations.add(fragmentName);
+ _Declarations declarations =
+ _createDeclarations(fragmentName.fragment);
+ // TODO(johnniwinther): Handle field augmentation.
+ _getterAugmentations.add(declarations.getter!);
+ _setterAugmentations.add(declarations.setter!);
return true;
} else {
// Example:
@@ -429,7 +517,7 @@
context: <LocatedMessage>[
templateDuplicatedDeclarationCause
.withArguments(name)
- .withLocation2(getter!.fragment.uriOffset)
+ .withLocation2(_getter!.uriOffset)
]);
return false;
@@ -443,25 +531,25 @@
// final int bar = 42;
// int? bar;
//
- assert(getter != null && setter == null);
+ assert(_getter != null && _setter == null);
problemReporting.addProblem2(
templateDuplicatedDeclaration.withArguments(name),
fragmentName.fragment.uriOffset,
context: <LocatedMessage>[
templateDuplicatedDeclarationCause
.withArguments(name)
- .withLocation2(getter!.fragment.uriOffset)
+ .withLocation2(_getter!.uriOffset)
]);
return false;
}
case _PropertyKind.FinalField:
- if (getter == null) {
+ if (_getter == null) {
// Example:
//
// void set foo(_) {}
// final int foo = 42;
//
- assert(getter == null && setter != null);
+ assert(_getter == null && _setter != null);
// We have an explicit setter.
if (fragmentName.isAugment) {
// Example:
@@ -487,7 +575,7 @@
context: [
templateStaticConflictsWithInstanceCause
.withArguments(name)
- .withLocation2(setter!.fragment.uriOffset)
+ .withLocation2(_setter!.uriOffset)
]);
return false;
} else {
@@ -504,12 +592,24 @@
context: [
templateInstanceConflictsWithStaticCause
.withArguments(name)
- .withLocation2(setter!.fragment.uriOffset)
+ .withLocation2(_setter!.uriOffset)
]);
return false;
}
} else {
- getter = fragmentName;
+ _Declarations declarations =
+ _createDeclarations(fragmentName.fragment);
+ assert(
+ declarations.setter == null,
+ "Unexpected setter declaration from field "
+ "${fragmentName.fragment}.");
+ _field = declarations.field;
+ _getter = declarations.getter;
+ assert(
+ _getterPropertyKind == null,
+ "Unexpected getter property kind $_getterPropertyKind for "
+ "$_setter.");
+ _getterPropertyKind = propertyKind;
return true;
}
} else {
@@ -523,13 +623,20 @@
//
if (fragmentName.isAugment) {
// Coverage-ignore-block(suite): Not run.
- if (getter!.propertyKind == fragmentName.propertyKind) {
+ if (_getterPropertyKind == fragmentName.propertyKind) {
// Example:
//
// final int foo = 42;
// augment final int foo = 87;
//
- augmentations.add(fragmentName);
+ _Declarations declarations =
+ _createDeclarations(fragmentName.fragment);
+ assert(
+ declarations.setter == null,
+ "Unexpected setter declaration from final field "
+ "${fragmentName.fragment}.");
+ // TODO(johnniwinther): Handle field augmentation.
+ _getterAugmentations.add(declarations.getter!);
return true;
} else {
// Example:
@@ -557,14 +664,14 @@
context: <LocatedMessage>[
templateDuplicatedDeclarationCause
.withArguments(name)
- .withLocation2(getter!.fragment.uriOffset)
+ .withLocation2(_getter!.uriOffset)
]);
return false;
}
}
}
} else {
- if (getter != null) {
+ if (_getter != null) {
// Example:
//
// int get foo => 42;
@@ -576,10 +683,10 @@
context: <LocatedMessage>[
templateDuplicatedDeclarationCause
.withArguments(name)
- .withLocation2(getter!.fragment.uriOffset)
+ .withLocation2(_getter!.uriOffset)
]);
} else {
- assert(setter != null);
+ assert(_setter != null);
// Example:
//
// void set foo(_) {}
@@ -591,7 +698,7 @@
context: <LocatedMessage>[
templateDeclarationConflictsWithSetterCause
.withArguments(name)
- .withLocation2(setter!.fragment.uriOffset)
+ .withLocation2(_setter!.uriOffset)
]);
}
return false;
@@ -603,7 +710,7 @@
ProblemReporting problemReporting, _FragmentName constructorFragment) {
// Check conflict with constructor.
if (isStatic) {
- if (getter != null) {
+ if (_getter != null) {
if (constructorFragment.kind == _FragmentKind.Constructor) {
// Example:
//
@@ -618,7 +725,7 @@
context: [
templateConstructorConflictsWithMemberCause
.withArguments(name)
- .withLocation2(getter!.fragment.uriOffset)
+ .withLocation2(_getter!.uriOffset)
]);
} else {
// Coverage-ignore-block(suite): Not run.
@@ -637,7 +744,7 @@
context: [
templateFactoryConflictsWithMemberCause
.withArguments(name)
- .withLocation2(getter!.fragment.uriOffset)
+ .withLocation2(_getter!.uriOffset)
]);
}
} else {
@@ -656,7 +763,7 @@
context: [
templateConstructorConflictsWithMemberCause
.withArguments(name)
- .withLocation2(setter!.fragment.uriOffset)
+ .withLocation2(_setter!.uriOffset)
]);
} else {
assert(constructorFragment.kind == _FragmentKind.Factory,
@@ -674,7 +781,7 @@
context: [
templateFactoryConflictsWithMemberCause
.withArguments(name)
- .withLocation2(setter!.fragment.uriOffset)
+ .withLocation2(_setter!.uriOffset)
]);
}
}
@@ -713,62 +820,16 @@
@override
void createBuilders(_CreateBuilderFunction createBuilder,
_CreatePropertyFunction createProperty) {
- FieldDeclaration? fieldDeclaration;
- GetterDeclaration? getterDeclaration;
- SetterDeclaration? setterDeclaration;
- if (getter != null) {
- _Declarations declarations = _createDeclarations(getter!.fragment);
- fieldDeclaration = declarations.field;
- getterDeclaration = declarations.getter;
- setterDeclaration = declarations.setter;
- }
- if (setter != null && setter!.propertyKind != _PropertyKind.Field) {
- _Declarations declarations = _createDeclarations(setter!.fragment);
- assert(declarations.field == null,
- "Unexpected field declaration from setter $setter");
- assert(declarations.getter == null,
- "Unexpected getter declaration from setter $setter");
- assert(setterDeclaration == null,
- "Unexpected setter declaration from getter $getter");
- setterDeclaration = declarations.setter;
- }
-
- List<GetterDeclaration>? getterAugmentationDeclarations;
- List<SetterDeclaration>? setterAugmentationDeclarations;
-
- List<Fragment>? getterAugmentations;
- List<Fragment>? setterAugmentations;
- for (_FragmentName fragmentName in augmentations) {
- _Declarations declarations = _createDeclarations(fragmentName.fragment);
- // TODO(johnniwinther): Support field augmentations.
- assert(declarations.field == null,
- "Unexpected field declaration from augmentation $fragmentName");
- if (declarations.getter != null) {
- (getterAugmentationDeclarations ??= []).add(declarations.getter!);
- }
- if (declarations.setter != null) {
- (setterAugmentationDeclarations ??= []).add(declarations.setter!);
- }
-
- if (fragmentName.fragment is GetterFragment) {
- (getterAugmentations ??= []).add(fragmentName.fragment);
- } else if (fragmentName.fragment is SetterFragment) {
- (setterAugmentations ??= []).add(fragmentName.fragment);
- } else {
- throw new UnsupportedError("Unexpected augmentation $fragmentName");
- }
- }
- augmentations.clear();
createProperty(
name: name,
inPatch: inPatch,
isStatic: isStatic,
uriOffset: uriOffset,
- fieldDeclaration: fieldDeclaration,
- getterDeclaration: getterDeclaration,
- getterAugmentationDeclarations: getterAugmentationDeclarations,
- setterDeclaration: setterDeclaration,
- setterAugmentationDeclarations: setterAugmentationDeclarations);
+ fieldDeclaration: _field,
+ getterDeclaration: _getter,
+ getterAugmentationDeclarations: _getterAugmentations,
+ setterDeclaration: _setter,
+ setterAugmentationDeclarations: _setterAugmentations);
}
}