Fix unsafe cast in `iterable_contains_unrelated_type` (#267).
R=alexeidiaz@google.com, brianwilkerson@google.com
Review URL: https://codereview.chromium.org//2102693002 .
Fixes: https://github.com/dart-lang/linter/issues/267
diff --git a/lib/src/rules/iterable_contains_unrelated_type.dart b/lib/src/rules/iterable_contains_unrelated_type.dart
index b30bedf..23ffd48 100644
--- a/lib/src/rules/iterable_contains_unrelated_type.dart
+++ b/lib/src/rules/iterable_contains_unrelated_type.dart
@@ -134,7 +134,9 @@
DartType _findIterableTypeArgument(InterfaceType type,
{List<InterfaceType> accumulator: const []}) {
- if (type == null || type.isObject || type.isDynamic ||
+ if (type == null ||
+ type.isObject ||
+ type.isDynamic ||
accumulator.contains(type)) {
return null;
}
@@ -189,14 +191,15 @@
return;
}
- ParameterizedType type = node.target != null
+ DartType type = node.target != null
? node.target.bestType
: (node.getAncestor((a) => a is ClassDeclaration) as ClassDeclaration)
?.element
?.type;
Expression argument = node.argumentList.arguments.first;
- if (DartTypeUtilities.unrelatedTypes(
- argument.bestType, _findIterableTypeArgument(type))) {
+ if (type is InterfaceType &&
+ DartTypeUtilities.unrelatedTypes(
+ argument.bestType, _findIterableTypeArgument(type))) {
rule.reportLint(node);
}
}
diff --git a/test/rules/iterable_contains_unrelated_type.dart b/test/rules/iterable_contains_unrelated_type.dart
index f954d04..18bdc14 100644
--- a/test/rules/iterable_contains_unrelated_type.dart
+++ b/test/rules/iterable_contains_unrelated_type.dart
@@ -24,7 +24,7 @@
if (list.contains(1)) print('someFunction4'); // OK
}
-void someFucntion4_1() {
+void someFunction4_1() {
List list;
if(list.contains(null)) print('someFucntion4_1');
}
@@ -96,6 +96,9 @@
if (list.contains(instance)) print('someFunction12'); // LINT
}
+void bug_267(list) {
+ if (list.contains('1')) print('someFunction'); // https://github.com/dart-lang/linter/issues/267
+}
abstract class ClassBase {}