@@ -19,6 +19,7 @@ import '../fasta_codes.dart';
19
19
import '../names.dart' ;
20
20
import '../problems.dart' show unhandled;
21
21
import '../source/source_library_builder.dart' show SourceLibraryBuilder;
22
+ import '../type_inference/type_constraint_gatherer.dart' ;
22
23
import '../type_inference/type_inference_engine.dart' ;
23
24
import '../type_inference/type_inferrer.dart' ;
24
25
import '../type_inference/type_schema.dart' show UnknownType;
@@ -2027,17 +2028,20 @@ class InferenceVisitor
2027
2028
inferredSpreadTypes = new Map <TreeNode , DartType >.identity ();
2028
2029
inferredConditionTypes = new Map <Expression , DartType >.identity ();
2029
2030
}
2031
+ TypeConstraintGatherer ? gatherer;
2030
2032
if (inferenceNeeded) {
2031
2033
inferredTypes = [const UnknownType ()];
2032
- inferrer.typeSchemaEnvironment.inferGenericFunctionOrType (
2034
+ gatherer = inferrer.typeSchemaEnvironment.setupGenericTypeInference (
2033
2035
listType,
2034
2036
listClass.typeParameters,
2035
- null ,
2036
- null ,
2037
2037
typeContext,
2038
- inferredTypes,
2039
2038
inferrer.libraryBuilder.library,
2040
2039
isConst: node.isConst);
2040
+ inferrer.typeSchemaEnvironment.downwardsInfer (
2041
+ gatherer,
2042
+ listClass.typeParameters,
2043
+ inferredTypes,
2044
+ inferrer.libraryBuilder.library);
2041
2045
inferredTypeArgument = inferredTypes[0 ];
2042
2046
if (inferrer.dataForTesting != null ) {
2043
2047
inferrer.dataForTesting! .typeInferenceResult
@@ -2063,12 +2067,10 @@ class InferenceVisitor
2063
2067
}
2064
2068
}
2065
2069
if (inferenceNeeded) {
2066
- inferrer.typeSchemaEnvironment.inferGenericFunctionOrType (
2067
- listType,
2070
+ gatherer! .constrainArguments (formalTypes! , actualTypes! );
2071
+ inferrer.typeSchemaEnvironment.upwardsInfer (
2072
+ gatherer,
2068
2073
listClass.typeParameters,
2069
- formalTypes,
2070
- actualTypes,
2071
- typeContext,
2072
2074
inferredTypes! ,
2073
2075
inferrer.libraryBuilder.library);
2074
2076
inferredTypeArgument = inferredTypes[0 ];
@@ -2711,17 +2713,20 @@ class InferenceVisitor
2711
2713
inferredSpreadTypes = new Map <TreeNode , DartType >.identity ();
2712
2714
inferredConditionTypes = new Map <Expression , DartType >.identity ();
2713
2715
}
2716
+ TypeConstraintGatherer ? gatherer;
2714
2717
if (inferenceNeeded) {
2715
2718
inferredTypes = [noInferredType, noInferredType];
2716
- inferrer.typeSchemaEnvironment.inferGenericFunctionOrType (
2719
+ gatherer = inferrer.typeSchemaEnvironment.setupGenericTypeInference (
2717
2720
mapType,
2718
2721
mapClass.typeParameters,
2719
- null ,
2720
- null ,
2721
2722
typeContext,
2722
- inferredTypes,
2723
2723
inferrer.libraryBuilder.library,
2724
2724
isConst: node.isConst);
2725
+ inferrer.typeSchemaEnvironment.downwardsInfer (
2726
+ gatherer,
2727
+ mapClass.typeParameters,
2728
+ inferredTypes,
2729
+ inferrer.libraryBuilder.library);
2725
2730
inferredKeyType = inferredTypes[0 ];
2726
2731
inferredValueType = inferredTypes[1 ];
2727
2732
if (inferrer.dataForTesting != null ) {
@@ -2792,22 +2797,25 @@ class InferenceVisitor
2792
2797
}
2793
2798
2794
2799
List <DartType > inferredTypesForSet = < DartType > [noInferredType];
2795
- inferrer.typeSchemaEnvironment.inferGenericFunctionOrType (
2796
- setType,
2800
+ // Note: we don't use the previously created gatherer because it was set
2801
+ // up presuming that the literal would be a map; we now know that it
2802
+ // needs to be a set.
2803
+ TypeConstraintGatherer gatherer = inferrer.typeSchemaEnvironment
2804
+ .setupGenericTypeInference (
2805
+ setType,
2806
+ inferrer.coreTypes.setClass.typeParameters,
2807
+ typeContext,
2808
+ inferrer.libraryBuilder.library,
2809
+ isConst: node.isConst);
2810
+ inferrer.typeSchemaEnvironment.downwardsInfer (
2811
+ gatherer,
2797
2812
inferrer.coreTypes.setClass.typeParameters,
2798
- null ,
2799
- null ,
2800
- typeContext,
2801
2813
inferredTypesForSet,
2802
- inferrer.libraryBuilder.library,
2803
- isConst: node.isConst);
2804
- inferrer.typeSchemaEnvironment.inferGenericFunctionOrType (
2805
- inferrer.coreTypes.thisInterfaceType (inferrer.coreTypes.setClass,
2806
- inferrer.libraryBuilder.nonNullable),
2814
+ inferrer.libraryBuilder.library);
2815
+ gatherer.constrainArguments (formalTypesForSet, actualTypesForSet! );
2816
+ inferrer.typeSchemaEnvironment.upwardsInfer (
2817
+ gatherer,
2807
2818
inferrer.coreTypes.setClass.typeParameters,
2808
- formalTypesForSet,
2809
- actualTypesForSet,
2810
- typeContext,
2811
2819
inferredTypesForSet,
2812
2820
inferrer.libraryBuilder.library);
2813
2821
DartType inferredTypeArgument = inferredTypesForSet[0 ];
@@ -2855,12 +2863,10 @@ class InferenceVisitor
2855
2863
NeverType .fromNullability (inferrer.libraryBuilder.nonNullable),
2856
2864
replacement);
2857
2865
}
2858
- inferrer.typeSchemaEnvironment.inferGenericFunctionOrType (
2859
- mapType,
2866
+ gatherer! .constrainArguments (formalTypes! , actualTypes! );
2867
+ inferrer.typeSchemaEnvironment.upwardsInfer (
2868
+ gatherer,
2860
2869
mapClass.typeParameters,
2861
- formalTypes,
2862
- actualTypes,
2863
- typeContext,
2864
2870
inferredTypes! ,
2865
2871
inferrer.libraryBuilder.library);
2866
2872
inferredKeyType = inferredTypes[0 ];
@@ -5977,17 +5983,20 @@ class InferenceVisitor
5977
5983
inferredSpreadTypes = new Map <TreeNode , DartType >.identity ();
5978
5984
inferredConditionTypes = new Map <Expression , DartType >.identity ();
5979
5985
}
5986
+ TypeConstraintGatherer ? gatherer;
5980
5987
if (inferenceNeeded) {
5981
5988
inferredTypes = [const UnknownType ()];
5982
- inferrer.typeSchemaEnvironment.inferGenericFunctionOrType (
5989
+ gatherer = inferrer.typeSchemaEnvironment.setupGenericTypeInference (
5983
5990
setType,
5984
5991
setClass.typeParameters,
5985
- null ,
5986
- null ,
5987
5992
typeContext,
5988
- inferredTypes,
5989
5993
inferrer.libraryBuilder.library,
5990
5994
isConst: node.isConst);
5995
+ inferrer.typeSchemaEnvironment.downwardsInfer (
5996
+ gatherer,
5997
+ setClass.typeParameters,
5998
+ inferredTypes,
5999
+ inferrer.libraryBuilder.library);
5991
6000
inferredTypeArgument = inferredTypes[0 ];
5992
6001
if (inferrer.dataForTesting != null ) {
5993
6002
inferrer.dataForTesting! .typeInferenceResult
@@ -6013,12 +6022,10 @@ class InferenceVisitor
6013
6022
}
6014
6023
}
6015
6024
if (inferenceNeeded) {
6016
- inferrer.typeSchemaEnvironment.inferGenericFunctionOrType (
6017
- setType,
6025
+ gatherer! .constrainArguments (formalTypes! , actualTypes! );
6026
+ inferrer.typeSchemaEnvironment.upwardsInfer (
6027
+ gatherer,
6018
6028
setClass.typeParameters,
6019
- formalTypes,
6020
- actualTypes,
6021
- typeContext,
6022
6029
inferredTypes! ,
6023
6030
inferrer.libraryBuilder.library);
6024
6031
inferredTypeArgument = inferredTypes[0 ];
0 commit comments