@@ -17,6 +17,8 @@ import '../../builder/declaration_builders.dart';
1717import '../../builder/formal_parameter_builder.dart' ;
1818import '../../builder/function_builder.dart' ;
1919import '../../builder/member_builder.dart' ;
20+ import '../../builder/named_type_builder.dart' ;
21+ import '../../builder/nullability_builder.dart' ;
2022import '../../builder/omitted_type_builder.dart' ;
2123import '../../builder/type_builder.dart' ;
2224import '../../codes/cfe_codes.dart' ;
@@ -26,6 +28,7 @@ import '../../fragment/fragment.dart';
2628import '../../kernel/body_builder_context.dart' ;
2729import '../../kernel/constructor_tearoff_lowering.dart' ;
2830import '../../kernel/kernel_helper.dart' ;
31+ import '../../source/builder_factory.dart' ;
2932import '../../source/name_scheme.dart' ;
3033import '../../source/redirecting_factory_body.dart' ;
3134import '../../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