Test that map if elements/else elements keys/values get implicit casts
Change-Id: I920400f6924a48364d09cfc9f27dfff57bbe9044
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/97523
Commit-Queue: Mike Fairhurst <mfairhurst@google.com>
Auto-Submit: Mike Fairhurst <mfairhurst@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index e42a840..d728139 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -27,16 +27,15 @@
defineReflectiveTests(StrongModeLocalInferenceTest);
defineReflectiveTests(StrongModeStaticTypeAnalyzer2Test);
defineReflectiveTests(StrongModeTypePropagationTest);
- defineReflectiveTests(StrongModeSpreadCastsTest);
- defineReflectiveTests(StrongModeControlFlowCollectionsCastsTest);
+ defineReflectiveTests(StrongModeCastsWithUiAsCodeTest);
});
}
@reflectiveTest
-class StrongModeControlFlowCollectionsCastsTest extends ResolverTestCase {
+class StrongModeCastsWithUiAsCodeTest extends ResolverTestCase {
@override
List<String> get enabledExperiments =>
- [EnableString.control_flow_collections];
+ [EnableString.spread_collections, EnableString.control_flow_collections];
@override
bool get enableNewAnalysisDriver => true;
@@ -96,6 +95,819 @@
reason: 'Expression $expression should not have implicit cast');
}
}
+
+ test_implicitCastMetadata_ifElement_map_keys() async {
+ var source = addSource(r'''
+class C {
+ bool c;
+ dynamic dyn;
+ Object object;
+ num someNum;
+ int someInt;
+
+ void casts() {
+ <num, dynamic>{if (c) dyn: null};
+ <num, dynamic>{if (c) object: null};
+ <int, dynamic>{if (c) dyn: null};
+ <int, dynamic>{if (c) object: null};
+ <int, dynamic>{if (c) someNum: null};
+ <Null, dynamic>{if (c) dyn: null};
+ <Null, dynamic>{if (c) object: null};
+ <Null, dynamic>{if (c) someNum: null};
+ <Null, dynamic>{if (c) someInt: null};
+ <num, dynamic>{if (c) dyn: null else dyn: null};
+ <num, dynamic>{if (c) object: null else object: null};
+ <int, dynamic>{if (c) dyn: null else dyn: null};
+ <int, dynamic>{if (c) object: null else object: null};
+ <int, dynamic>{if (c) someNum: null else someNum: null};
+ <Null, dynamic>{if (c) dyn: null else dyn: null};
+ <Null, dynamic>{if (c) object: null else object: null};
+ <Null, dynamic>{if (c) someNum: null else someNum: null};
+ <Null, dynamic>{if (c) someInt: null else someInt: null};
+ }
+
+ void noCasts() {
+ <dynamic, dynamic>{if (c) dyn: null};
+ <dynamic, dynamic>{if (c) object: null};
+ <dynamic, dynamic>{if (c) someNum: null};
+ <dynamic, dynamic>{if (c) someInt: null};
+ <dynamic, dynamic>{if (c) null: null};
+ <Object, dynamic>{if (c) dyn: null};
+ <Object, dynamic>{if (c) object: null};
+ <Object, dynamic>{if (c) someNum: null};
+ <Object, dynamic>{if (c) someInt: null};
+ <Object, dynamic>{if (c) null: null};
+ <num, dynamic>{if (c) someNum: null};
+ <num, dynamic>{if (c) someInt: null};
+ <num, dynamic>{if (c) null: null};
+ <int, dynamic>{if (c) someInt: null};
+ <int, dynamic>{if (c) null: null};
+ <Null, dynamic>{if (c) null: null};
+ <dynamic, dynamic>{if (c) dyn: null else dyn: null};
+ <dynamic, dynamic>{if (c) object: null else object: null};
+ <dynamic, dynamic>{if (c) someNum: null else someNum: null};
+ <dynamic, dynamic>{if (c) someInt: null else someInt: null};
+ <dynamic, dynamic>{if (c) null: null else null: null};
+ <Object, dynamic>{if (c) dyn: null else dyn: null};
+ <Object, dynamic>{if (c) object: null else object: null};
+ <Object, dynamic>{if (c) someNum: null else someNum: null};
+ <Object, dynamic>{if (c) someInt: null else someInt: null};
+ <Object, dynamic>{if (c) null: null else null: null};
+ <num, dynamic>{if (c) someNum: null else someNum: null};
+ <num, dynamic>{if (c) someInt: null else someInt: null};
+ <num, dynamic>{if (c) null: null else null: null};
+ <int, dynamic>{if (c) someInt: null else someInt: null};
+ <int, dynamic>{if (c) null: null else null: null};
+ <Null, dynamic>{if (c) null: null else null: null};
+ }
+}
+''');
+ var unit = (await computeAnalysisResult(source)).unit;
+ assertNoErrors(source);
+
+ List<Expression> getKeys(ExpressionStatement s) {
+ SetOrMapLiteral literal = s.expression;
+ IfElement ifElement = literal.elements[0];
+ return (ifElement.elseElement == null
+ ? [ifElement.thenElement]
+ : [ifElement.thenElement, ifElement.elseElement])
+ .cast<MapLiteralEntry>()
+ .map((elem) => elem.key)
+ .toList();
+ }
+
+ DartType getMapKeyType(ExpressionStatement s) {
+ SetOrMapLiteral literal = s.expression;
+ return literal.typeArguments.arguments[0].type;
+ }
+
+ for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'casts')) {
+ for (var expression in getKeys(s)) {
+ var castType = getImplicitCast(expression);
+ expect(castType, isNotNull,
+ reason: 'Expression $expression does not have implicit cast');
+ expect(castType, equals(getMapKeyType(s)));
+ }
+ }
+
+ for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'noCasts')) {
+ for (var expression in getKeys(s)) {
+ var castType = getImplicitCast(expression);
+ expect(castType, isNull,
+ reason: 'Expression $expression should not have implicit cast');
+ }
+ }
+ }
+
+ test_implicitCastMetadata_ifElement_map_values() async {
+ var source = addSource(r'''
+class C {
+ bool c;
+ dynamic dyn;
+ Object object;
+ num someNum;
+ int someInt;
+
+ void casts() {
+ <dynamic, num>{if (c) null: dyn};
+ <dynamic, num>{if (c) null: object};
+ <dynamic, int>{if (c) null: dyn};
+ <dynamic, int>{if (c) null: object};
+ <dynamic, int>{if (c) null: someNum};
+ <dynamic, Null>{if (c) null: dyn};
+ <dynamic, Null>{if (c) null: object};
+ <dynamic, Null>{if (c) null: someNum};
+ <dynamic, Null>{if (c) null: someInt};
+ <dynamic, num>{if (c) null: dyn else null: dyn};
+ <dynamic, num>{if (c) null: object else null: object};
+ <dynamic, int>{if (c) null: dyn else null: dyn};
+ <dynamic, int>{if (c) null: object else null: object};
+ <dynamic, int>{if (c) null: someNum else null: someNum};
+ <dynamic, Null>{if (c) null: dyn else null: dyn};
+ <dynamic, Null>{if (c) null: object else null: object};
+ <dynamic, Null>{if (c) null: someNum else null: someNum};
+ <dynamic, Null>{if (c) null: someInt else null: someInt};
+ }
+
+ void noCasts() {
+ <dynamic, dynamic>{if (c) null: dyn};
+ <dynamic, dynamic>{if (c) null: object};
+ <dynamic, dynamic>{if (c) null: someNum};
+ <dynamic, dynamic>{if (c) null: someInt};
+ <dynamic, dynamic>{if (c) null: null};
+ <dynamic, Object>{if (c) null: dyn};
+ <dynamic, Object>{if (c) null: object};
+ <dynamic, Object>{if (c) null: someNum};
+ <dynamic, Object>{if (c) null: someInt};
+ <dynamic, Object>{if (c) null: null};
+ <dynamic, num>{if (c) null: someNum};
+ <dynamic, num>{if (c) null: someInt};
+ <dynamic, num>{if (c) null: null};
+ <dynamic, int>{if (c) null: someInt};
+ <dynamic, int>{if (c) null: null};
+ <dynamic, Null>{if (c) null: null};
+ <dynamic, dynamic>{if (c) null: dyn else null: dyn};
+ <dynamic, dynamic>{if (c) null: object else null: object};
+ <dynamic, dynamic>{if (c) null: someNum else null: someNum};
+ <dynamic, dynamic>{if (c) null: someInt else null: someInt};
+ <dynamic, dynamic>{if (c) null: null else null: null};
+ <dynamic, Object>{if (c) null: dyn else null: dyn};
+ <dynamic, Object>{if (c) null: object else null: object};
+ <dynamic, Object>{if (c) null: someNum else null: someNum};
+ <dynamic, Object>{if (c) null: someInt else null: someInt};
+ <dynamic, Object>{if (c) null: null else null: null};
+ <dynamic, num>{if (c) null: someNum else null: someNum};
+ <dynamic, num>{if (c) null: someInt else null: someInt};
+ <dynamic, num>{if (c) null: null else null: null};
+ <dynamic, int>{if (c) null: someInt else null: someInt};
+ <dynamic, int>{if (c) null: null else null: null};
+ <dynamic, Null>{if (c) null: null else null: null};
+ }
+}
+''');
+ var unit = (await computeAnalysisResult(source)).unit;
+ assertNoErrors(source);
+
+ List<Expression> getValues(ExpressionStatement s) {
+ SetOrMapLiteral literal = s.expression;
+ IfElement ifElement = literal.elements[0];
+ return (ifElement.elseElement == null
+ ? [ifElement.thenElement]
+ : [ifElement.thenElement, ifElement.elseElement])
+ .cast<MapLiteralEntry>()
+ .map((elem) => elem.value)
+ .toList();
+ }
+
+ DartType getMapValueType(ExpressionStatement s) {
+ SetOrMapLiteral literal = s.expression;
+ return literal.typeArguments.arguments[1].type;
+ }
+
+ for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'casts')) {
+ for (var expression in getValues(s)) {
+ var castType = getImplicitCast(expression);
+ expect(castType, isNotNull,
+ reason: 'Expression $expression does not have implicit cast');
+ expect(castType, equals(getMapValueType(s)));
+ }
+ }
+
+ for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'noCasts')) {
+ for (var expression in getValues(s)) {
+ var castType = getImplicitCast(expression);
+ expect(castType, isNull,
+ reason: 'Expression $expression should not have implicit cast');
+ }
+ }
+ }
+
+ test_implicitCastMetadata_spread_list_elements() async {
+ var source = addSource(r'''
+class C {
+ dynamic dyn;
+ Iterable<int> iInt;
+ Iterable<Object> iObject;
+ Iterable<dynamic> iDynamic;
+ Iterable<Null> iNull;
+ List<int> lInt;
+ List<Object> lObject;
+ List<dynamic> lDynamic;
+ List<Null> lNull;
+
+ void casts() {
+ <int>[...dyn];
+ <num>[...dyn];
+ <int>[...iObject];
+ <int>[...iDynamic];
+ <int>[...lObject];
+ <int>[...lDynamic];
+ <Null>[...dyn];
+ <Null>[...iObject];
+ <Null>[...iDynamic];
+ <Null>[...iInt];
+ <Null>[...lObject];
+ <Null>[...lDynamic];
+ <Null>[...lInt];
+ }
+
+ void noCasts() {
+ [...dyn];
+ <dynamic>[...dyn];
+ <Object>[...dyn];
+ <dynamic>[...iInt];
+ <Object>[...iInt];
+ <Object>[...iNull];
+ <dynamic>[...lInt];
+ <Object>[...lInt];
+ <Object>[...lNull];
+ <dynamic>[...iObject];
+ <Object>[...iObject];
+ <Object>[...iNull];
+ <dynamic>[...lObject];
+ <Object>[...lObject];
+ <Object>[...lNull];
+ <dynamic>[...iDynamic];
+ <Object>[...iDynamic];
+ <Object>[...iNull];
+ <dynamic>[...lDynamic];
+ <Object>[...lDynamic];
+ <Object>[...lNull];
+ <num>[...iInt];
+ <num>[...lInt];
+ <num>[...iNull];
+ <num>[...lNull];
+ <int>[...iInt];
+ <int>[...lInt];
+ <int>[...iNull];
+ <int>[...lNull];
+ <Null>[...iNull];
+ <Null>[...lNull];
+ }
+}
+''');
+ var unit = (await computeAnalysisResult(source)).unit;
+ assertNoErrors(source);
+
+ Expression getSpreadExpression(ExpressionStatement s) {
+ ListLiteral literal = s.expression;
+ SpreadElement spread = literal.elements[0];
+ return spread.expression;
+ }
+
+ DartType getListElementType(ExpressionStatement s) {
+ ListLiteral literal = s.expression;
+ return literal.typeArguments.arguments[0].type;
+ }
+
+ for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'casts')) {
+ var expression = getSpreadExpression(s);
+ var spreadCastType = getImplicitSpreadCast(expression);
+ expect(spreadCastType, isNotNull,
+ reason: 'Expression $expression does not have implicit cast');
+ expect(spreadCastType, equals(getListElementType(s)));
+ }
+ for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'noCasts')) {
+ var expression = getSpreadExpression(s);
+ var spreadCastType = getImplicitSpreadCast(expression);
+ expect(spreadCastType, isNull,
+ reason: 'Expression $expression should not have implicit cast');
+ }
+ }
+
+ test_implicitCastMetadata_spread_list_iterable() async {
+ var source = addSource(r'''
+class C {
+ dynamic dyn;
+ Iterable<int> iInt;
+ Iterable<Object> iObject;
+ Iterable<dynamic> iDynamic;
+ Iterable<Null> iNull;
+ List<int> lInt;
+ List<Object> lObject;
+ List<dynamic> lDynamic;
+ List<Null> lNull;
+
+ void casts() {
+ [...dyn];
+ <int>[...dyn];
+ <num>[...dyn];
+ }
+
+ void noCasts() {
+ [...iInt];
+ [...iObject];
+ [...iDynamic];
+ [...iNull];
+ <Null>[...iInt];
+ <Null>[...iObject];
+ <Null>[...iDynamic];
+ <Null>[...iNull];
+ <int>[...iInt];
+ <int>[...iObject];
+ <int>[...iDynamic];
+ <int>[...iNull];
+ [...lInt];
+ [...lObject];
+ [...lDynamic];
+ [...lNull];
+ <Null>[...lInt];
+ <Null>[...lObject];
+ <Null>[...lDynamic];
+ <Null>[...lNull];
+ <int>[...lInt];
+ <int>[...lObject];
+ <int>[...lDynamic];
+ <int>[...lNull];
+ }
+}
+''');
+ var unit = (await computeAnalysisResult(source)).unit;
+ assertNoErrors(source);
+
+ Expression getSpreadExpression(ExpressionStatement e) {
+ ListLiteral expression = e.expression;
+ SpreadElement spread = expression.elements[0];
+ return spread.expression;
+ }
+
+ for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'casts')) {
+ var expression = getSpreadExpression(s);
+ var spreadCastType = getImplicitCast(expression);
+ expect(spreadCastType, isNotNull,
+ reason: 'Expression $expression does not have implicit cast');
+ expect(spreadCastType.toString(), equals('Iterable<dynamic>'));
+ }
+ for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'noCasts')) {
+ var expression = getSpreadExpression(s);
+ var spreadCastType = getImplicitCast(expression);
+ expect(spreadCastType, isNull,
+ reason: 'Expression $expression should not have implicit cast');
+ }
+ }
+
+ test_implicitCastMetadata_spread_map_keys() async {
+ var source = addSource(r'''
+abstract class HashMap<K, V> implements Map<K, V> {}
+class C {
+ dynamic dyn;
+ Map<int, dynamic> mIntDynamic;
+ Map<Object, dynamic> mObjectDynamic;
+ Map<dynamic, dynamic> mDynamicDynamic;
+ Map<Null, dynamic> mNullDynamic;
+ HashMap<int, dynamic> hIntDynamic;
+ HashMap<Object, dynamic> hObjectDynamic;
+ HashMap<dynamic, dynamic> hDynamicDynamic;
+ HashMap<Null, dynamic> hNullDynamic;
+
+ void casts() {
+ Map m0 = <int, dynamic>{...dyn};
+ Map m1 = <num, dynamic>{...dyn};
+ Map m2 = <int, dynamic>{...mObjectDynamic};
+ Map m3 = <int, dynamic>{...mDynamicDynamic};
+ Map m4 = <int, dynamic>{...hObjectDynamic};
+ Map m5 = <int, dynamic>{...hDynamicDynamic};
+ Map m6 = <Null, dynamic>{...dyn};
+ Map m7 = <Null, dynamic>{...mObjectDynamic};
+ Map m8 = <Null, dynamic>{...mDynamicDynamic};
+ Map m9 = <Null, dynamic>{...mIntDynamic};
+ Map m10 = <Null, dynamic>{...hObjectDynamic};
+ Map m11 = <Null, dynamic>{...hDynamicDynamic};
+ Map m12 = <Null, dynamic>{...hIntDynamic};
+ }
+
+ void noCasts() {
+ Map m0 = {...dyn};
+ Map m1 = <dynamic, dynamic>{...dyn};
+ Map m2 = <Object, dynamic>{...dyn};
+ Map m3 = <dynamic, dynamic>{...mIntDynamic};
+ Map m4 = <Object, dynamic>{...mIntDynamic};
+ Map m5 = <Object, dynamic>{...mNullDynamic};
+ Map m6 = <dynamic, dynamic>{...hIntDynamic};
+ Map m7 = <Object, dynamic>{...hIntDynamic};
+ Map m8 = <Object, dynamic>{...hNullDynamic};
+ Map m9 = <dynamic, dynamic>{...mObjectDynamic};
+ Map m10 = <Object, dynamic>{...mObjectDynamic};
+ Map m11 = <Object, dynamic>{...mNullDynamic};
+ Map m12 = <dynamic, dynamic>{...hObjectDynamic};
+ Map m13 = <Object, dynamic>{...hObjectDynamic};
+ Map m14 = <Object, dynamic>{...hNullDynamic};
+ Map m15 = <dynamic, dynamic>{...mDynamicDynamic};
+ Map m16 = <Object, dynamic>{...mDynamicDynamic};
+ Map m17 = <Object, dynamic>{...mNullDynamic};
+ Map m18 = <dynamic, dynamic>{...hDynamicDynamic};
+ Map m19 = <Object, dynamic>{...hDynamicDynamic};
+ Map m20 = <Object, dynamic>{...hNullDynamic};
+ Map m21 = <num, dynamic>{...mIntDynamic};
+ Map m22 = <num, dynamic>{...hIntDynamic};
+ Map m23 = <num, dynamic>{...mNullDynamic};
+ Map m24 = <num, dynamic>{...hNullDynamic};
+ Map m25 = <int, dynamic>{...hIntDynamic};
+ Map m26 = <int, dynamic>{...mIntDynamic};
+ Map m27 = <int, dynamic>{...mNullDynamic};
+ Map m28 = <int, dynamic>{...hNullDynamic};
+ Map m29 = <Null, dynamic>{...mNullDynamic};
+ Map m30 = <Null, dynamic>{...hNullDynamic};
+ }
+}
+''');
+ var unit = (await computeAnalysisResult(source)).unit;
+ assertNoErrors(source);
+
+ Expression getSpreadExpression(VariableDeclarationStatement s) {
+ VariableDeclaration declaration = s.variables.variables[0];
+ SetOrMapLiteral literal = declaration.initializer;
+ SpreadElement spread = literal.elements[0];
+ return spread.expression;
+ }
+
+ DartType getSetElementType(VariableDeclarationStatement s) {
+ VariableDeclaration declaration = s.variables.variables[0];
+ SetOrMapLiteral literal = declaration.initializer;
+ return literal.typeArguments.arguments[0].type;
+ }
+
+ for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'casts')) {
+ var expression = getSpreadExpression(s);
+ var spreadCastType = getImplicitSpreadKeyCast(expression);
+ expect(spreadCastType, isNotNull,
+ reason: 'Expression $expression does not have implicit cast');
+ expect(spreadCastType, equals(getSetElementType(s)));
+ }
+ for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'noCasts')) {
+ var expression = getSpreadExpression(s);
+ var spreadCastType = getImplicitSpreadKeyCast(expression);
+ expect(spreadCastType, isNull,
+ reason: 'Expression $expression should not have implicit cast');
+ }
+ }
+
+ test_implicitCastMetadata_spread_map_map() async {
+ var source = addSource(r'''
+abstract class HashMap<K, V> implements Map<K, V> {}
+class C {
+ dynamic dyn;
+ Map<int, int> mIntInt;
+ Map<int, Object> mIntObject;
+ Map<Object, int> mObjectInt;
+ Map<Object, Object> mObjectObject;
+ Map<dynamic, dynamic> mDynamicDynamic;
+ Map<Null, Null> mNullNull;
+ Map<Object, Null> mObjectNull;
+ Map<Null, Object> mNullObject;
+ HashMap<int, int> hIntInt;
+ HashMap<int, Object> hIntObject;
+ HashMap<Object, int> hObjectInt;
+ HashMap<Object, Object> hObjectObject;
+ HashMap<dynamic, dynamic> hDynamicDynamic;
+ HashMap<Null, Null> hNullNull;
+
+ void casts() {
+ Map m0 = {...dyn};
+ Map m1 = <int, int>{...dyn};
+ Map m2 = <num, int>{...dyn};
+ Map m3 = <int, num>{...dyn};
+ Map m4 = <num, num>{...dyn};
+ }
+
+ void noCasts() {
+ Map m0 = {...mIntInt};
+ Map m1 = {...mIntObject};
+ Map m2 = {...mObjectInt};
+ Map m3 = {...mObjectObject};
+ Map m4 = {...mDynamicDynamic};
+ Map m5 = {...mNullObject};
+ Map m6 = {...mObjectNull};
+ Map m7 = {...mNullNull};
+ Map m8 = <Null, Null>{...mIntInt};
+ Map m9 = <Null, Null>{...mObjectObject};
+ Map m10 = <Null, Null>{...mDynamicDynamic};
+ Map m11 = <Null, Null>{...mNullNull};
+ Map m12 = <int, int>{...mIntInt};
+ Map m13 = <int, int>{...mObjectObject};
+ Map m14 = <int, int>{...mDynamicDynamic};
+ Map m15 = <int, int>{...mNullNull};
+ Map m16 = {...hIntInt};
+ Map m17 = {...hObjectObject};
+ Map m18 = {...hDynamicDynamic};
+ Map m19 = {...hNullNull};
+ Map m20 = <Null, Null>{...hIntInt};
+ Map m21 = <Null, Null>{...hObjectObject};
+ Map m22 = <Null, Null>{...hDynamicDynamic};
+ Map m23 = <Null, Null>{...hNullNull};
+ Map m24 = <int, int>{...hIntInt};
+ Map m25 = <int, int>{...hObjectObject};
+ Map m26 = <int, int>{...hDynamicDynamic};
+ Map m27 = <int, int>{...hNullNull};
+ }
+}
+''');
+ var unit = (await computeAnalysisResult(source)).unit;
+ assertNoErrors(source);
+
+ Expression getSpreadExpression(VariableDeclarationStatement s) {
+ VariableDeclaration declaration = s.variables.variables[0];
+ SetOrMapLiteral literal = declaration.initializer;
+ SpreadElement spread = literal.elements[0];
+ return spread.expression;
+ }
+
+ for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'casts')) {
+ var expression = getSpreadExpression(s);
+ var spreadCastType = getImplicitCast(expression);
+ expect(spreadCastType, isNotNull,
+ reason: 'Expression $expression does not have implicit cast');
+ expect(spreadCastType.toString(), equals('Map<dynamic, dynamic>'));
+ }
+ for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'noCasts')) {
+ var expression = getSpreadExpression(s);
+ var spreadCastType = getImplicitCast(expression);
+ expect(spreadCastType, isNull,
+ reason: 'Expression $expression should not have implicit cast');
+ }
+ }
+
+ test_implicitCastMetadata_spread_map_values() async {
+ var source = addSource(r'''
+abstract class HashMap<K, V> implements Map<K, V> {}
+class C {
+ dynamic dyn;
+ Map<dynamic, int> mDynamicInt;
+ Map<dynamic, Object> mDynamicObject;
+ Map<dynamic, dynamic> mDynamicDynamic;
+ Map<dynamic, Null> mDynamicNull;
+ HashMap<dynamic, int> hDynamicInt;
+ HashMap<dynamic, Object> hDynamicObject;
+ HashMap<dynamic, dynamic> hDynamicDynamic;
+ HashMap<dynamic, Null> hDynamicNull;
+
+ void casts() {
+ Map m0 = <dynamic, int>{...dyn};
+ Map m1 = <dynamic, num>{...dyn};
+ Map m2 = <dynamic, int>{...mDynamicObject};
+ Map m3 = <dynamic, int>{...mDynamicDynamic};
+ Map m4 = <dynamic, int>{...hDynamicObject};
+ Map m5 = <dynamic, int>{...hDynamicDynamic};
+ Map m6 = <dynamic, Null>{...dyn};
+ Map m7 = <dynamic, Null>{...mDynamicObject};
+ Map m8 = <dynamic, Null>{...mDynamicDynamic};
+ Map m9 = <dynamic, Null>{...mDynamicInt};
+ Map m10 = <dynamic, Null>{...hDynamicObject};
+ Map m11 = <dynamic, Null>{...hDynamicDynamic};
+ Map m12 = <dynamic, Null>{...hDynamicInt};
+ }
+
+ void noCasts() {
+ Map m0 = {...dyn};
+ Map m1 = <dynamic, dynamic>{...dyn};
+ Map m2 = <dynamic, Object>{...dyn};
+ Map m3 = <dynamic, dynamic>{...mDynamicInt};
+ Map m4 = <dynamic, Object>{...mDynamicInt};
+ Map m5 = <dynamic, Object>{...mDynamicNull};
+ Map m6 = <dynamic, dynamic>{...hDynamicInt};
+ Map m7 = <dynamic, Object>{...hDynamicInt};
+ Map m8 = <dynamic, Object>{...hDynamicNull};
+ Map m9 = <dynamic, dynamic>{...mDynamicObject};
+ Map m10 = <dynamic, Object>{...mDynamicObject};
+ Map m11 = <dynamic, Object>{...mDynamicNull};
+ Map m12 = <dynamic, dynamic>{...hDynamicObject};
+ Map m13 = <dynamic, Object>{...hDynamicObject};
+ Map m14 = <dynamic, Object>{...hDynamicNull};
+ Map m15 = <dynamic, dynamic>{...mDynamicDynamic};
+ Map m16 = <dynamic, Object>{...mDynamicDynamic};
+ Map m17 = <dynamic, Object>{...mDynamicNull};
+ Map m18 = <dynamic, dynamic>{...hDynamicDynamic};
+ Map m19 = <dynamic, Object>{...hDynamicDynamic};
+ Map m20 = <dynamic, Object>{...hDynamicNull};
+ Map m21 = <dynamic, num>{...mDynamicInt};
+ Map m22 = <dynamic, num>{...hDynamicInt};
+ Map m23 = <dynamic, num>{...mDynamicNull};
+ Map m24 = <dynamic, num>{...hDynamicNull};
+ Map m25 = <dynamic, int>{...hDynamicInt};
+ Map m26 = <dynamic, int>{...mDynamicInt};
+ Map m27 = <dynamic, int>{...mDynamicNull};
+ Map m28 = <dynamic, int>{...hDynamicNull};
+ Map m29 = <dynamic, Null>{...mDynamicNull};
+ Map m30 = <dynamic, Null>{...hDynamicNull};
+ }
+}
+''');
+ var unit = (await computeAnalysisResult(source)).unit;
+ assertNoErrors(source);
+
+ Expression getSpreadExpression(VariableDeclarationStatement s) {
+ VariableDeclaration declaration = s.variables.variables[0];
+ SetOrMapLiteral literal = declaration.initializer;
+ SpreadElement spread = literal.elements[0];
+ return spread.expression;
+ }
+
+ DartType getValueType(VariableDeclarationStatement s) {
+ VariableDeclaration declaration = s.variables.variables[0];
+ SetOrMapLiteral literal = declaration.initializer;
+ return literal.typeArguments.arguments[1].type;
+ }
+
+ for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'casts')) {
+ var expression = getSpreadExpression(s);
+ var spreadCastType = getImplicitSpreadValueCast(expression);
+ expect(spreadCastType, isNotNull,
+ reason: 'Expression $expression does not have implicit cast');
+ expect(spreadCastType, equals(getValueType(s)));
+ }
+ for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'noCasts')) {
+ var expression = getSpreadExpression(s);
+ var spreadCastType = getImplicitSpreadValueCast(expression);
+ expect(spreadCastType, isNull,
+ reason: 'Expression $expression should not have implicit cast');
+ }
+ }
+
+ test_implicitCastMetadata_spread_set_elements() async {
+ var source = addSource(r'''
+class C {
+ dynamic dyn;
+ Iterable<int> iInt;
+ Iterable<Object> iObject;
+ Iterable<dynamic> iDynamic;
+ Iterable<Null> iNull;
+ List<int> lInt;
+ List<Object> lObject;
+ List<dynamic> lDynamic;
+ List<Null> lNull;
+
+ void casts() {
+ Set s0 = <int>{...dyn};
+ Set s1 = <num>{...dyn};
+ Set s2 = <int>{...iObject};
+ Set s3 = <int>{...iDynamic};
+ Set s4 = <int>{...lObject};
+ Set s5 = <int>{...lDynamic};
+ Set s6 = <Null>{...dyn};
+ Set s7 = <Null>{...iObject};
+ Set s8 = <Null>{...iDynamic};
+ Set s9 = <Null>{...iInt};
+ Set s10 = <Null>{...lObject};
+ Set s11 = <Null>{...lDynamic};
+ Set s12 = <Null>{...lInt};
+ }
+
+ void noCasts() {
+ Set s0 = {...dyn};
+ Set s1 = <dynamic>{...dyn};
+ Set s2 = <Object>{...dyn};
+ Set s3 = <dynamic>{...iInt};
+ Set s4 = <Object>{...iInt};
+ Set s5 = <Object>{...iNull};
+ Set s6 = <dynamic>{...lInt};
+ Set s7 = <Object>{...lInt};
+ Set s8 = <Object>{...lNull};
+ Set s9 = <dynamic>{...iObject};
+ Set s10 = <Object>{...iObject};
+ Set s11 = <Object>{...iNull};
+ Set s12 = <dynamic>{...lObject};
+ Set s13 = <Object>{...lObject};
+ Set s14 = <Object>{...lNull};
+ Set s15 = <dynamic>{...iDynamic};
+ Set s16 = <Object>{...iDynamic};
+ Set s17 = <Object>{...iNull};
+ Set s18 = <dynamic>{...lDynamic};
+ Set s19 = <Object>{...lDynamic};
+ Set s20 = <Object>{...lNull};
+ Set s21 = <num>{...iInt};
+ Set s22 = <num>{...lInt};
+ Set s23 = <num>{...iNull};
+ Set s24 = <num>{...lNull};
+ Set s25 = <int>{...iInt};
+ Set s26 = <int>{...lInt};
+ Set s27 = <int>{...iNull};
+ Set s28 = <int>{...lNull};
+ Set s29 = <Null>{...iNull};
+ Set s30 = <Null>{...lNull};
+ }
+}
+''');
+ var unit = (await computeAnalysisResult(source)).unit;
+ assertNoErrors(source);
+
+ Expression getSpreadExpression(VariableDeclarationStatement s) {
+ VariableDeclaration declaration = s.variables.variables[0];
+ SetOrMapLiteral literal = declaration.initializer;
+ SpreadElement spread = literal.elements[0];
+ return spread.expression;
+ }
+
+ DartType getKeyType(VariableDeclarationStatement s) {
+ VariableDeclaration declaration = s.variables.variables[0];
+ SetOrMapLiteral literal = declaration.initializer;
+ return literal.typeArguments.arguments[0].type;
+ }
+
+ for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'casts')) {
+ var expression = getSpreadExpression(s);
+ var spreadCastType = getImplicitSpreadCast(expression);
+ expect(spreadCastType, isNotNull,
+ reason: 'Expression $expression does not have implicit cast');
+ expect(spreadCastType, equals(getKeyType(s)));
+ }
+ for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'noCasts')) {
+ var expression = getSpreadExpression(s);
+ var spreadCastType = getImplicitSpreadCast(expression);
+ expect(spreadCastType, isNull,
+ reason: 'Expression $expression should not have implicit cast');
+ }
+ }
+
+ test_implicitCastMetadata_spread_set_iterable() async {
+ var source = addSource(r'''
+class C {
+ dynamic dyn;
+ Iterable<int> iInt;
+ Iterable<Object> iObject;
+ Iterable<dynamic> iDynamic;
+ Iterable<Null> iNull;
+ List<int> lInt;
+ List<Object> lObject;
+ List<dynamic> lDynamic;
+ List<Null> lNull;
+
+ void casts() {
+ Set s0 = {...dyn};
+ Set s1 = <int>{...dyn};
+ Set s2 = <num>{...dyn};
+ }
+
+ void noCasts() {
+ Set s0 = {...iInt};
+ Set s1 = {...iObject};
+ Set s2 = {...iDynamic};
+ Set s3 = {...iNull};
+ Set s4 = <Null>{...iInt};
+ Set s5 = <Null>{...iObject};
+ Set s6 = <Null>{...iDynamic};
+ Set s7 = <Null>{...iNull};
+ Set s8 = <int>{...iInt};
+ Set s9 = <int>{...iObject};
+ Set s10 = <int>{...iDynamic};
+ Set s11 = <int>{...iNull};
+ Set s12 = {...lInt};
+ Set s13 = {...lObject};
+ Set s14 = {...lDynamic};
+ Set s15 = {...lNull};
+ Set s16 = <Null>{...lInt};
+ Set s17 = <Null>{...lObject};
+ Set s18 = <Null>{...lDynamic};
+ Set s19 = <Null>{...lNull};
+ Set s20 = <int>{...lInt};
+ Set s21 = <int>{...lObject};
+ Set s22 = <int>{...lDynamic};
+ }
+}
+''');
+ var unit = (await computeAnalysisResult(source)).unit;
+ assertNoErrors(source);
+
+ Expression getSpreadExpression(VariableDeclarationStatement s) {
+ VariableDeclaration declaration = s.variables.variables[0];
+ SetOrMapLiteral literal = declaration.initializer;
+ SpreadElement spread = literal.elements[0];
+ return spread.expression;
+ }
+
+ for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'casts')) {
+ var expression = getSpreadExpression(s);
+ var spreadCastType = getImplicitCast(expression);
+ expect(spreadCastType, isNotNull,
+ reason: 'Expression $expression does not have implicit cast');
+ expect(spreadCastType.toString(), equals('Iterable<dynamic>'));
+ }
+ for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'noCasts')) {
+ var expression = getSpreadExpression(s);
+ var spreadCastType = getImplicitCast(expression);
+ expect(spreadCastType, isNull,
+ reason: 'Expression $expression should not have implicit cast');
+ }
+ }
}
/// Strong mode static analyzer local type inference tests
@@ -2892,622 +3704,6 @@
}
@reflectiveTest
-class StrongModeSpreadCastsTest extends ResolverTestCase {
- @override
- List<String> get enabledExperiments => [EnableString.spread_collections];
-
- @override
- bool get enableNewAnalysisDriver => true;
-
- test_implicitCastMetadata_spread_list_elements() async {
- var source = addSource(r'''
-class C {
- dynamic dyn;
- Iterable<int> iInt;
- Iterable<Object> iObject;
- Iterable<dynamic> iDynamic;
- Iterable<Null> iNull;
- List<int> lInt;
- List<Object> lObject;
- List<dynamic> lDynamic;
- List<Null> lNull;
-
- void casts() {
- <int>[...dyn];
- <num>[...dyn];
- <int>[...iObject];
- <int>[...iDynamic];
- <int>[...lObject];
- <int>[...lDynamic];
- <Null>[...dyn];
- <Null>[...iObject];
- <Null>[...iDynamic];
- <Null>[...iInt];
- <Null>[...lObject];
- <Null>[...lDynamic];
- <Null>[...lInt];
- }
-
- void noCasts() {
- [...dyn];
- <dynamic>[...dyn];
- <Object>[...dyn];
- <dynamic>[...iInt];
- <Object>[...iInt];
- <Object>[...iNull];
- <dynamic>[...lInt];
- <Object>[...lInt];
- <Object>[...lNull];
- <dynamic>[...iObject];
- <Object>[...iObject];
- <Object>[...iNull];
- <dynamic>[...lObject];
- <Object>[...lObject];
- <Object>[...lNull];
- <dynamic>[...iDynamic];
- <Object>[...iDynamic];
- <Object>[...iNull];
- <dynamic>[...lDynamic];
- <Object>[...lDynamic];
- <Object>[...lNull];
- <num>[...iInt];
- <num>[...lInt];
- <num>[...iNull];
- <num>[...lNull];
- <int>[...iInt];
- <int>[...lInt];
- <int>[...iNull];
- <int>[...lNull];
- <Null>[...iNull];
- <Null>[...lNull];
- }
-}
-''');
- var unit = (await computeAnalysisResult(source)).unit;
- assertNoErrors(source);
-
- Expression getSpreadExpression(ExpressionStatement s) {
- ListLiteral literal = s.expression;
- SpreadElement spread = literal.elements[0];
- return spread.expression;
- }
-
- DartType getListElementType(ExpressionStatement s) {
- ListLiteral literal = s.expression;
- return literal.typeArguments.arguments[0].type;
- }
-
- for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'casts')) {
- var expression = getSpreadExpression(s);
- var spreadCastType = getImplicitSpreadCast(expression);
- expect(spreadCastType, isNotNull,
- reason: 'Expression $expression does not have implicit cast');
- expect(spreadCastType, equals(getListElementType(s)));
- }
- for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'noCasts')) {
- var expression = getSpreadExpression(s);
- var spreadCastType = getImplicitSpreadCast(expression);
- expect(spreadCastType, isNull,
- reason: 'Expression $expression should not have implicit cast');
- }
- }
-
- test_implicitCastMetadata_spread_list_iterable() async {
- var source = addSource(r'''
-class C {
- dynamic dyn;
- Iterable<int> iInt;
- Iterable<Object> iObject;
- Iterable<dynamic> iDynamic;
- Iterable<Null> iNull;
- List<int> lInt;
- List<Object> lObject;
- List<dynamic> lDynamic;
- List<Null> lNull;
-
- void casts() {
- [...dyn];
- <int>[...dyn];
- <num>[...dyn];
- }
-
- void noCasts() {
- [...iInt];
- [...iObject];
- [...iDynamic];
- [...iNull];
- <Null>[...iInt];
- <Null>[...iObject];
- <Null>[...iDynamic];
- <Null>[...iNull];
- <int>[...iInt];
- <int>[...iObject];
- <int>[...iDynamic];
- <int>[...iNull];
- [...lInt];
- [...lObject];
- [...lDynamic];
- [...lNull];
- <Null>[...lInt];
- <Null>[...lObject];
- <Null>[...lDynamic];
- <Null>[...lNull];
- <int>[...lInt];
- <int>[...lObject];
- <int>[...lDynamic];
- <int>[...lNull];
- }
-}
-''');
- var unit = (await computeAnalysisResult(source)).unit;
- assertNoErrors(source);
-
- Expression getSpreadExpression(ExpressionStatement e) {
- ListLiteral expression = e.expression;
- SpreadElement spread = expression.elements[0];
- return spread.expression;
- }
-
- for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'casts')) {
- var expression = getSpreadExpression(s);
- var spreadCastType = getImplicitCast(expression);
- expect(spreadCastType, isNotNull,
- reason: 'Expression $expression does not have implicit cast');
- expect(spreadCastType.toString(), equals('Iterable<dynamic>'));
- }
- for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'noCasts')) {
- var expression = getSpreadExpression(s);
- var spreadCastType = getImplicitCast(expression);
- expect(spreadCastType, isNull,
- reason: 'Expression $expression should not have implicit cast');
- }
- }
-
- test_implicitCastMetadata_spread_map_keys() async {
- var source = addSource(r'''
-abstract class HashMap<K, V> implements Map<K, V> {}
-class C {
- dynamic dyn;
- Map<int, dynamic> mIntDynamic;
- Map<Object, dynamic> mObjectDynamic;
- Map<dynamic, dynamic> mDynamicDynamic;
- Map<Null, dynamic> mNullDynamic;
- HashMap<int, dynamic> hIntDynamic;
- HashMap<Object, dynamic> hObjectDynamic;
- HashMap<dynamic, dynamic> hDynamicDynamic;
- HashMap<Null, dynamic> hNullDynamic;
-
- void casts() {
- Map m0 = <int, dynamic>{...dyn};
- Map m1 = <num, dynamic>{...dyn};
- Map m2 = <int, dynamic>{...mObjectDynamic};
- Map m3 = <int, dynamic>{...mDynamicDynamic};
- Map m4 = <int, dynamic>{...hObjectDynamic};
- Map m5 = <int, dynamic>{...hDynamicDynamic};
- Map m6 = <Null, dynamic>{...dyn};
- Map m7 = <Null, dynamic>{...mObjectDynamic};
- Map m8 = <Null, dynamic>{...mDynamicDynamic};
- Map m9 = <Null, dynamic>{...mIntDynamic};
- Map m10 = <Null, dynamic>{...hObjectDynamic};
- Map m11 = <Null, dynamic>{...hDynamicDynamic};
- Map m12 = <Null, dynamic>{...hIntDynamic};
- }
-
- void noCasts() {
- Map m0 = {...dyn};
- Map m1 = <dynamic, dynamic>{...dyn};
- Map m2 = <Object, dynamic>{...dyn};
- Map m3 = <dynamic, dynamic>{...mIntDynamic};
- Map m4 = <Object, dynamic>{...mIntDynamic};
- Map m5 = <Object, dynamic>{...mNullDynamic};
- Map m6 = <dynamic, dynamic>{...hIntDynamic};
- Map m7 = <Object, dynamic>{...hIntDynamic};
- Map m8 = <Object, dynamic>{...hNullDynamic};
- Map m9 = <dynamic, dynamic>{...mObjectDynamic};
- Map m10 = <Object, dynamic>{...mObjectDynamic};
- Map m11 = <Object, dynamic>{...mNullDynamic};
- Map m12 = <dynamic, dynamic>{...hObjectDynamic};
- Map m13 = <Object, dynamic>{...hObjectDynamic};
- Map m14 = <Object, dynamic>{...hNullDynamic};
- Map m15 = <dynamic, dynamic>{...mDynamicDynamic};
- Map m16 = <Object, dynamic>{...mDynamicDynamic};
- Map m17 = <Object, dynamic>{...mNullDynamic};
- Map m18 = <dynamic, dynamic>{...hDynamicDynamic};
- Map m19 = <Object, dynamic>{...hDynamicDynamic};
- Map m20 = <Object, dynamic>{...hNullDynamic};
- Map m21 = <num, dynamic>{...mIntDynamic};
- Map m22 = <num, dynamic>{...hIntDynamic};
- Map m23 = <num, dynamic>{...mNullDynamic};
- Map m24 = <num, dynamic>{...hNullDynamic};
- Map m25 = <int, dynamic>{...hIntDynamic};
- Map m26 = <int, dynamic>{...mIntDynamic};
- Map m27 = <int, dynamic>{...mNullDynamic};
- Map m28 = <int, dynamic>{...hNullDynamic};
- Map m29 = <Null, dynamic>{...mNullDynamic};
- Map m30 = <Null, dynamic>{...hNullDynamic};
- }
-}
-''');
- var unit = (await computeAnalysisResult(source)).unit;
- assertNoErrors(source);
-
- Expression getSpreadExpression(VariableDeclarationStatement s) {
- VariableDeclaration declaration = s.variables.variables[0];
- SetOrMapLiteral literal = declaration.initializer;
- SpreadElement spread = literal.elements[0];
- return spread.expression;
- }
-
- DartType getSetElementType(VariableDeclarationStatement s) {
- VariableDeclaration declaration = s.variables.variables[0];
- SetOrMapLiteral literal = declaration.initializer;
- return literal.typeArguments.arguments[0].type;
- }
-
- for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'casts')) {
- var expression = getSpreadExpression(s);
- var spreadCastType = getImplicitSpreadKeyCast(expression);
- expect(spreadCastType, isNotNull,
- reason: 'Expression $expression does not have implicit cast');
- expect(spreadCastType, equals(getSetElementType(s)));
- }
- for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'noCasts')) {
- var expression = getSpreadExpression(s);
- var spreadCastType = getImplicitSpreadKeyCast(expression);
- expect(spreadCastType, isNull,
- reason: 'Expression $expression should not have implicit cast');
- }
- }
-
- test_implicitCastMetadata_spread_map_map() async {
- var source = addSource(r'''
-abstract class HashMap<K, V> implements Map<K, V> {}
-class C {
- dynamic dyn;
- Map<int, int> mIntInt;
- Map<int, Object> mIntObject;
- Map<Object, int> mObjectInt;
- Map<Object, Object> mObjectObject;
- Map<dynamic, dynamic> mDynamicDynamic;
- Map<Null, Null> mNullNull;
- Map<Object, Null> mObjectNull;
- Map<Null, Object> mNullObject;
- HashMap<int, int> hIntInt;
- HashMap<int, Object> hIntObject;
- HashMap<Object, int> hObjectInt;
- HashMap<Object, Object> hObjectObject;
- HashMap<dynamic, dynamic> hDynamicDynamic;
- HashMap<Null, Null> hNullNull;
-
- void casts() {
- Map m0 = {...dyn};
- Map m1 = <int, int>{...dyn};
- Map m2 = <num, int>{...dyn};
- Map m3 = <int, num>{...dyn};
- Map m4 = <num, num>{...dyn};
- }
-
- void noCasts() {
- Map m0 = {...mIntInt};
- Map m1 = {...mIntObject};
- Map m2 = {...mObjectInt};
- Map m3 = {...mObjectObject};
- Map m4 = {...mDynamicDynamic};
- Map m5 = {...mNullObject};
- Map m6 = {...mObjectNull};
- Map m7 = {...mNullNull};
- Map m8 = <Null, Null>{...mIntInt};
- Map m9 = <Null, Null>{...mObjectObject};
- Map m10 = <Null, Null>{...mDynamicDynamic};
- Map m11 = <Null, Null>{...mNullNull};
- Map m12 = <int, int>{...mIntInt};
- Map m13 = <int, int>{...mObjectObject};
- Map m14 = <int, int>{...mDynamicDynamic};
- Map m15 = <int, int>{...mNullNull};
- Map m16 = {...hIntInt};
- Map m17 = {...hObjectObject};
- Map m18 = {...hDynamicDynamic};
- Map m19 = {...hNullNull};
- Map m20 = <Null, Null>{...hIntInt};
- Map m21 = <Null, Null>{...hObjectObject};
- Map m22 = <Null, Null>{...hDynamicDynamic};
- Map m23 = <Null, Null>{...hNullNull};
- Map m24 = <int, int>{...hIntInt};
- Map m25 = <int, int>{...hObjectObject};
- Map m26 = <int, int>{...hDynamicDynamic};
- Map m27 = <int, int>{...hNullNull};
- }
-}
-''');
- var unit = (await computeAnalysisResult(source)).unit;
- assertNoErrors(source);
-
- Expression getSpreadExpression(VariableDeclarationStatement s) {
- VariableDeclaration declaration = s.variables.variables[0];
- SetOrMapLiteral literal = declaration.initializer;
- SpreadElement spread = literal.elements[0];
- return spread.expression;
- }
-
- for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'casts')) {
- var expression = getSpreadExpression(s);
- var spreadCastType = getImplicitCast(expression);
- expect(spreadCastType, isNotNull,
- reason: 'Expression $expression does not have implicit cast');
- expect(spreadCastType.toString(), equals('Map<dynamic, dynamic>'));
- }
- for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'noCasts')) {
- var expression = getSpreadExpression(s);
- var spreadCastType = getImplicitCast(expression);
- expect(spreadCastType, isNull,
- reason: 'Expression $expression should not have implicit cast');
- }
- }
-
- test_implicitCastMetadata_spread_map_values() async {
- var source = addSource(r'''
-abstract class HashMap<K, V> implements Map<K, V> {}
-class C {
- dynamic dyn;
- Map<dynamic, int> mDynamicInt;
- Map<dynamic, Object> mDynamicObject;
- Map<dynamic, dynamic> mDynamicDynamic;
- Map<dynamic, Null> mDynamicNull;
- HashMap<dynamic, int> hDynamicInt;
- HashMap<dynamic, Object> hDynamicObject;
- HashMap<dynamic, dynamic> hDynamicDynamic;
- HashMap<dynamic, Null> hDynamicNull;
-
- void casts() {
- Map m0 = <dynamic, int>{...dyn};
- Map m1 = <dynamic, num>{...dyn};
- Map m2 = <dynamic, int>{...mDynamicObject};
- Map m3 = <dynamic, int>{...mDynamicDynamic};
- Map m4 = <dynamic, int>{...hDynamicObject};
- Map m5 = <dynamic, int>{...hDynamicDynamic};
- Map m6 = <dynamic, Null>{...dyn};
- Map m7 = <dynamic, Null>{...mDynamicObject};
- Map m8 = <dynamic, Null>{...mDynamicDynamic};
- Map m9 = <dynamic, Null>{...mDynamicInt};
- Map m10 = <dynamic, Null>{...hDynamicObject};
- Map m11 = <dynamic, Null>{...hDynamicDynamic};
- Map m12 = <dynamic, Null>{...hDynamicInt};
- }
-
- void noCasts() {
- Map m0 = {...dyn};
- Map m1 = <dynamic, dynamic>{...dyn};
- Map m2 = <dynamic, Object>{...dyn};
- Map m3 = <dynamic, dynamic>{...mDynamicInt};
- Map m4 = <dynamic, Object>{...mDynamicInt};
- Map m5 = <dynamic, Object>{...mDynamicNull};
- Map m6 = <dynamic, dynamic>{...hDynamicInt};
- Map m7 = <dynamic, Object>{...hDynamicInt};
- Map m8 = <dynamic, Object>{...hDynamicNull};
- Map m9 = <dynamic, dynamic>{...mDynamicObject};
- Map m10 = <dynamic, Object>{...mDynamicObject};
- Map m11 = <dynamic, Object>{...mDynamicNull};
- Map m12 = <dynamic, dynamic>{...hDynamicObject};
- Map m13 = <dynamic, Object>{...hDynamicObject};
- Map m14 = <dynamic, Object>{...hDynamicNull};
- Map m15 = <dynamic, dynamic>{...mDynamicDynamic};
- Map m16 = <dynamic, Object>{...mDynamicDynamic};
- Map m17 = <dynamic, Object>{...mDynamicNull};
- Map m18 = <dynamic, dynamic>{...hDynamicDynamic};
- Map m19 = <dynamic, Object>{...hDynamicDynamic};
- Map m20 = <dynamic, Object>{...hDynamicNull};
- Map m21 = <dynamic, num>{...mDynamicInt};
- Map m22 = <dynamic, num>{...hDynamicInt};
- Map m23 = <dynamic, num>{...mDynamicNull};
- Map m24 = <dynamic, num>{...hDynamicNull};
- Map m25 = <dynamic, int>{...hDynamicInt};
- Map m26 = <dynamic, int>{...mDynamicInt};
- Map m27 = <dynamic, int>{...mDynamicNull};
- Map m28 = <dynamic, int>{...hDynamicNull};
- Map m29 = <dynamic, Null>{...mDynamicNull};
- Map m30 = <dynamic, Null>{...hDynamicNull};
- }
-}
-''');
- var unit = (await computeAnalysisResult(source)).unit;
- assertNoErrors(source);
-
- Expression getSpreadExpression(VariableDeclarationStatement s) {
- VariableDeclaration declaration = s.variables.variables[0];
- SetOrMapLiteral literal = declaration.initializer;
- SpreadElement spread = literal.elements[0];
- return spread.expression;
- }
-
- DartType getValueType(VariableDeclarationStatement s) {
- VariableDeclaration declaration = s.variables.variables[0];
- SetOrMapLiteral literal = declaration.initializer;
- return literal.typeArguments.arguments[1].type;
- }
-
- for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'casts')) {
- var expression = getSpreadExpression(s);
- var spreadCastType = getImplicitSpreadValueCast(expression);
- expect(spreadCastType, isNotNull,
- reason: 'Expression $expression does not have implicit cast');
- expect(spreadCastType, equals(getValueType(s)));
- }
- for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'noCasts')) {
- var expression = getSpreadExpression(s);
- var spreadCastType = getImplicitSpreadValueCast(expression);
- expect(spreadCastType, isNull,
- reason: 'Expression $expression should not have implicit cast');
- }
- }
-
- test_implicitCastMetadata_spread_set_elements() async {
- var source = addSource(r'''
-class C {
- dynamic dyn;
- Iterable<int> iInt;
- Iterable<Object> iObject;
- Iterable<dynamic> iDynamic;
- Iterable<Null> iNull;
- List<int> lInt;
- List<Object> lObject;
- List<dynamic> lDynamic;
- List<Null> lNull;
-
- void casts() {
- Set s0 = <int>{...dyn};
- Set s1 = <num>{...dyn};
- Set s2 = <int>{...iObject};
- Set s3 = <int>{...iDynamic};
- Set s4 = <int>{...lObject};
- Set s5 = <int>{...lDynamic};
- Set s6 = <Null>{...dyn};
- Set s7 = <Null>{...iObject};
- Set s8 = <Null>{...iDynamic};
- Set s9 = <Null>{...iInt};
- Set s10 = <Null>{...lObject};
- Set s11 = <Null>{...lDynamic};
- Set s12 = <Null>{...lInt};
- }
-
- void noCasts() {
- Set s0 = {...dyn};
- Set s1 = <dynamic>{...dyn};
- Set s2 = <Object>{...dyn};
- Set s3 = <dynamic>{...iInt};
- Set s4 = <Object>{...iInt};
- Set s5 = <Object>{...iNull};
- Set s6 = <dynamic>{...lInt};
- Set s7 = <Object>{...lInt};
- Set s8 = <Object>{...lNull};
- Set s9 = <dynamic>{...iObject};
- Set s10 = <Object>{...iObject};
- Set s11 = <Object>{...iNull};
- Set s12 = <dynamic>{...lObject};
- Set s13 = <Object>{...lObject};
- Set s14 = <Object>{...lNull};
- Set s15 = <dynamic>{...iDynamic};
- Set s16 = <Object>{...iDynamic};
- Set s17 = <Object>{...iNull};
- Set s18 = <dynamic>{...lDynamic};
- Set s19 = <Object>{...lDynamic};
- Set s20 = <Object>{...lNull};
- Set s21 = <num>{...iInt};
- Set s22 = <num>{...lInt};
- Set s23 = <num>{...iNull};
- Set s24 = <num>{...lNull};
- Set s25 = <int>{...iInt};
- Set s26 = <int>{...lInt};
- Set s27 = <int>{...iNull};
- Set s28 = <int>{...lNull};
- Set s29 = <Null>{...iNull};
- Set s30 = <Null>{...lNull};
- }
-}
-''');
- var unit = (await computeAnalysisResult(source)).unit;
- assertNoErrors(source);
-
- Expression getSpreadExpression(VariableDeclarationStatement s) {
- VariableDeclaration declaration = s.variables.variables[0];
- SetOrMapLiteral literal = declaration.initializer;
- SpreadElement spread = literal.elements[0];
- return spread.expression;
- }
-
- DartType getKeyType(VariableDeclarationStatement s) {
- VariableDeclaration declaration = s.variables.variables[0];
- SetOrMapLiteral literal = declaration.initializer;
- return literal.typeArguments.arguments[0].type;
- }
-
- for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'casts')) {
- var expression = getSpreadExpression(s);
- var spreadCastType = getImplicitSpreadCast(expression);
- expect(spreadCastType, isNotNull,
- reason: 'Expression $expression does not have implicit cast');
- expect(spreadCastType, equals(getKeyType(s)));
- }
- for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'noCasts')) {
- var expression = getSpreadExpression(s);
- var spreadCastType = getImplicitSpreadCast(expression);
- expect(spreadCastType, isNull,
- reason: 'Expression $expression should not have implicit cast');
- }
- }
-
- test_implicitCastMetadata_spread_set_iterable() async {
- var source = addSource(r'''
-class C {
- dynamic dyn;
- Iterable<int> iInt;
- Iterable<Object> iObject;
- Iterable<dynamic> iDynamic;
- Iterable<Null> iNull;
- List<int> lInt;
- List<Object> lObject;
- List<dynamic> lDynamic;
- List<Null> lNull;
-
- void casts() {
- Set s0 = {...dyn};
- Set s1 = <int>{...dyn};
- Set s2 = <num>{...dyn};
- }
-
- void noCasts() {
- Set s0 = {...iInt};
- Set s1 = {...iObject};
- Set s2 = {...iDynamic};
- Set s3 = {...iNull};
- Set s4 = <Null>{...iInt};
- Set s5 = <Null>{...iObject};
- Set s6 = <Null>{...iDynamic};
- Set s7 = <Null>{...iNull};
- Set s8 = <int>{...iInt};
- Set s9 = <int>{...iObject};
- Set s10 = <int>{...iDynamic};
- Set s11 = <int>{...iNull};
- Set s12 = {...lInt};
- Set s13 = {...lObject};
- Set s14 = {...lDynamic};
- Set s15 = {...lNull};
- Set s16 = <Null>{...lInt};
- Set s17 = <Null>{...lObject};
- Set s18 = <Null>{...lDynamic};
- Set s19 = <Null>{...lNull};
- Set s20 = <int>{...lInt};
- Set s21 = <int>{...lObject};
- Set s22 = <int>{...lDynamic};
- }
-}
-''');
- var unit = (await computeAnalysisResult(source)).unit;
- assertNoErrors(source);
-
- Expression getSpreadExpression(VariableDeclarationStatement s) {
- VariableDeclaration declaration = s.variables.variables[0];
- SetOrMapLiteral literal = declaration.initializer;
- SpreadElement spread = literal.elements[0];
- return spread.expression;
- }
-
- for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'casts')) {
- var expression = getSpreadExpression(s);
- var spreadCastType = getImplicitCast(expression);
- expect(spreadCastType, isNotNull,
- reason: 'Expression $expression does not have implicit cast');
- expect(spreadCastType.toString(), equals('Iterable<dynamic>'));
- }
- for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'noCasts')) {
- var expression = getSpreadExpression(s);
- var spreadCastType = getImplicitCast(expression);
- expect(spreadCastType, isNull,
- reason: 'Expression $expression should not have implicit cast');
- }
- }
-}
-
-@reflectiveTest
class StrongModeStaticTypeAnalyzer2Test extends StaticTypeAnalyzer2TestShared
with StrongModeStaticTypeAnalyzer2TestCases {
@override
diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart
index 88a64ff..d38cb04 100644
--- a/pkg/analyzer/test/src/task/strong/checker_test.dart
+++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
@@ -10,8 +10,7 @@
void main() {
defineReflectiveSuite(() {
defineReflectiveTests(CheckerTest);
- defineReflectiveTests(CheckerTest_WithSpreadCollections);
- defineReflectiveTests(CheckerTest_WithControlFlowCollections);
+ defineReflectiveTests(CheckerWithUiAsCodeTest);
});
}
@@ -4516,179 +4515,453 @@
}
@reflectiveTest
-class CheckerTest_WithControlFlowCollections extends AbstractStrongTest {
+class CheckerWithUiAsCodeTest extends AbstractStrongTest {
@override
List<String> get enabledExperiments =>
- [EnableString.control_flow_collections];
+ [EnableString.spread_collections, EnableString.control_flow_collections];
@override
bool get enableNewAnalysisDriver => true;
test_list_ifElement_dynamicCondition_disableImplicitCasts() async {
- addFile(
- 'dynamic c; void main() { <int>[if (/*error:NON_BOOL_CONDITION*/c) 0]; }');
+ addFile(r'''
+dynamic c;
+void main() {
+ <int>[if (/*error:NON_BOOL_CONDITION*/c) 0];
+}
+''');
await check(implicitCasts: false);
}
test_list_ifElement_dynamicCondition_implicitCasts() async {
- addFile('dynamic c; void main() { <int>[if (/*info:DYNAMIC_CAST*/c) 0]; }');
+ addFile(r'''
+dynamic c;
+void main() {
+ <int>[if (/*info:DYNAMIC_CAST*/c) 0];
+}
+''');
await check();
}
test_list_ifElement_objectCondition_disableImplicitCasts() async {
- addFile(
- 'Object c; void main() { <int>[if (/*error:NON_BOOL_CONDITION*/c) 0]; }');
+ addFile(r'''
+Object c;
+void main() {
+ <int>[if (/*error:NON_BOOL_CONDITION*/c) 0];
+}
+''');
await check(implicitCasts: false);
}
test_list_ifElement_objectCondition_implicitCasts() async {
- addFile(
- 'Object c; void main() { <int>[if (/*info:DOWN_CAST_IMPLICIT*/c) 0]; }');
+ addFile(r'''
+Object c;
+void main() {
+ <int>[if (/*info:DOWN_CAST_IMPLICIT*/c) 0];
+}
+''');
await check();
}
test_map_ifElement_dynamicCondition_disableImplicitCasts() async {
- addFile(
- 'dynamic c; void main() { <int, int>{if (/*error:NON_BOOL_CONDITION*/c) 0: 0}; }');
+ addFile(r'''
+dynamic c;
+void main() {
+ <int, int>{if (/*error:NON_BOOL_CONDITION*/c) 0: 0};
+}
+''');
await check(implicitCasts: false);
}
test_map_ifElement_dynamicCondition_implicitCasts() async {
- addFile(
- 'dynamic c; void main() { <int, int>{if (/*info:DYNAMIC_CAST*/c) 0: 0}; }');
+ addFile(r'''
+dynamic c;
+void main() {
+ <int, int>{if (/*info:DYNAMIC_CAST*/c) 0: 0};
+}
+''');
+ await check();
+ }
+
+ test_map_ifElement_falseBranch_dynamicKey_disableImplicitCasts() async {
+ addFile(r'''
+bool c;
+dynamic dyn;
+void main() {
+ <int, int>{if (c) 0:0 else /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/dyn:0};
+}
+''');
+ await check(implicitCasts: false);
+ }
+
+ test_map_ifElement_falseBranch_dynamicKey_implicitCasts() async {
+ addFile(r'''
+bool c;
+dynamic dyn;
+void main() {
+ <int, int>{if (c) 0:0 else /*info:DYNAMIC_CAST*/dyn:0};
+}
+''');
+ await check();
+ }
+
+ test_map_ifElement_falseBranch_dynamicValue_disableImplicitCasts() async {
+ addFile(r'''
+bool c;
+dynamic dyn;
+void main() {
+ <int, int>{if (c) 0:0 else 0:/*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/dyn};
+}
+''');
+ await check(implicitCasts: false);
+ }
+
+ test_map_ifElement_falseBranch_dynamicValue_implicitCasts() async {
+ addFile(r'''
+bool c;
+dynamic dyn;
+void main() {
+ <int, int>{if (c) 0:0 else 0:/*info:DYNAMIC_CAST*/dyn};
+}
+''');
+ await check();
+ }
+
+ test_map_ifElement_falseBranch_supertypeKey_disableImplicitCasts() async {
+ addFile(r'''
+bool c;
+num someNum;
+void main() {
+ <int, int>{if (c) 0:0 else /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/someNum:0};
+}
+''');
+ await check(implicitCasts: false);
+ }
+
+ test_map_ifElement_falseBranch_supertypeKey_implicitCasts() async {
+ addFile(r'''
+bool c;
+num someNum;
+void main() {
+ <int, int>{if (c) 0:0 else /*info:DOWN_CAST_IMPLICIT*/someNum:0};
+}
+''');
+ await check();
+ }
+
+ test_map_ifElement_falseBranch_supertypeValue_disableImplicitCasts() async {
+ addFile(r'''
+bool c;
+num someNum;
+void main() {
+ <int, int>{if (c) 0:0 else 0:/*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/someNum};
+}
+''');
+ await check(implicitCasts: false);
+ }
+
+ test_map_ifElement_falseBranch_supertypeValue_implicitCasts() async {
+ addFile(r'''
+bool c;
+num someNum;
+void main() {
+ <int, int>{if (c) 0:0 else 0:/*info:DOWN_CAST_IMPLICIT*/someNum};
+}
+''');
await check();
}
test_map_ifElement_objectCondition_disableImplicitCasts() async {
- addFile(
- 'Object c; void main() { <int, int>{if (/*error:NON_BOOL_CONDITION*/c) 0: 0}; }');
+ addFile(r'''
+Object c;
+void main() {
+ <int, int>{if (/*error:NON_BOOL_CONDITION*/c) 0: 0};
+}
+''');
await check(implicitCasts: false);
}
test_map_ifElement_objectCondition_implicitCasts() async {
- addFile(
- 'Object c; void main() { <int, int>{if (/*info:DOWN_CAST_IMPLICIT*/c) 0: 0}; }');
+ addFile(r'''
+Object c;
+void main() {
+ <int, int>{if (/*info:DOWN_CAST_IMPLICIT*/c) 0: 0};
+}
+''');
+ await check();
+ }
+
+ test_map_ifElement_trueBranch_dynamicKey_disableImplicitCasts() async {
+ addFile(r'''
+bool c;
+dynamic dyn;
+void main() {
+ <int, int>{if (c) /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/dyn:0 else 0:0};
+}
+''');
+ await check(implicitCasts: false);
+ }
+
+ test_map_ifElement_trueBranch_dynamicKey_implicitCasts() async {
+ addFile(r'''
+bool c;
+dynamic dyn;
+void main() {
+ <int, int>{if (c) /*info:DYNAMIC_CAST*/dyn:0 else 0:0};
+}
+''');
+ await check();
+ }
+
+ test_map_ifElement_trueBranch_dynamicValue_disableImplicitCasts() async {
+ addFile(r'''
+bool c;
+dynamic dyn;
+void main() {
+ <int, int>{if (c) 0:/*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/dyn else 0:0};
+}
+''');
+ await check(implicitCasts: false);
+ }
+
+ test_map_ifElement_trueBranch_dynamicValue_implicitCasts() async {
+ addFile(r'''
+bool c;
+dynamic dyn;
+void main() {
+ <int, int>{if (c) 0:/*info:DYNAMIC_CAST*/dyn else 0:0};
+}
+''');
+ await check();
+ }
+
+ test_map_ifElement_trueBranch_supertypeKey_disableImplicitCasts() async {
+ addFile(r'''
+bool c;
+num someNum;
+void main() {
+ <int, int>{if (c) /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/someNum:0 else 0:0};
+}
+''');
+ await check(implicitCasts: false);
+ }
+
+ test_map_ifElement_trueBranch_supertypeKey_implicitCasts() async {
+ addFile(r'''
+bool c;
+num someNum;
+void main() {
+ <int, int>{if (c) /*info:DOWN_CAST_IMPLICIT*/someNum:0 else 0:0};
+}
+''');
+ await check();
+ }
+
+ test_map_ifElement_trueBranch_supertypeValue_disableImplicitCasts() async {
+ addFile(r'''
+bool c;
+num someNum;
+void main() {
+ <int, int>{if (c) 0:/*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/someNum else 0:0};
+}
+''');
+ await check(implicitCasts: false);
+ }
+
+ test_map_ifElement_trueBranch_supertypeValue_implicitCasts() async {
+ addFile(r'''
+bool c;
+num someNum;
+void main() {
+ <int, int>{if (c) 0:/*info:DOWN_CAST_IMPLICIT*/someNum else 0:0};
+}
+''');
await check();
}
test_set_ifElement_dynamicCondition_disableImplicitCasts() async {
- addFile(
- 'dynamic c; void main() { <int>{if (/*error:NON_BOOL_CONDITION*/c) 0}; }');
+ addFile(r'''
+dynamic c;
+void main() {
+ <int>{if (/*error:NON_BOOL_CONDITION*/c) 0};
+}
+''');
await check(implicitCasts: false);
}
test_set_ifElement_dynamicCondition_implicitCasts() async {
- addFile('dynamic c; void main() { <int>{if (/*info:DYNAMIC_CAST*/c) 0}; }');
+ addFile(r'''
+dynamic c;
+void main() {
+ <int>{if (/*info:DYNAMIC_CAST*/c) 0};
+}
+''');
await check();
}
test_set_ifElement_objectCondition_disableImplicitCasts() async {
- addFile(
- 'Object c; void main() { <int>{if (/*error:NON_BOOL_CONDITION*/c) 0}; }');
+ addFile(r'''
+Object c;
+void main() {
+ <int>{if (/*error:NON_BOOL_CONDITION*/c) 0};
+}
+''');
await check(implicitCasts: false);
}
test_set_ifElement_objectCondition_implicitCasts() async {
- addFile(
- 'Object c; void main() { <int>{if (/*info:DOWN_CAST_IMPLICIT*/c) 0}; }');
+ addFile(r'''
+Object c;
+void main() {
+ <int>{if (/*info:DOWN_CAST_IMPLICIT*/c) 0};
+}
+''');
await check();
}
-}
-
-@reflectiveTest
-class CheckerTest_WithSpreadCollections extends AbstractStrongTest {
- @override
- List<String> get enabledExperiments => [EnableString.spread_collections];
-
- @override
- bool get enableNewAnalysisDriver => true;
@failingTest
test_spread_dynamicInList_disableImplicitCasts() async {
// TODO(mfairhurst) fix this, see https://github.com/dart-lang/sdk/issues/35569
- addFile(
- 'dynamic dyn; void main() { [.../*error:INVALID_ASSIGNMENT*/dyn]; }');
+ addFile(r'''
+dynamic dyn;
+void main() {
+ [.../*error:INVALID_ASSIGNMENT*/dyn];
+}
+''');
await check(implicitCasts: false);
}
test_spread_dynamicInList_implicitCasts() async {
- addFile('dynamic dyn; void main() { [.../*info:DYNAMIC_CAST*/dyn]; }');
+ addFile(r'''
+dynamic dyn;
+void main() {
+ [.../*info:DYNAMIC_CAST*/dyn];
+}
+''');
await check();
}
@failingTest
test_spread_dynamicInMap_disableImplicitCasts() async {
// TODO(mfairhurst) fix this, see https://github.com/dart-lang/sdk/issues/35569
- addFile(
- 'dynamic dyn; void main() { <dynamic, dynamic>{.../*error:INVALID_ASSIGNMENT*/dyn}; }');
+ addFile(r'''
+dynamic dyn;
+void main() {
+ <dynamic, dynamic>{.../*error:INVALID_ASSIGNMENT*/dyn};
+}
+''');
await check(implicitCasts: false);
}
test_spread_dynamicInMap_implicitCasts() async {
- addFile(
- 'dynamic dyn; void main() { <dynamic, dynamic>{.../*info:DYNAMIC_CAST*/dyn}; }');
+ addFile(r'''
+dynamic dyn;
+void main() {
+ <dynamic, dynamic>{.../*info:DYNAMIC_CAST*/dyn};
+}
+''');
await check();
}
@failingTest
test_spread_dynamicInSet_disableImplicitCasts() async {
// TODO(mfairhurst) fix this, see https://github.com/dart-lang/sdk/issues/35569
- addFile(
- 'dynamic dyn; void main() { <dynamic>{.../*error:INVALID_ASSIGNMENT*/dyn}; }');
+ addFile(r'''
+dynamic dyn;
+void main() {
+ <dynamic>{.../*error:INVALID_ASSIGNMENT*/dyn};
+}
+''');
await check(implicitCasts: false);
}
test_spread_dynamicInSet_implicitCasts() async {
- addFile(
- 'dynamic dyn; void main() { <dynamic>{.../*info:DYNAMIC_CAST*/dyn}; }');
+ addFile(r'''
+dynamic dyn;
+void main() {
+ <dynamic>{.../*info:DYNAMIC_CAST*/dyn};
+}
+''');
await check();
}
test_spread_listElement_disableImplicitCasts() async {
- addFile(
- 'Iterable<num> i; void main() { <int>[.../*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/i]; }');
+ addFile(r'''
+Iterable<num> i;
+void main() {
+ <int>[.../*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/i];
+}
+''');
await check(implicitCasts: false);
}
test_spread_listElement_implicitCasts() async {
- addFile(
- 'Iterable<num> i; void main() { <int>[.../*info:DOWN_CAST_IMPLICIT*/i]; }');
+ addFile(r'''
+Iterable<num> i;
+void main() {
+ <int>[.../*info:DOWN_CAST_IMPLICIT*/i];
+}
+''');
await check();
}
test_spread_mapKey_disableImplicitCasts() async {
- addFile(
- 'Map<num, dynamic> map; void main() { <int, dynamic>{1: 2, .../*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/map}; }');
+ addFile(r'''
+Map<num, dynamic> map;
+void main() {
+ <int, dynamic>{1: 2, .../*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/map};
+}
+''');
await check(implicitCasts: false);
}
test_spread_mapKey_implicitCasts() async {
- addFile(
- 'Map<num, dynamic> map; void main() { <int, dynamic>{1: 2, .../*info:DOWN_CAST_IMPLICIT*/map}; }');
+ addFile(r'''
+Map<num, dynamic> map;
+void main() {
+ <int, dynamic>{1: 2, .../*info:DOWN_CAST_IMPLICIT*/map};
+}
+''');
await check();
}
test_spread_mapValue_disableImplicitCasts() async {
- addFile(
- 'Map<dynamic, num> map; void main() { <dynamic, int>{1: 2, .../*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/map}; }');
+ addFile(r'''
+Map<dynamic, num> map;
+void main() {
+ <dynamic, int>{1: 2, .../*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/map};
+}
+''');
await check(implicitCasts: false);
}
test_spread_mapValue_implicitCasts() async {
- addFile(
- 'Map<dynamic, num> map; void main() { <dynamic, int>{1: 2, .../*info:DOWN_CAST_IMPLICIT*/map}; }');
+ addFile(r'''
+Map<dynamic, num> map;
+void main() {
+ <dynamic, int>{1: 2, .../*info:DOWN_CAST_IMPLICIT*/map};
+}
+''');
await check();
}
test_spread_setElement_disableImplicitCasts() async {
- addFile(
- 'Iterable<num> i; void main() { <int>{.../*error:SET_ELEMENT_TYPE_NOT_ASSIGNABLE*/i}; }');
+ addFile(r'''
+Iterable<num> i;
+void main() {
+ <int>{.../*error:SET_ELEMENT_TYPE_NOT_ASSIGNABLE*/i};
+}
+''');
await check(implicitCasts: false);
}
test_spread_setElement_implicitCasts() async {
- addFile(
- 'Iterable<num> i; void main() { <int>{.../*info:DOWN_CAST_IMPLICIT*/i}; }');
+ addFile(r'''
+Iterable<num> i;
+void main() {
+ <int>{.../*info:DOWN_CAST_IMPLICIT*/i};
+}
+''');
await check();
}
}