Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 704446d

Browse files
Disable implicit casts but keep dynamic casts when NNBD enabled
Change-Id: Ia0a3271c9137bc8c7fa4cdbd469cf93d9453b69c Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/103405 Reviewed-by: Brian Wilkerson <[email protected]> Reviewed-by: Paul Berry <[email protected]> Commit-Queue: Mike Fairhurst <[email protected]>
1 parent 4926236 commit 704446d

File tree

9 files changed

+151
-36
lines changed

9 files changed

+151
-36
lines changed

pkg/analyzer/lib/src/dart/constant/evaluation.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1606,6 +1606,7 @@ class ConstantVisitor extends UnifyingAstVisitor<DartObjectImpl> {
16061606
typeSystem.isAssignableTo(staticType, _typeProvider.boolType)) {
16071607
// If the static type is not assignable, then we will have already
16081608
// reported this error.
1609+
// TODO(mfairhurst) get the FeatureSet to suppress this for nnbd too.
16091610
_errorReporter.reportErrorForNode(
16101611
CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, condition);
16111612
}

pkg/analyzer/lib/src/error/inheritance_override.dart

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'package:analyzer/dart/analysis/features.dart';
56
import 'package:analyzer/dart/ast/ast.dart';
67
import 'package:analyzer/dart/constant/value.dart';
78
import 'package:analyzer/dart/element/element.dart';
89
import 'package:analyzer/dart/element/type.dart';
910
import 'package:analyzer/error/error.dart';
1011
import 'package:analyzer/error/listener.dart';
12+
import 'package:analyzer/src/dart/ast/ast.dart';
1113
import 'package:analyzer/src/dart/constant/value.dart';
1214
import 'package:analyzer/src/dart/element/element.dart';
1315
import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
@@ -37,6 +39,7 @@ class InheritanceOverrideVerifier {
3739
typeProvider: _typeProvider,
3840
inheritance: _inheritance,
3941
reporter: _reporter,
42+
featureSet: unit.featureSet,
4043
library: library,
4144
classNameNode: declaration.name,
4245
implementsClause: declaration.implementsClause,
@@ -50,6 +53,7 @@ class InheritanceOverrideVerifier {
5053
typeProvider: _typeProvider,
5154
inheritance: _inheritance,
5255
reporter: _reporter,
56+
featureSet: unit.featureSet,
5357
library: library,
5458
classNameNode: declaration.name,
5559
implementsClause: declaration.implementsClause,
@@ -62,6 +66,7 @@ class InheritanceOverrideVerifier {
6266
typeProvider: _typeProvider,
6367
inheritance: _inheritance,
6468
reporter: _reporter,
69+
featureSet: unit.featureSet,
6570
library: library,
6671
classNameNode: declaration.name,
6772
implementsClause: declaration.implementsClause,
@@ -85,6 +90,7 @@ class _ClassVerifier {
8590
final InheritanceManager2 inheritance;
8691
final ErrorReporter reporter;
8792

93+
final FeatureSet featureSet;
8894
final LibraryElement library;
8995
final Uri libraryUri;
9096
final ClassElementImpl classElement;
@@ -108,6 +114,7 @@ class _ClassVerifier {
108114
this.typeProvider,
109115
this.inheritance,
110116
this.reporter,
117+
this.featureSet,
111118
this.library,
112119
this.classNameNode,
113120
this.implementsClause,
@@ -382,7 +389,8 @@ class _ClassVerifier {
382389
if (setter != null && setter.parameters.length == 1) {
383390
var getterType = getter.returnType;
384391
var setterType = setter.parameters[0].type;
385-
if (!typeSystem.isAssignableTo(getterType, setterType)) {
392+
if (!typeSystem.isAssignableTo(getterType, setterType,
393+
featureSet: featureSet)) {
386394
var getterElement = getter.element;
387395
var setterElement = setter.element;
388396

pkg/analyzer/lib/src/error/literal_element_verifier.dart

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'package:analyzer/dart/analysis/features.dart';
56
import 'package:analyzer/dart/ast/ast.dart';
67
import 'package:analyzer/dart/ast/token.dart';
78
import 'package:analyzer/dart/element/type.dart';
@@ -15,6 +16,7 @@ class LiteralElementVerifier {
1516
final TypeProvider typeProvider;
1617
final TypeSystem typeSystem;
1718
final ErrorReporter errorReporter;
19+
final FeatureSet featureSet;
1820
final bool Function(Expression) checkForUseOfVoidResult;
1921

2022
final bool forList;
@@ -36,6 +38,7 @@ class LiteralElementVerifier {
3638
this.forMap = false,
3739
this.mapKeyType,
3840
this.mapValueType,
41+
this.featureSet,
3942
});
4043

4144
void verify(CollectionElement element) {
@@ -45,7 +48,7 @@ class LiteralElementVerifier {
4548
/// Check that the given [type] is assignable to the [elementType], otherwise
4649
/// report the list or set error on the [errorNode].
4750
void _checkAssignableToElementType(DartType type, AstNode errorNode) {
48-
if (!typeSystem.isAssignableTo(type, elementType)) {
51+
if (!typeSystem.isAssignableTo(type, elementType, featureSet: featureSet)) {
4952
var errorCode = forList
5053
? StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
5154
: StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE;
@@ -106,7 +109,8 @@ class LiteralElementVerifier {
106109
}
107110

108111
var keyType = entry.key.staticType;
109-
if (!typeSystem.isAssignableTo(keyType, mapKeyType)) {
112+
if (!typeSystem.isAssignableTo(keyType, mapKeyType,
113+
featureSet: featureSet)) {
110114
errorReporter.reportTypeErrorForNode(
111115
StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE,
112116
entry.key,
@@ -115,7 +119,8 @@ class LiteralElementVerifier {
115119
}
116120

117121
var valueType = entry.value.staticType;
118-
if (!typeSystem.isAssignableTo(valueType, mapValueType)) {
122+
if (!typeSystem.isAssignableTo(valueType, mapValueType,
123+
featureSet: featureSet)) {
119124
errorReporter.reportTypeErrorForNode(
120125
StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE,
121126
entry.value,
@@ -157,7 +162,8 @@ class LiteralElementVerifier {
157162
}
158163

159164
var iterableElementType = iterableType.typeArguments[0];
160-
if (!typeSystem.isAssignableTo(iterableElementType, elementType)) {
165+
if (!typeSystem.isAssignableTo(iterableElementType, elementType,
166+
featureSet: featureSet)) {
161167
var errorCode = forList
162168
? StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
163169
: StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE;
@@ -200,7 +206,8 @@ class LiteralElementVerifier {
200206
}
201207

202208
var keyType = mapType.typeArguments[0];
203-
if (!typeSystem.isAssignableTo(keyType, mapKeyType)) {
209+
if (!typeSystem.isAssignableTo(keyType, mapKeyType,
210+
featureSet: featureSet)) {
204211
errorReporter.reportTypeErrorForNode(
205212
StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE,
206213
expression,
@@ -209,7 +216,8 @@ class LiteralElementVerifier {
209216
}
210217

211218
var valueType = mapType.typeArguments[1];
212-
if (!typeSystem.isAssignableTo(valueType, mapValueType)) {
219+
if (!typeSystem.isAssignableTo(valueType, mapValueType,
220+
featureSet: featureSet)) {
213221
errorReporter.reportTypeErrorForNode(
214222
StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE,
215223
expression,

pkg/analyzer/lib/src/generated/error_verifier.dart

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,8 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
291291
/// fixed.
292292
final bool disableConflictingGenericsCheck;
293293

294-
bool _isNonNullable = false;
294+
/// The features enabled in the unit currently being checked for errors.
295+
FeatureSet _featureSet;
295296

296297
/**
297298
* Initialize a newly created error verifier.
@@ -343,6 +344,9 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
343344
_enclosingClass = classElement;
344345
}
345346

347+
bool get _isNonNullable =>
348+
_featureSet?.isEnabled(Feature.non_nullable) ?? false;
349+
346350
@override
347351
void visitAnnotation(Annotation node) {
348352
_checkForInvalidAnnotationFromDeferredLibrary(node);
@@ -558,11 +562,11 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
558562

559563
@override
560564
void visitCompilationUnit(CompilationUnit node) {
561-
_isNonNullable = node.featureSet.isEnabled(Feature.non_nullable);
565+
_featureSet = node.featureSet;
562566
_checkDuplicateUnitMembers(node);
563567
_checkForDeferredPrefixCollisions(node);
564568
super.visitCompilationUnit(node);
565-
_isNonNullable = false;
569+
_featureSet = null;
566570
}
567571

568572
@override
@@ -2103,8 +2107,8 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
21032107
FunctionType constructorType =
21042108
resolutionMap.elementDeclaredByConstructorDeclaration(declaration).type;
21052109
DartType constructorReturnType = constructorType.returnType;
2106-
if (!_typeSystem.isAssignableTo(
2107-
redirectedReturnType, constructorReturnType)) {
2110+
if (!_typeSystem.isAssignableTo(redirectedReturnType, constructorReturnType,
2111+
featureSet: _featureSet)) {
21082112
_errorReporter.reportErrorForNode(
21092113
StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE,
21102114
redirectedConstructor,
@@ -2323,7 +2327,8 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
23232327
if (expressionType == null) {
23242328
return;
23252329
}
2326-
if (_typeSystem.isAssignableTo(expressionType, type)) {
2330+
if (_typeSystem.isAssignableTo(expressionType, type,
2331+
featureSet: _featureSet)) {
23272332
return;
23282333
}
23292334
_errorReporter.reportErrorForNode(errorCode, expression, arguments);
@@ -2342,7 +2347,8 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
23422347
DartType actualStaticType,
23432348
DartType expectedStaticType,
23442349
ErrorCode errorCode) {
2345-
if (!_typeSystem.isAssignableTo(actualStaticType, expectedStaticType)) {
2350+
if (!_typeSystem.isAssignableTo(actualStaticType, expectedStaticType,
2351+
featureSet: _featureSet)) {
23462352
_errorReporter.reportTypeErrorForNode(
23472353
errorCode, expression, [actualStaticType, expectedStaticType]);
23482354
return false;
@@ -3049,7 +3055,8 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
30493055
StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE,
30503056
node.iterable,
30513057
[iterableType, loopTypeName]);
3052-
} else if (!_typeSystem.isAssignableTo(bestIterableType, variableType)) {
3058+
} else if (!_typeSystem.isAssignableTo(bestIterableType, variableType,
3059+
featureSet: _featureSet)) {
30533060
_errorReporter.reportTypeErrorForNode(
30543061
StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE,
30553062
node.iterable,
@@ -3223,7 +3230,8 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
32233230
if (staticType == null) {
32243231
return;
32253232
}
3226-
if (_typeSystem.isAssignableTo(staticType, fieldType)) {
3233+
if (_typeSystem.isAssignableTo(staticType, fieldType,
3234+
featureSet: _featureSet)) {
32273235
return;
32283236
}
32293237
// report problem
@@ -3847,7 +3855,8 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
38473855
}
38483856
DartType leftType = getStaticType(lhs);
38493857
DartType rightType = getStaticType(assignment);
3850-
if (!_typeSystem.isAssignableTo(rightType, leftType)) {
3858+
if (!_typeSystem.isAssignableTo(rightType, leftType,
3859+
featureSet: _featureSet)) {
38513860
_errorReporter.reportTypeErrorForNode(
38523861
StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [rightType, leftType]);
38533862
}
@@ -3960,6 +3969,7 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
39603969
_checkForUseOfVoidResult,
39613970
forList: true,
39623971
elementType: listElementType,
3972+
featureSet: _featureSet,
39633973
);
39643974
for (CollectionElement element in literal.elements) {
39653975
verifier.verify(element);
@@ -3995,6 +4005,7 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
39954005
forMap: true,
39964006
mapKeyType: keyType,
39974007
mapValueType: valueType,
4008+
featureSet: _featureSet,
39984009
);
39994010
for (CollectionElement element in literal.elements) {
40004011
verifier.verify(element);
@@ -4069,7 +4080,8 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
40694080
// (if the getter is null, it is dynamic which is assignable to everything).
40704081
if (setterType != null &&
40714082
getterType != null &&
4072-
!_typeSystem.isAssignableTo(getterType, setterType)) {
4083+
!_typeSystem.isAssignableTo(getterType, setterType,
4084+
featureSet: _featureSet)) {
40734085
_errorReporter.reportTypeErrorForNode(
40744086
StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES,
40754087
accessorDeclaration,
@@ -4539,7 +4551,8 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
45394551
if (!_checkForNullableDereference(condition) &&
45404552
!_checkForUseOfVoidResult(condition) &&
45414553
conditionType != null &&
4542-
!_typeSystem.isAssignableTo(conditionType, _boolType)) {
4554+
!_typeSystem.isAssignableTo(conditionType, _boolType,
4555+
featureSet: _featureSet)) {
45434556
_errorReporter.reportErrorForNode(
45444557
StaticTypeWarningCode.NON_BOOL_CONDITION, condition);
45454558
}
@@ -4555,7 +4568,8 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
45554568
Expression expression = assertion.condition;
45564569
DartType type = getStaticType(expression);
45574570
if (type is InterfaceType) {
4558-
if (!_typeSystem.isAssignableTo(type, _boolType)) {
4571+
if (!_typeSystem.isAssignableTo(type, _boolType,
4572+
featureSet: _featureSet)) {
45594573
_errorReporter.reportErrorForNode(
45604574
StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression);
45614575
}
@@ -4573,7 +4587,8 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
45734587
void _checkForNonBoolNegationExpression(Expression expression) {
45744588
DartType conditionType = getStaticType(expression);
45754589
if (conditionType != null &&
4576-
!_typeSystem.isAssignableTo(conditionType, _boolType)) {
4590+
!_typeSystem.isAssignableTo(conditionType, _boolType,
4591+
featureSet: _featureSet)) {
45774592
_errorReporter.reportErrorForNode(
45784593
StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION, expression);
45794594
}
@@ -5162,7 +5177,8 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
51625177
var checkWithType = (!_inAsync)
51635178
? fromType
51645179
: _typeProvider.futureType.instantiate(<DartType>[fromType]);
5165-
if (_typeSystem.isAssignableTo(checkWithType, expectedType)) {
5180+
if (_typeSystem.isAssignableTo(checkWithType, expectedType,
5181+
featureSet: _featureSet)) {
51665182
return;
51675183
}
51685184
}
@@ -5200,6 +5216,7 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
52005216
_checkForUseOfVoidResult,
52015217
forSet: true,
52025218
elementType: setElementType,
5219+
featureSet: _featureSet,
52035220
);
52045221
for (CollectionElement element in literal.elements) {
52055222
verifier.verify(element);
@@ -5266,7 +5283,8 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
52665283
DartType caseType = getStaticType(caseExpression);
52675284

52685285
// check types
5269-
if (!_typeSystem.isAssignableTo(expressionType, caseType)) {
5286+
if (!_typeSystem.isAssignableTo(expressionType, caseType,
5287+
featureSet: _featureSet)) {
52705288
_errorReporter.reportErrorForNode(
52715289
StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE,
52725290
expression,
@@ -5592,7 +5610,8 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
55925610
[parameter.identifier.name]);
55935611
} else if (declaredType != null &&
55945612
fieldType != null &&
5595-
!_typeSystem.isAssignableTo(declaredType, fieldType)) {
5613+
!_typeSystem.isAssignableTo(declaredType, fieldType,
5614+
featureSet: _featureSet)) {
55965615
_errorReporter.reportTypeErrorForNode(
55975616
StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE,
55985617
parameter,
@@ -5741,7 +5760,8 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
57415760
} else {
57425761
requiredReturnType = _typeProvider.iterableDynamicType;
57435762
}
5744-
if (!_typeSystem.isAssignableTo(impliedReturnType, requiredReturnType)) {
5763+
if (!_typeSystem.isAssignableTo(impliedReturnType, requiredReturnType,
5764+
featureSet: _featureSet)) {
57455765
_errorReporter.reportTypeErrorForNode(
57465766
StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
57475767
yieldExpression,

pkg/analyzer/lib/src/generated/static_type_analyzer.dart

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -602,8 +602,10 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<void> {
602602
var context = InferenceContext.getContext(
603603
(node as IntegerLiteralImpl).immediatelyNegated ? node.parent : node);
604604
if (context == null ||
605-
_typeSystem.isAssignableTo(_typeProvider.intType, context) ||
606-
!_typeSystem.isAssignableTo(_typeProvider.doubleType, context)) {
605+
_typeSystem.isAssignableTo(_typeProvider.intType, context,
606+
featureSet: _featureSet) ||
607+
!_typeSystem.isAssignableTo(_typeProvider.doubleType, context,
608+
featureSet: _featureSet)) {
607609
_recordStaticType(node, _nonNullable(_typeProvider.intType));
608610
} else {
609611
_recordStaticType(node, _nonNullable(_typeProvider.doubleType));
@@ -1165,7 +1167,8 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<void> {
11651167
void _checkForInvalidAssignmentIncDec(
11661168
AstNode node, Expression operand, DartType type) {
11671169
var operandWriteType = _getStaticType(operand);
1168-
if (!_typeSystem.isAssignableTo(type, operandWriteType)) {
1170+
if (!_typeSystem.isAssignableTo(type, operandWriteType,
1171+
featureSet: _featureSet)) {
11691172
_resolver.errorReporter.reportTypeErrorForNode(
11701173
StaticTypeWarningCode.INVALID_ASSIGNMENT,
11711174
node,

0 commit comments

Comments
 (0)