Skip to content

Commit 9188999

Browse files
johnniwintherCommit Queue
authored andcommitted
[cfe] Add PrimaryConstructoFieldFragment
This creates a PrimaryConstructorFieldFragment instead of a FieldFragment for primary constructor fields (currently only occurring in extension types). Change-Id: Iec58112a0a0ef64dba248f1ce93625e297b10705 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/426460 Reviewed-by: Chloe Stefantsova <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent df9e0f9 commit 9188999

10 files changed

+609
-76
lines changed

pkg/front_end/lib/src/fragment/extension_type.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class ExtensionTypeFragment extends DeclarationFragmentImpl
1818
late final int startOffset;
1919
late final int endOffset;
2020

21-
final List<FieldFragment> primaryConstructorFields = [];
21+
final List<PrimaryConstructorFieldFragment> primaryConstructorFields = [];
2222

2323
SourceExtensionTypeDeclarationBuilder? _builder;
2424

@@ -54,7 +54,7 @@ class ExtensionTypeFragment extends DeclarationFragmentImpl
5454
modifiers.isAugment;
5555

5656
@override
57-
void addPrimaryConstructorField(FieldFragment fragment) {
57+
void addPrimaryConstructorField(PrimaryConstructorFieldFragment fragment) {
5858
primaryConstructorFields.add(fragment);
5959
}
6060

pkg/front_end/lib/src/fragment/field.dart

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,6 @@ class FieldFragment implements Fragment {
2323

2424
final bool isTopLevel;
2525
final Modifiers modifiers;
26-
// TODO(johnniwinther): Create separate fragment for primary constructor
27-
// fields.
28-
final bool isPrimaryConstructorField;
2926

3027
final LookupScope enclosingScope;
3128

@@ -46,7 +43,6 @@ class FieldFragment implements Fragment {
4643
required this.type,
4744
required this.isTopLevel,
4845
required this.modifiers,
49-
required this.isPrimaryConstructorField,
5046
required this.enclosingScope,
5147
required this.enclosingDeclaration,
5248
required this.enclosingCompilationUnit,

pkg/front_end/lib/src/fragment/field/body_builder_context.dart

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,36 @@
55
part of '../fragment.dart';
66

77
class FieldFragmentBodyBuilderContext extends BodyBuilderContext {
8+
final SourcePropertyBuilder _builder;
89
final FieldFragmentDeclaration _declaration;
9-
final FieldFragment _fragment;
1010

11-
FieldFragmentBodyBuilderContext(
12-
this._declaration,
13-
this._fragment,
14-
SourceLibraryBuilder libraryBuilder,
15-
DeclarationBuilder? declarationBuilder,
16-
{required bool isDeclarationInstanceMember})
17-
: super(libraryBuilder, declarationBuilder,
18-
isDeclarationInstanceMember: isDeclarationInstanceMember);
11+
@override
12+
final bool isLateField;
13+
14+
@override
15+
final bool isAbstractField;
16+
17+
@override
18+
final bool isExternalField;
19+
20+
final int _nameOffset;
21+
22+
final int _nameLength;
23+
24+
final bool _isConst;
25+
26+
FieldFragmentBodyBuilderContext(this._builder, this._declaration,
27+
{required this.isLateField,
28+
required this.isAbstractField,
29+
required this.isExternalField,
30+
required int nameOffset,
31+
required int nameLength,
32+
required bool isConst})
33+
: this._nameOffset = nameOffset,
34+
this._nameLength = nameLength,
35+
this._isConst = isConst,
36+
super(_builder.libraryBuilder, _builder.declarationBuilder,
37+
isDeclarationInstanceMember: _builder.isDeclarationInstanceMember);
1938

2039
@override
2140
// Coverage-ignore(suite): Not run.
@@ -25,26 +44,17 @@ class FieldFragmentBodyBuilderContext extends BodyBuilderContext {
2544
return parent;
2645
}
2746

28-
@override
29-
bool get isLateField => _fragment.modifiers.isLate;
30-
31-
@override
32-
bool get isAbstractField => _fragment.modifiers.isAbstract;
33-
34-
@override
35-
bool get isExternalField => _fragment.modifiers.isExternal;
36-
3747
@override
3848
// Coverage-ignore(suite): Not run.
39-
int get memberNameOffset => _fragment.nameOffset;
49+
int get memberNameOffset => _nameOffset;
4050

4151
@override
4252
// Coverage-ignore(suite): Not run.
43-
int get memberNameLength => _fragment.name.length;
53+
int get memberNameLength => _nameLength;
4454

4555
@override
4656
InstanceTypeParameterAccessState get instanceTypeParameterAccessState {
47-
if (_fragment.builder.isExtensionMember && !isExternalField) {
57+
if (_builder.isExtensionMember && !isExternalField) {
4858
return InstanceTypeParameterAccessState.Invalid;
4959
} else {
5060
return super.instanceTypeParameterAccessState;
@@ -59,15 +69,15 @@ class FieldFragmentBodyBuilderContext extends BodyBuilderContext {
5969
@override
6070
// Coverage-ignore(suite): Not run.
6171
AugmentSuperTarget? get augmentSuperTarget {
62-
if (_fragment.builder.isAugmentation) {
63-
return _fragment.builder.augmentSuperTarget;
72+
if (_builder.isAugmentation) {
73+
return _builder.augmentSuperTarget;
6474
}
6575
return null;
6676
}
6777

6878
@override
6979
ConstantContext get constantContext {
70-
return _fragment.modifiers.isConst
80+
return _isConst
7181
? ConstantContext.inferred
7282
: !_declaration.isStatic && declarationDeclaresConstConstructor
7383
? ConstantContext.required

pkg/front_end/lib/src/fragment/field/declaration.dart

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ abstract class FieldDeclaration {
128128
shared.Expression? get initializerExpression;
129129
}
130130

131-
class FieldDeclarationImpl
131+
class RegularFieldDeclaration
132132
with FieldDeclarationMixin
133133
implements
134134
FieldDeclaration,
@@ -149,7 +149,7 @@ class FieldDeclarationImpl
149149
/// building them twice as part of the non-outline build.
150150
bool hasBodyBeenBuilt = false;
151151

152-
FieldDeclarationImpl(this._fragment) {
152+
RegularFieldDeclaration(this._fragment) {
153153
_fragment.declaration = this;
154154
}
155155

@@ -194,8 +194,7 @@ class FieldDeclarationImpl
194194

195195
@override
196196
bool get isExtensionTypeDeclaredInstanceField =>
197-
builder.isExtensionTypeInstanceMember &&
198-
!_fragment.isPrimaryConstructorField;
197+
builder.isExtensionTypeInstanceMember;
199198

200199
@override
201200
bool get isFinal => _fragment.modifiers.isFinal;
@@ -404,9 +403,13 @@ class FieldDeclarationImpl
404403

405404
@override
406405
BodyBuilderContext createBodyBuilderContext() {
407-
return new FieldFragmentBodyBuilderContext(
408-
this, _fragment, builder.libraryBuilder, builder.declarationBuilder,
409-
isDeclarationInstanceMember: builder.isDeclarationInstanceMember);
406+
return new FieldFragmentBodyBuilderContext(builder, this,
407+
isLateField: _fragment.modifiers.isLate,
408+
isAbstractField: _fragment.modifiers.isAbstract,
409+
isExternalField: _fragment.modifiers.isExternal,
410+
nameOffset: _fragment.nameOffset,
411+
nameLength: _fragment.name.length,
412+
isConst: _fragment.modifiers.isConst);
410413
}
411414

412415
void createEncoding(SourcePropertyBuilder builder) {
@@ -430,20 +433,16 @@ class FieldDeclarationImpl
430433
isAbstract: isAbstract,
431434
isExternal: isExternal);
432435
} else if (isExtensionTypeMember && isInstanceMember) {
433-
if (_fragment.isPrimaryConstructorField) {
434-
_encoding = new RepresentationFieldEncoding(_fragment);
435-
} else {
436-
// Field on a extension type. Encode as abstract.
437-
// TODO(johnniwinther): Should we have an erroneous flag on such
438-
// members?
439-
_encoding = new AbstractOrExternalFieldEncoding(_fragment,
440-
isExtensionInstanceMember: isExtensionMember && isInstanceMember,
441-
isExtensionTypeInstanceMember:
442-
isExtensionTypeMember && isInstanceMember,
443-
isAbstract: true,
444-
isExternal: false,
445-
isForcedExtension: true);
446-
}
436+
// Field on a extension type. Encode as abstract.
437+
// TODO(johnniwinther): Should we have an erroneous flag on such
438+
// members?
439+
_encoding = new AbstractOrExternalFieldEncoding(_fragment,
440+
isExtensionInstanceMember: isExtensionMember && isInstanceMember,
441+
isExtensionTypeInstanceMember:
442+
isExtensionTypeMember && isInstanceMember,
443+
isAbstract: true,
444+
isExternal: false,
445+
isForcedExtension: true);
447446
} else if (isLate &&
448447
libraryBuilder.loader.target.backendTarget.isLateFieldLoweringEnabled(
449448
hasInitializer: hasInitializer,

pkg/front_end/lib/src/fragment/field/encoding.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1167,7 +1167,7 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding {
11671167

11681168
/// The encoding of an extension type declaration representation field.
11691169
class RepresentationFieldEncoding implements FieldEncoding {
1170-
final FieldFragment _fragment;
1170+
final PrimaryConstructorFieldFragment _fragment;
11711171

11721172
late Procedure _getter;
11731173
DartType? _type;
@@ -1219,12 +1219,12 @@ class RepresentationFieldEncoding implements FieldEncoding {
12191219
fileUri: _fragment.fileUri, reference: references.fieldGetterReference)
12201220
..stubKind = ProcedureStubKind.RepresentationField
12211221
..fileOffset = _fragment.nameOffset
1222-
..fileEndOffset = _fragment.endOffset;
1222+
..fileEndOffset = _fragment.nameOffset;
12231223
nameScheme
12241224
.getFieldMemberName(FieldNameType.RepresentationField, _fragment.name,
12251225
isSynthesized: true)
12261226
.attachMember(_getter);
1227-
_getter..isConst = _fragment.modifiers.isConst;
1227+
_getter..isConst = false;
12281228
_getter
12291229
..isStatic = false
12301230
..isExtensionMember = false

pkg/front_end/lib/src/fragment/fragment.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,10 @@ import '../source/source_property_builder.dart';
5656
import '../source/source_type_alias_builder.dart';
5757
import '../source/source_type_parameter_builder.dart';
5858
import '../source/type_parameter_scope_builder.dart';
59+
import '../type_inference/inference_helper.dart';
5960
import '../type_inference/inference_results.dart';
6061
import '../type_inference/type_inference_engine.dart';
62+
import '../type_inference/type_inferrer.dart';
6163
import '../type_inference/type_schema.dart';
6264
import 'constructor/declaration.dart';
6365
import 'factory/declaration.dart';
@@ -86,6 +88,7 @@ part 'method.dart';
8688
part 'mixin.dart';
8789
part 'named_mixin_application.dart';
8890
part 'primary_constructor.dart';
91+
part 'primary_constructor_field.dart';
8992
part 'setter.dart';
9093
part 'type_parameter.dart';
9194
part 'typedef.dart';

0 commit comments

Comments
 (0)