Index: lib/src/util/dart_type_utilities.dart |
diff --git a/lib/src/util/dart_type_utilities.dart b/lib/src/util/dart_type_utilities.dart |
index 54a1918e9597f2b035600c3809591165d3feb6bc..72691af94dfc60ac0c23608bbdd7a65c47f4fa1a 100644 |
--- a/lib/src/util/dart_type_utilities.dart |
+++ b/lib/src/util/dart_type_utilities.dart |
@@ -5,40 +5,28 @@ |
library linter.src.util.dart_type_utilities; |
import 'dart:collection'; |
+ |
+import 'package:analyzer/dart/ast/ast.dart'; |
import 'package:analyzer/dart/element/element.dart'; |
import 'package:analyzer/dart/element/type.dart'; |
-import 'package:analyzer/dart/ast/ast.dart'; |
typedef bool AstNodePredicate(AstNode node); |
class DartTypeUtilities { |
- static bool unrelatedTypes(DartType leftType, DartType rightType) { |
- if (leftType == null || |
- leftType.isBottom || |
- leftType.isDynamic || |
- rightType == null || |
- rightType.isBottom || |
- rightType.isDynamic) { |
- return false; |
- } |
- if (leftType == rightType || |
- leftType.isMoreSpecificThan(rightType) || |
- rightType.isMoreSpecificThan(leftType)) { |
+ static bool extendsClass(DartType type, String className, String library) => |
+ type != null && |
+ type.name == className && |
+ type.element.library.name == library || |
+ (type is InterfaceType && |
+ extendsClass(type.superclass, className, library)); |
+ |
+ static bool implementsAnyInterface( |
+ DartType type, Iterable<InterfaceTypeDefinition> definitions) { |
+ if (type is! InterfaceType) { |
return false; |
} |
- Element leftElement = leftType.element; |
- Element rightElement = rightType.element; |
- if (leftElement is ClassElement && rightElement is ClassElement) { |
- return leftElement.supertype.isObject || |
- leftElement.supertype != rightElement.supertype; |
- } |
- return false; |
- } |
- |
- static bool implementsInterface( |
- DartType type, String interface, String library) { |
- bool predicate(InterfaceType i) => |
- i.name == interface && i.element.library.name == library; |
+ bool predicate(InterfaceType i) => definitions |
+ .any((d) => i.name == d.name && i.element.library.name == d.library); |
ClassElement element = type.element; |
return predicate(type) || |
!element.isSynthetic && |
@@ -46,10 +34,13 @@ class DartTypeUtilities { |
element.allSupertypes.any(predicate); |
} |
- static bool implementsAnyInterface( |
- DartType type, Iterable<InterfaceTypeDefinition> definitions) { |
- bool predicate(InterfaceType i) => definitions |
- .any((d) => i.name == d.name && i.element.library.name == d.library); |
+ static bool implementsInterface( |
+ DartType type, String interface, String library) { |
+ if (type is! InterfaceType) { |
+ return false; |
+ } |
+ bool predicate(InterfaceType i) => |
+ i.name == interface && i.element.library.name == library; |
ClassElement element = type.element; |
return predicate(type) || |
!element.isSynthetic && |
@@ -57,13 +48,6 @@ class DartTypeUtilities { |
element.allSupertypes.any(predicate); |
} |
- static bool extendsClass(DartType type, String className, String library) => |
- type != null && |
- type.name == className && |
- type.element.library.name == library || |
- (type is InterfaceType && |
- extendsClass(type.superclass, className, library)); |
- |
/// Builds the list resulting from traversing the node in DFS and does not |
/// include the node itself. |
static Iterable<AstNode> traverseNodesInDFS(AstNode node) { |
@@ -74,6 +58,29 @@ class DartTypeUtilities { |
}); |
return nodes; |
} |
+ |
+ static bool unrelatedTypes(DartType leftType, DartType rightType) { |
+ if (leftType == null || |
+ leftType.isBottom || |
+ leftType.isDynamic || |
+ rightType == null || |
+ rightType.isBottom || |
+ rightType.isDynamic) { |
+ return false; |
+ } |
+ if (leftType == rightType || |
+ leftType.isMoreSpecificThan(rightType) || |
+ rightType.isMoreSpecificThan(leftType)) { |
+ return false; |
+ } |
+ Element leftElement = leftType.element; |
+ Element rightElement = rightType.element; |
+ if (leftElement is ClassElement && rightElement is ClassElement) { |
+ return leftElement.supertype.isObject || |
+ leftElement.supertype != rightElement.supertype; |
+ } |
+ return false; |
+ } |
} |
class InterfaceTypeDefinition { |
@@ -83,6 +90,11 @@ class InterfaceTypeDefinition { |
InterfaceTypeDefinition(this.name, this.library); |
@override |
+ int get hashCode { |
+ return name.hashCode ^ library.hashCode; |
+ } |
+ |
+ @override |
bool operator ==(Object other) { |
if (identical(this, other)) { |
return true; |
@@ -91,9 +103,4 @@ class InterfaceTypeDefinition { |
this.name == other.name && |
this.library == other.library; |
} |
- |
- @override |
- int get hashCode { |
- return name.hashCode ^ library.hashCode; |
- } |
} |