Skip to content

Commit 62d85a6

Browse files
johnniwintherCommit Queue
authored andcommitted
[cfe] Add FactoryReferences and FactoryEncodingStrategy
The prepares for creating constructor/factory builders through declarations rather than fragments. Change-Id: Ia66bce40ec16af4f360c469b6d89a2ecb13d844c Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/435124 Reviewed-by: Chloe Stefantsova <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent 3f5314f commit 62d85a6

File tree

5 files changed

+293
-194
lines changed

5 files changed

+293
-194
lines changed

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

Lines changed: 56 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ import 'package:kernel/class_hierarchy.dart';
77
import 'package:kernel/type_environment.dart';
88

99
import '../../base/identifiers.dart';
10+
import '../../base/messages.dart';
1011
import '../../base/name_space.dart';
1112
import '../../builder/constructor_reference_builder.dart';
13+
import '../../builder/declaration_builders.dart';
1214
import '../../builder/formal_parameter_builder.dart';
1315
import '../../builder/metadata_builder.dart';
1416
import '../../builder/type_builder.dart';
@@ -41,7 +43,12 @@ abstract class FactoryDeclaration {
4143

4244
ConstructorReferenceBuilder? get redirectionTarget;
4345

44-
Procedure? get tearOff;
46+
void createEncoding(
47+
{required ProblemReporting problemReporting,
48+
required DeclarationBuilder declarationBuilder,
49+
required SourceFactoryBuilder factoryBuilder,
50+
required List<NominalParameterBuilder> unboundNominalParameters,
51+
required FactoryEncodingStrategy encodingStrategy});
4552

4653
void buildOutlineExpressions(
4754
{required Iterable<Annotatable> annotatables,
@@ -55,6 +62,8 @@ abstract class FactoryDeclaration {
5562
{required SourceLibraryBuilder libraryBuilder,
5663
required SourceFactoryBuilder factoryBuilder,
5764
required BuildNodesCallback f,
65+
required NameScheme nameScheme,
66+
required FactoryReferences? factoryReferences,
5867
required bool isConst});
5968

6069
/// Checks this factory builder if it is for a redirecting factory.
@@ -69,14 +78,6 @@ abstract class FactoryDeclaration {
6978
int computeDefaultTypes(ComputeDefaultTypeContext context,
7079
{required bool inErrorRecovery});
7180

72-
void createNode({
73-
required String name,
74-
required SourceLibraryBuilder libraryBuilder,
75-
required NameScheme nameScheme,
76-
required Reference? procedureReference,
77-
required Reference? tearOffReference,
78-
});
79-
8081
void inferRedirectionTarget(
8182
{required SourceLibraryBuilder libraryBuilder,
8283
required SourceFactoryBuilder factoryBuilder,
@@ -90,20 +91,46 @@ abstract class FactoryDeclaration {
9091
class FactoryDeclarationImpl
9192
implements FactoryDeclaration, FactoryFragmentDeclaration {
9293
final FactoryFragment _fragment;
93-
final List<SourceNominalParameterBuilder>? typeParameters;
94-
@override
95-
final TypeBuilder returnType;
96-
final FactoryEncoding _encoding;
97-
98-
FactoryDeclarationImpl(this._fragment,
99-
{required this.typeParameters, required this.returnType})
100-
: _encoding = new FactoryEncoding(_fragment,
101-
typeParameters: typeParameters,
102-
returnType: returnType,
103-
redirectionTarget: _fragment.redirectionTarget) {
94+
late final List<SourceNominalParameterBuilder>? _typeParameters;
95+
late final TypeBuilder _returnType;
96+
late final FactoryEncoding _encoding;
97+
98+
FactoryDeclarationImpl(this._fragment) {
10499
_fragment.declaration = this;
105100
}
106101

102+
@override
103+
void createEncoding(
104+
{required ProblemReporting problemReporting,
105+
required DeclarationBuilder declarationBuilder,
106+
required SourceFactoryBuilder factoryBuilder,
107+
required List<NominalParameterBuilder> unboundNominalParameters,
108+
required FactoryEncodingStrategy encodingStrategy}) {
109+
_fragment.builder = factoryBuilder;
110+
var (typeParameters, returnType) =
111+
encodingStrategy.createTypeParametersAndReturnType(
112+
declarationBuilder: declarationBuilder,
113+
declarationTypeParameterFragments:
114+
_fragment.enclosingDeclaration.typeParameters,
115+
unboundNominalParameters: unboundNominalParameters,
116+
fullName: _fragment.constructorName.fullName,
117+
fileUri: _fragment.fileUri,
118+
fullNameOffset: _fragment.constructorName.fullNameOffset,
119+
fullNameLength: _fragment.constructorName.fullNameLength);
120+
_typeParameters = typeParameters;
121+
_returnType = returnType;
122+
_fragment.typeParameterNameSpace.addTypeParameters(
123+
problemReporting, typeParameters,
124+
ownerName: _fragment.name, allowNameConflict: true);
125+
_encoding = new FactoryEncoding(_fragment,
126+
typeParameters: typeParameters,
127+
returnType: returnType,
128+
redirectionTarget: _fragment.redirectionTarget);
129+
}
130+
131+
@override
132+
TypeBuilder get returnType => _returnType;
133+
107134
@override
108135
int get fileOffset => _fragment.fullNameOffset;
109136

@@ -136,9 +163,6 @@ class FactoryDeclarationImpl
136163
return _fragment.redirectionTarget;
137164
}
138165

139-
@override
140-
Procedure? get tearOff => _encoding.tearOff;
141-
142166
@override
143167
void becomeNative(SourceLoader loader) {
144168
loader.addNativeAnnotation(procedure, _fragment.nativeMethodName!);
@@ -167,9 +191,9 @@ class FactoryDeclarationImpl
167191
libraryBuilder: libraryBuilder,
168192
scope: _fragment.enclosingScope);
169193
}
170-
if (typeParameters != null) {
171-
for (int i = 0; i < typeParameters!.length; i++) {
172-
typeParameters![i].buildOutlineExpressions(
194+
if (_typeParameters != null) {
195+
for (int i = 0; i < _typeParameters.length; i++) {
196+
_typeParameters[i].buildOutlineExpressions(
173197
libraryBuilder, bodyBuilderContext, classHierarchy);
174198
}
175199
}
@@ -197,11 +221,16 @@ class FactoryDeclarationImpl
197221
{required SourceLibraryBuilder libraryBuilder,
198222
required SourceFactoryBuilder factoryBuilder,
199223
required BuildNodesCallback f,
224+
required NameScheme nameScheme,
225+
required FactoryReferences? factoryReferences,
200226
required bool isConst}) {
201227
_encoding.buildOutlineNodes(
202228
libraryBuilder: libraryBuilder,
203229
factoryBuilder: factoryBuilder,
204230
f: f,
231+
name: _fragment.name,
232+
nameScheme: nameScheme,
233+
factoryReferences: factoryReferences,
205234
isConst: isConst);
206235
}
207236

@@ -232,7 +261,7 @@ class FactoryDeclarationImpl
232261
@override
233262
int computeDefaultTypes(ComputeDefaultTypeContext context,
234263
{required bool inErrorRecovery}) {
235-
int count = context.computeDefaultTypesForVariables(typeParameters,
264+
int count = context.computeDefaultTypesForVariables(_typeParameters,
236265
// Type parameters are inherited from the enclosing declaration, so if
237266
// it has issues, so do the constructors.
238267
inErrorRecovery: inErrorRecovery);
@@ -247,22 +276,6 @@ class FactoryDeclarationImpl
247276
factoryBuilder, this, _encoding.procedure);
248277
}
249278

250-
@override
251-
void createNode({
252-
required String name,
253-
required SourceLibraryBuilder libraryBuilder,
254-
required NameScheme nameScheme,
255-
required Reference? procedureReference,
256-
required Reference? tearOffReference,
257-
}) {
258-
_encoding.createNode(
259-
name: name,
260-
libraryBuilder: libraryBuilder,
261-
nameScheme: nameScheme,
262-
procedureReference: procedureReference,
263-
tearOffReference: tearOffReference);
264-
}
265-
266279
@override
267280
FormalParameterBuilder? getFormal(Identifier identifier) {
268281
return _encoding.getFormal(identifier);

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

Lines changed: 125 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ import '../../builder/declaration_builders.dart';
1717
import '../../builder/formal_parameter_builder.dart';
1818
import '../../builder/function_builder.dart';
1919
import '../../builder/member_builder.dart';
20+
import '../../builder/named_type_builder.dart';
21+
import '../../builder/nullability_builder.dart';
2022
import '../../builder/omitted_type_builder.dart';
2123
import '../../builder/type_builder.dart';
2224
import '../../codes/cfe_codes.dart';
@@ -26,6 +28,7 @@ import '../../fragment/fragment.dart';
2628
import '../../kernel/body_builder_context.dart';
2729
import '../../kernel/constructor_tearoff_lowering.dart';
2830
import '../../kernel/kernel_helper.dart';
31+
import '../../source/builder_factory.dart';
2932
import '../../source/name_scheme.dart';
3033
import '../../source/redirecting_factory_body.dart';
3134
import '../../source/source_factory_builder.dart';
@@ -69,45 +72,8 @@ class FactoryEncoding implements InferredTypeListener {
6972
? AsyncMarker.Sync
7073
: _fragment.asyncModifier;
7174

72-
void createNode({
73-
required String name,
74-
required SourceLibraryBuilder libraryBuilder,
75-
required NameScheme nameScheme,
76-
required Reference? procedureReference,
77-
required Reference? tearOffReference,
78-
}) {
79-
_procedure = new Procedure(
80-
dummyName,
81-
nameScheme.isExtensionTypeMember
82-
? ProcedureKind.Method
83-
: ProcedureKind.Factory,
84-
new FunctionNode(null)
85-
..asyncMarker = _asyncModifier
86-
..dartAsyncMarker = _asyncModifier,
87-
fileUri: _fragment.fileUri,
88-
reference: procedureReference)
89-
..fileStartOffset = _fragment.startOffset
90-
..fileOffset = _fragment.fullNameOffset
91-
..fileEndOffset = _fragment.endOffset
92-
..isExtensionTypeMember = nameScheme.isExtensionTypeMember;
93-
nameScheme
94-
.getConstructorMemberName(name, isTearOff: false)
95-
.attachMember(_procedure);
96-
_tearOff = createFactoryTearOffProcedure(
97-
nameScheme.getConstructorMemberName(name, isTearOff: true),
98-
libraryBuilder,
99-
_fragment.fileUri,
100-
_fragment.fullNameOffset,
101-
tearOffReference,
102-
forceCreateLowering: nameScheme.isExtensionTypeMember)
103-
?..isExtensionTypeMember = nameScheme.isExtensionTypeMember;
104-
returnType.registerInferredTypeListener(this);
105-
}
106-
10775
Procedure get procedure => _procedure;
10876

109-
Procedure? get tearOff => _tearOff;
110-
11177
@override
11278
// Coverage-ignore(suite): Not run.
11379
void onInferredType(DartType type) {
@@ -134,7 +100,37 @@ class FactoryEncoding implements InferredTypeListener {
134100
{required SourceLibraryBuilder libraryBuilder,
135101
required SourceFactoryBuilder factoryBuilder,
136102
required BuildNodesCallback f,
103+
required String name,
104+
required NameScheme nameScheme,
105+
required FactoryReferences? factoryReferences,
137106
required bool isConst}) {
107+
_procedure = new Procedure(
108+
dummyName,
109+
nameScheme.isExtensionTypeMember
110+
? ProcedureKind.Method
111+
: ProcedureKind.Factory,
112+
new FunctionNode(null)
113+
..asyncMarker = _asyncModifier
114+
..dartAsyncMarker = _asyncModifier,
115+
fileUri: _fragment.fileUri,
116+
reference: factoryReferences?.factoryReference)
117+
..fileStartOffset = _fragment.startOffset
118+
..fileOffset = _fragment.fullNameOffset
119+
..fileEndOffset = _fragment.endOffset
120+
..isExtensionTypeMember = nameScheme.isExtensionTypeMember;
121+
nameScheme
122+
.getConstructorMemberName(name, isTearOff: false)
123+
.attachMember(_procedure);
124+
_tearOff = createFactoryTearOffProcedure(
125+
nameScheme.getConstructorMemberName(name, isTearOff: true),
126+
libraryBuilder,
127+
_fragment.fileUri,
128+
_fragment.fullNameOffset,
129+
factoryReferences?.tearOffReference,
130+
forceCreateLowering: nameScheme.isExtensionTypeMember)
131+
?..isExtensionTypeMember = nameScheme.isExtensionTypeMember;
132+
returnType.registerInferredTypeListener(this);
133+
138134
_procedure.function.asyncMarker = _asyncModifier;
139135
if (_redirectionTarget == null &&
140136
!_fragment.modifiers.isAbstract &&
@@ -751,3 +747,95 @@ class FactoryEncoding implements InferredTypeListener {
751747
return null;
752748
}
753749
}
750+
751+
abstract class FactoryEncodingStrategy {
752+
factory FactoryEncodingStrategy(DeclarationBuilder declarationBuilder) {
753+
switch (declarationBuilder) {
754+
case ClassBuilder():
755+
case ExtensionTypeDeclarationBuilder():
756+
return const RegularFactoryEncodingStrategy();
757+
case ExtensionBuilder():
758+
return const ExtensionFactoryEncodingStrategy();
759+
}
760+
}
761+
762+
(List<SourceNominalParameterBuilder>?, TypeBuilder)
763+
createTypeParametersAndReturnType({
764+
required DeclarationBuilder declarationBuilder,
765+
required List<TypeParameterFragment>? declarationTypeParameterFragments,
766+
required List<NominalParameterBuilder> unboundNominalParameters,
767+
required String fullName,
768+
required Uri fileUri,
769+
required int fullNameOffset,
770+
required int fullNameLength,
771+
});
772+
}
773+
774+
class RegularFactoryEncodingStrategy implements FactoryEncodingStrategy {
775+
const RegularFactoryEncodingStrategy();
776+
777+
@override
778+
(List<SourceNominalParameterBuilder>?, TypeBuilder)
779+
createTypeParametersAndReturnType({
780+
required DeclarationBuilder declarationBuilder,
781+
required List<TypeParameterFragment>? declarationTypeParameterFragments,
782+
required List<NominalParameterBuilder> unboundNominalParameters,
783+
required String fullName,
784+
required Uri fileUri,
785+
required int fullNameOffset,
786+
required int fullNameLength,
787+
}) {
788+
NominalParameterCopy? nominalParameterCopy =
789+
NominalParameterCopy.copyTypeParameters(
790+
unboundNominalParameters: unboundNominalParameters,
791+
oldParameterBuilders: declarationBuilder.typeParameters,
792+
oldParameterFragments: declarationTypeParameterFragments,
793+
kind: TypeParameterKind.function,
794+
instanceTypeParameterAccess:
795+
InstanceTypeParameterAccessState.Allowed);
796+
List<SourceNominalParameterBuilder>? typeParameters =
797+
nominalParameterCopy?.newParameterBuilders;
798+
TypeBuilder returnType =
799+
new NamedTypeBuilderImpl.fromTypeDeclarationBuilder(
800+
declarationBuilder, const NullabilityBuilder.omitted(),
801+
arguments: nominalParameterCopy?.newTypeArguments,
802+
fileUri: fileUri,
803+
charOffset: fullNameOffset,
804+
instanceTypeParameterAccess:
805+
InstanceTypeParameterAccessState.Allowed);
806+
return (typeParameters, returnType);
807+
}
808+
}
809+
810+
class ExtensionFactoryEncodingStrategy implements FactoryEncodingStrategy {
811+
const ExtensionFactoryEncodingStrategy();
812+
813+
@override
814+
(List<SourceNominalParameterBuilder>?, TypeBuilder)
815+
createTypeParametersAndReturnType({
816+
required DeclarationBuilder declarationBuilder,
817+
required List<TypeParameterFragment>? declarationTypeParameterFragments,
818+
required List<NominalParameterBuilder> unboundNominalParameters,
819+
required String fullName,
820+
required Uri fileUri,
821+
required int fullNameOffset,
822+
required int fullNameLength,
823+
}) {
824+
NominalParameterCopy? nominalParameterCopy =
825+
NominalParameterCopy.copyTypeParameters(
826+
unboundNominalParameters: unboundNominalParameters,
827+
oldParameterBuilders: declarationBuilder.typeParameters,
828+
oldParameterFragments: declarationTypeParameterFragments,
829+
kind: TypeParameterKind.function,
830+
instanceTypeParameterAccess:
831+
InstanceTypeParameterAccessState.Allowed);
832+
List<SourceNominalParameterBuilder>? typeParameters =
833+
nominalParameterCopy?.newParameterBuilders;
834+
TypeBuilder returnType = new NamedTypeBuilderImpl.forInvalidType(
835+
fullName,
836+
const NullabilityBuilder.omitted(),
837+
messageExtensionDeclaresConstructor.withLocation(
838+
fileUri, fullNameOffset, fullNameLength));
839+
return (typeParameters, returnType);
840+
}
841+
}

0 commit comments

Comments
 (0)