@@ -17,6 +17,8 @@ import '../../builder/declaration_builders.dart';
17
17
import '../../builder/formal_parameter_builder.dart' ;
18
18
import '../../builder/function_builder.dart' ;
19
19
import '../../builder/member_builder.dart' ;
20
+ import '../../builder/named_type_builder.dart' ;
21
+ import '../../builder/nullability_builder.dart' ;
20
22
import '../../builder/omitted_type_builder.dart' ;
21
23
import '../../builder/type_builder.dart' ;
22
24
import '../../codes/cfe_codes.dart' ;
@@ -26,6 +28,7 @@ import '../../fragment/fragment.dart';
26
28
import '../../kernel/body_builder_context.dart' ;
27
29
import '../../kernel/constructor_tearoff_lowering.dart' ;
28
30
import '../../kernel/kernel_helper.dart' ;
31
+ import '../../source/builder_factory.dart' ;
29
32
import '../../source/name_scheme.dart' ;
30
33
import '../../source/redirecting_factory_body.dart' ;
31
34
import '../../source/source_factory_builder.dart' ;
@@ -69,45 +72,8 @@ class FactoryEncoding implements InferredTypeListener {
69
72
? AsyncMarker .Sync
70
73
: _fragment.asyncModifier;
71
74
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
-
107
75
Procedure get procedure => _procedure;
108
76
109
- Procedure ? get tearOff => _tearOff;
110
-
111
77
@override
112
78
// Coverage-ignore(suite): Not run.
113
79
void onInferredType (DartType type) {
@@ -134,7 +100,37 @@ class FactoryEncoding implements InferredTypeListener {
134
100
{required SourceLibraryBuilder libraryBuilder,
135
101
required SourceFactoryBuilder factoryBuilder,
136
102
required BuildNodesCallback f,
103
+ required String name,
104
+ required NameScheme nameScheme,
105
+ required FactoryReferences ? factoryReferences,
137
106
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
+
138
134
_procedure.function.asyncMarker = _asyncModifier;
139
135
if (_redirectionTarget == null &&
140
136
! _fragment.modifiers.isAbstract &&
@@ -751,3 +747,95 @@ class FactoryEncoding implements InferredTypeListener {
751
747
return null ;
752
748
}
753
749
}
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