4
4
5
5
import 'dart:math' as math;
6
6
7
- import 'package:analyzer/dart/ast/ast.dart'
8
- show
9
- Annotation,
10
- AsExpression,
11
- AstNode,
12
- ConstructorName,
13
- Expression,
14
- InvocationExpression,
15
- SimpleIdentifier;
7
+ import 'package:analyzer/dart/ast/ast.dart' show AstNode;
16
8
import 'package:analyzer/dart/element/element.dart' ;
17
9
import 'package:analyzer/dart/element/type.dart' ;
18
- import 'package:analyzer/error/listener.dart' show ErrorReporter;
19
10
import 'package:analyzer/src/dart/element/element.dart' ;
20
11
import 'package:analyzer/src/dart/element/nullability_eliminator.dart' ;
21
12
import 'package:analyzer/src/dart/element/type.dart' ;
@@ -24,8 +15,7 @@ import 'package:analyzer/src/dart/element/type_constraint_gatherer.dart';
24
15
import 'package:analyzer/src/dart/element/type_provider.dart' ;
25
16
import 'package:analyzer/src/dart/element/type_schema.dart' ;
26
17
import 'package:analyzer/src/dart/element/type_system.dart' ;
27
- import 'package:analyzer/src/error/codes.dart'
28
- show CompileTimeErrorCode, HintCode;
18
+ import 'package:analyzer/src/dart/error/inference_error_listener.dart' ;
29
19
import 'package:meta/meta.dart' ;
30
20
31
21
/// Tracks upper and lower type bounds for a set of type parameters.
@@ -59,12 +49,13 @@ class GenericInferrer {
59
49
/// The list of type parameters being inferred.
60
50
final List <TypeParameterElement > _typeFormals;
61
51
62
- /// The [ErrorReporter ] to which inference errors should be reported, or
63
- /// `null` if errors shouldn't be reported.
64
- final ErrorReporter ? errorReporter ;
52
+ /// The [InferenceErrorListener ] to which inference errors should be reported,
53
+ /// or `null` if errors shouldn't be reported.
54
+ final InferenceErrorListener ? _inferenceErrorListener ;
65
55
66
56
/// The [AstNode] to which errors should be attached. May be `null` if errors
67
- /// are not being reported (that is, if [errorReporter] is also `null` ).
57
+ /// are not being reported (that is, if [_inferenceErrorListener] is also
58
+ /// `null` ).
68
59
final AstNode ? errorNode;
69
60
70
61
/// Indicates whether the "generic metadata" feature is enabled. When it is,
@@ -96,12 +87,10 @@ class GenericInferrer {
96
87
final Map <TypeParameterElement , DartType > _typesInferredSoFar = {};
97
88
98
89
GenericInferrer (this ._typeSystem, this ._typeFormals,
99
- {this .errorReporter ,
90
+ {InferenceErrorListener ? inferenceErrorListener ,
100
91
this .errorNode,
101
- required this .genericMetadataIsEnabled}) {
102
- if (errorReporter != null ) {
103
- assert (errorNode != null );
104
- }
92
+ required this .genericMetadataIsEnabled})
93
+ : _inferenceErrorListener = inferenceErrorListener {
105
94
_typeParameters.addAll (_typeFormals);
106
95
for (var formal in _typeFormals) {
107
96
_constraints[formal] = [];
@@ -219,9 +208,7 @@ class GenericInferrer {
219
208
if (! success) {
220
209
if (failAtError) return null ;
221
210
hasErrorReported = true ;
222
- errorReporter? .reportErrorForNode (
223
- CompileTimeErrorCode .COULD_NOT_INFER ,
224
- errorNode! ,
211
+ _inferenceErrorListener? .addCouldNotInferError (errorNode! ,
225
212
[parameter.name, _formatError (parameter, inferred, constraints)]);
226
213
227
214
// Heuristic: even if we failed, keep the erroneous type.
@@ -233,13 +220,12 @@ class GenericInferrer {
233
220
if (inferred is FunctionType &&
234
221
inferred.typeFormals.isNotEmpty &&
235
222
! genericMetadataIsEnabled &&
236
- errorReporter != null ) {
223
+ _inferenceErrorListener != null ) {
237
224
if (failAtError) return null ;
238
225
hasErrorReported = true ;
239
226
var typeFormals = inferred.typeFormals;
240
227
var typeFormalsStr = typeFormals.map (_elementStr).join (', ' );
241
- errorReporter! .reportErrorForNode (
242
- CompileTimeErrorCode .COULD_NOT_INFER , errorNode! , [
228
+ _inferenceErrorListener? .addCouldNotInferError (errorNode! , [
243
229
parameter.name,
244
230
' Inferred candidate type ${_typeStr (inferred )} has type parameters'
245
231
' [$typeFormalsStr ], but a function with'
@@ -249,16 +235,13 @@ class GenericInferrer {
249
235
250
236
if (UnknownInferredType .isKnown (inferred)) {
251
237
knownTypes[parameter] = inferred;
252
- } else if (_typeSystem.strictInference) {
238
+ } else if (! hasErrorReported && _typeSystem.strictInference) {
253
239
// [typeParam] could not be inferred. A result will still be returned
254
240
// by [infer], with [typeParam] filled in as its bounds. This is
255
241
// considered a failure of inference, under the "strict-inference"
256
242
// mode.
257
- _reportInferenceFailure (
258
- errorReporter: errorReporter,
259
- errorNode: errorNode,
260
- genericMetadataIsEnabled: genericMetadataIsEnabled,
261
- );
243
+ hasErrorReported = true ;
244
+ _inferenceErrorListener? .reportInferenceFailure (errorNode! );
262
245
}
263
246
}
264
247
@@ -276,8 +259,7 @@ class GenericInferrer {
276
259
var typeParamBound = Substitution .fromPairs (_typeFormals, inferredTypes)
277
260
.substituteType (typeParam.bound ?? typeProvider.objectType);
278
261
// TODO(jmesserly): improve this error message.
279
- errorReporter? .reportErrorForNode (
280
- CompileTimeErrorCode .COULD_NOT_INFER , errorNode! , [
262
+ _inferenceErrorListener? .addCouldNotInferError (errorNode! , [
281
263
typeParam.name,
282
264
"\n Recursive bound cannot be instantiated: '$typeParamBound '."
283
265
"\n Consider passing explicit type argument(s) "
@@ -288,8 +270,6 @@ class GenericInferrer {
288
270
289
271
if (! hasErrorReported) {
290
272
_checkArgumentsNotMatchingBounds (
291
- errorNode: errorNode,
292
- errorReporter: errorReporter,
293
273
typeArguments: result,
294
274
);
295
275
}
@@ -304,8 +284,6 @@ class GenericInferrer {
304
284
305
285
/// Check that inferred [typeArguments] satisfy the [typeParameters] bounds.
306
286
void _checkArgumentsNotMatchingBounds ({
307
- required AstNode ? errorNode,
308
- required ErrorReporter ? errorReporter,
309
287
required List <DartType > typeArguments,
310
288
}) {
311
289
for (int i = 0 ; i < _typeFormals.length; i++ ) {
@@ -321,8 +299,7 @@ class GenericInferrer {
321
299
var substitution = Substitution .fromPairs (_typeFormals, typeArguments);
322
300
var bound = substitution.substituteType (rawBound);
323
301
if (! _typeSystem.isSubtypeOf (argument, bound)) {
324
- errorReporter? .reportErrorForNode (
325
- CompileTimeErrorCode .COULD_NOT_INFER ,
302
+ _inferenceErrorListener? .addCouldNotInferError (
326
303
errorNode! ,
327
304
[
328
305
parameter.name,
@@ -547,83 +524,6 @@ class GenericInferrer {
547
524
}
548
525
}
549
526
550
- /// Reports an inference failure on [errorNode] according to its type.
551
- void _reportInferenceFailure ({
552
- ErrorReporter ? errorReporter,
553
- AstNode ? errorNode,
554
- required bool genericMetadataIsEnabled,
555
- }) {
556
- if (errorReporter == null || errorNode == null ) {
557
- return ;
558
- }
559
- if (errorNode.parent is InvocationExpression &&
560
- errorNode.parent? .parent is AsExpression ) {
561
- // Casts via `as` do not play a part in downward inference. We allow an
562
- // exception when inference has "failed" but the return value is
563
- // immediately cast with `as`.
564
- return ;
565
- }
566
- if (errorNode is ConstructorName &&
567
- ! (errorNode.type.type as InterfaceType ).element.hasOptionalTypeArgs) {
568
- String constructorName = errorNode.name == null
569
- ? errorNode.type.name.name
570
- : '${errorNode .type }.${errorNode .name }' ;
571
- errorReporter.reportErrorForNode (
572
- HintCode .INFERENCE_FAILURE_ON_INSTANCE_CREATION ,
573
- errorNode,
574
- [constructorName]);
575
- } else if (errorNode is Annotation ) {
576
- if (genericMetadataIsEnabled) {
577
- // Only report an error if generic metadata is valid syntax.
578
- var element = errorNode.name.staticElement;
579
- if (element != null && ! element.hasOptionalTypeArgs) {
580
- String constructorName = errorNode.constructorName == null
581
- ? errorNode.name.name
582
- : '${errorNode .name .name }.${errorNode .constructorName }' ;
583
- errorReporter.reportErrorForNode (
584
- HintCode .INFERENCE_FAILURE_ON_INSTANCE_CREATION ,
585
- errorNode,
586
- [constructorName]);
587
- }
588
- }
589
- } else if (errorNode is SimpleIdentifier ) {
590
- var element = errorNode.staticElement;
591
- if (element != null ) {
592
- if (element is VariableElement ) {
593
- // For variable elements, we check their type and possible alias type.
594
- var type = element.type;
595
- final typeElement = type is InterfaceType ? type.element : null ;
596
- if (typeElement != null && typeElement.hasOptionalTypeArgs) {
597
- return ;
598
- }
599
- var typeAliasElement = type.alias? .element;
600
- if (typeAliasElement != null &&
601
- typeAliasElement.hasOptionalTypeArgs) {
602
- return ;
603
- }
604
- }
605
- if (! element.hasOptionalTypeArgs) {
606
- errorReporter.reportErrorForNode (
607
- HintCode .INFERENCE_FAILURE_ON_FUNCTION_INVOCATION ,
608
- errorNode,
609
- [errorNode.name]);
610
- return ;
611
- }
612
- }
613
- } else if (errorNode is Expression ) {
614
- var type = errorNode.staticType;
615
- if (type != null ) {
616
- var typeDisplayString = type.getDisplayString (
617
- withNullability: _typeSystem.isNonNullableByDefault);
618
- errorReporter.reportErrorForNode (
619
- HintCode .INFERENCE_FAILURE_ON_GENERIC_INVOCATION ,
620
- errorNode,
621
- [typeDisplayString]);
622
- return ;
623
- }
624
- }
625
- }
626
-
627
527
/// If in a legacy library, return the legacy version of the [type] .
628
528
/// Otherwise, return the original type.
629
529
DartType _toLegacyElementIfOptOut (DartType type) {
0 commit comments