update type name accesses (#1947)

* update type name accesses

* test fix

* condition fix

* tweaks

* fmt
diff --git a/lib/src/rules/invariant_booleans.dart b/lib/src/rules/invariant_booleans.dart
index 7dfce1a..2d78049 100644
--- a/lib/src/rules/invariant_booleans.dart
+++ b/lib/src/rules/invariant_booleans.dart
@@ -141,7 +141,7 @@
   @override
   void visitCondition(Expression node) {
     // Right part discards reporting a subexpression already reported.
-    if (node?.staticType?.name != 'bool') {
+    if (node?.staticType?.isDartCoreBool != true) {
       return;
     }
 
diff --git a/lib/src/rules/null_closures.dart b/lib/src/rules/null_closures.dart
index 1f827c0..3791a4e 100644
--- a/lib/src/rules/null_closures.dart
+++ b/lib/src/rules/null_closures.dart
@@ -303,7 +303,7 @@
         possibleMethods
             .lookup(NonNullableFunction(library, className, methodName));
 
-    var method = getMethod(type.element.library.name, type.name);
+    var method = getMethod(type.element.library.name, type.element.name);
     if (method != null) {
       return method;
     }
@@ -313,7 +313,8 @@
       return null;
     }
     for (var supertype in element.allSupertypes) {
-      method = getMethod(supertype.element.library.name, supertype.name);
+      method =
+          getMethod(supertype.element.library.name, supertype.element.name);
       if (method != null) {
         return method;
       }
diff --git a/lib/src/rules/prefer_contains.dart b/lib/src/rules/prefer_contains.dart
index ec2ec90..5802ee9 100644
--- a/lib/src/rules/prefer_contains.dart
+++ b/lib/src/rules/prefer_contains.dart
@@ -136,7 +136,7 @@
     final rightOperand = binaryExpression.rightOperand;
     final rightValue = context.evaluateConstant(rightOperand).value;
 
-    if (rightValue?.type?.name == 'int') {
+    if (rightValue?.type?.isDartCoreInt == true) {
       // Constant is on right side of comparison operator
       _checkConstant(binaryExpression, rightValue.toIntValue(), operator.type);
       return;
@@ -144,7 +144,7 @@
 
     final leftOperand = binaryExpression.leftOperand;
     final leftValue = context.evaluateConstant(leftOperand).value;
-    if (leftValue?.type?.name == 'int') {
+    if (leftValue?.type?.isDartCoreInt == true) {
       // Constants is on left side of comparison operator
       _checkConstant(binaryExpression, leftValue.toIntValue(),
           _invertedTokenType(operator.type));
diff --git a/lib/src/rules/prefer_int_literals.dart b/lib/src/rules/prefer_int_literals.dart
index f664891..68bcc40 100644
--- a/lib/src/rules/prefer_int_literals.dart
+++ b/lib/src/rules/prefer_int_literals.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/dart/element/type.dart';
 
 import '../analyzer.dart';
 
@@ -69,12 +70,12 @@
 
   bool hasReturnTypeDouble(AstNode node) {
     if (node is FunctionExpression) {
-      var functDeclaration = node.parent;
-      if (functDeclaration is FunctionDeclaration) {
-        return functDeclaration.returnType?.type?.name == 'double';
+      final functionDeclaration = node.parent;
+      if (functionDeclaration is FunctionDeclaration) {
+        return _isDartCoreDoubleTypeAnnotation(functionDeclaration.returnType);
       }
     } else if (node is MethodDeclaration) {
-      return node.returnType?.type?.name == 'double';
+      return _isDartCoreDoubleTypeAnnotation(node.returnType);
     }
     return false;
   }
@@ -82,15 +83,15 @@
   bool hasTypeDouble(Expression expression) {
     final parent = expression.parent;
     if (parent is ArgumentList) {
-      return expression.staticParameterElement?.type?.name == 'double';
+      return _isDartCoreDouble(expression.staticParameterElement?.type);
     } else if (parent is ListLiteral) {
       final typeArguments = parent.typeArguments?.arguments;
       return typeArguments?.length == 1 &&
-          typeArguments[0]?.type?.name == 'double';
+          _isDartCoreDoubleTypeAnnotation(typeArguments[0]);
     } else if (parent is NamedExpression) {
       final argList = parent.parent;
       if (argList is ArgumentList) {
-        return parent.staticParameterElement?.type?.name == 'double';
+        return _isDartCoreDouble(parent.staticParameterElement?.type);
       }
     } else if (parent is ExpressionFunctionBody) {
       return hasReturnTypeDouble(parent.parent);
@@ -100,7 +101,7 @@
     } else if (parent is VariableDeclaration) {
       final varList = parent.parent;
       if (varList is VariableDeclarationList) {
-        return varList.type?.type?.name == 'double';
+        return _isDartCoreDoubleTypeAnnotation(varList.type);
       }
     }
     return false;
@@ -125,4 +126,9 @@
       rule.reportLint(node);
     }
   }
+
+  bool _isDartCoreDouble(DartType type) => type?.isDartCoreDouble == true;
+
+  bool _isDartCoreDoubleTypeAnnotation(TypeAnnotation annotation) =>
+      _isDartCoreDouble(annotation?.type);
 }
diff --git a/lib/src/rules/unrelated_type_equality_checks.dart b/lib/src/rules/unrelated_type_equality_checks.dart
index 12cdfa9..715d322 100644
--- a/lib/src/rules/unrelated_type_equality_checks.dart
+++ b/lib/src/rules/unrelated_type_equality_checks.dart
@@ -10,8 +10,6 @@
 import '../analyzer.dart';
 import '../util/dart_type_utilities.dart';
 
-const String _dartCoreLibraryName = 'dart.core';
-
 const _desc =
     r'Equality operator `==` invocation with references of unrelated types.';
 
@@ -146,12 +144,16 @@
       !(_isFixNumIntX(leftType) && _isCoreInt(rightType));
 }
 
-bool _isCoreInt(DartType type) =>
-    type.name == 'int' && type.element?.library?.name == _dartCoreLibraryName;
+bool _isCoreInt(DartType type) => type.isDartCoreInt;
 
-bool _isFixNumIntX(DartType type) =>
-    (type.name == 'Int32' || type.name == 'Int64') &&
-    type.element?.library?.name == 'fixnum';
+bool _isFixNumIntX(DartType type) {
+  if (type is! InterfaceType) {
+    return false;
+  }
+  final element = type.element;
+  return (element.name == 'Int32' || element.name == 'Int64') &&
+      element.library?.name == 'fixnum';
+}
 
 class UnrelatedTypeEqualityChecks extends LintRule implements NodeLintRule {
   UnrelatedTypeEqualityChecks()
diff --git a/lib/src/rules/use_full_hex_values_for_flutter_colors.dart b/lib/src/rules/use_full_hex_values_for_flutter_colors.dart
index 28db0c0..cabc386 100644
--- a/lib/src/rules/use_full_hex_values_for_flutter_colors.dart
+++ b/lib/src/rules/use_full_hex_values_for_flutter_colors.dart
@@ -6,6 +6,7 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 
 import '../analyzer.dart';
+import '../util/dart_type_utilities.dart';
 
 const _desc =
     r'Prefer an 8-digit hexadecimal integer(0xFFFFFFFF) to instantiate Color.';
@@ -53,9 +54,8 @@
 
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
-    if (node.staticElement?.library?.name == 'dart.ui' &&
-        node.staticElement?.returnType?.name == 'Color' &&
-        node.staticElement?.name == '') {
+    if (DartTypeUtilities.isConstructorElement(node.staticElement,
+        uriStr: 'dart.ui', className: 'Color', constructorName: '')) {
       final arguments = node.argumentList.arguments;
       if (arguments.isNotEmpty) {
         final argument = arguments.first;
diff --git a/lib/src/rules/use_setters_to_change_properties.dart b/lib/src/rules/use_setters_to_change_properties.dart
index 618d47e..9e298a0 100644
--- a/lib/src/rules/use_setters_to_change_properties.dart
+++ b/lib/src/rules/use_setters_to_change_properties.dart
@@ -58,7 +58,7 @@
         node.isGetter ||
         DartTypeUtilities.overridesMethod(node) ||
         node.parameters?.parameters?.length != 1 ||
-        node.returnType?.type?.name != 'void') {
+        node.returnType?.type?.isVoid != true) {
       return;
     }
     void _visitExpression(Expression expression) {
diff --git a/lib/src/util/dart_type_utilities.dart b/lib/src/util/dart_type_utilities.dart
index 6825e6b..a0eb64f 100644
--- a/lib/src/util/dart_type_utilities.dart
+++ b/lib/src/util/dart_type_utilities.dart
@@ -7,6 +7,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_system.dart';
 import 'package:analyzer/src/dart/element/member.dart'; // ignore: implementation_imports
+import 'package:meta/meta.dart';
 
 typedef AstNodePredicate = bool Function(AstNode node);
 
@@ -174,14 +175,24 @@
         !element.isSynthetic && element.allSupertypes.any(predicate);
   }
 
+  // todo (pq): unify and  `isInterface` into a shared method: `isInterfaceType`
   static bool isClass(DartType type, String className, String library) =>
-      type != null &&
-      type.name == className &&
-      type.element?.library?.name == library;
+      type is InterfaceType &&
+      type.element.name == className &&
+      type.element.library?.name == library;
+
+  static bool isConstructorElement(ConstructorElement element,
+          {@required String uriStr,
+          @required String className,
+          @required String constructorName}) =>
+      element != null &&
+      element.library?.name == uriStr &&
+      element.enclosingElement.name == className &&
+      element.name == constructorName;
 
   static bool isInterface(
           InterfaceType type, String interface, String library) =>
-      type.name == interface && type.element.library.name == library;
+      type.element.name == interface && type.element.library.name == library;
 
   static bool isNullLiteral(Expression expression) =>
       expression?.unParenthesized is NullLiteral;
diff --git a/lib/src/util/unrelated_types_visitor.dart b/lib/src/util/unrelated_types_visitor.dart
index ef05c9a..69644c0 100644
--- a/lib/src/util/unrelated_types_visitor.dart
+++ b/lib/src/util/unrelated_types_visitor.dart
@@ -15,7 +15,7 @@
 _InterfaceTypePredicate _buildImplementsDefinitionPredicate(
         InterfaceTypeDefinition definition) =>
     (InterfaceType interface) =>
-        interface.name == definition.name &&
+        interface.element.name == definition.name &&
         interface.element.library.name == definition.library;
 
 /// Returns all implemented interfaces of [type].