Version 2.13.0-174.0.dev

Merge commit '7374f441f3cefd60bb2716d3e6a89cc89e271e5a' into 'dev'
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 32a86f1..53c5713 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.4.0-dev
+* Deprecated `TypeProvider.nonSubtypableClasses`.
+  Use `TypeProvider.isNonSubtypableClass` instead.
+
 ## 1.3.0
 * Added `Expression.inConstantContext` to API.
 * Updated documentation comments for some getters that don't return `null`.
diff --git a/pkg/analyzer/lib/dart/element/type_provider.dart b/pkg/analyzer/lib/dart/element/type_provider.dart
index 75bcf74..f1fb800 100644
--- a/pkg/analyzer/lib/dart/element/type_provider.dart
+++ b/pkg/analyzer/lib/dart/element/type_provider.dart
@@ -78,6 +78,7 @@
 
   /// Return a list containing all of the types that cannot be either extended
   /// or implemented.
+  @Deprecated('Use isNonSubtypableClass instead')
   Set<ClassElement> get nonSubtypableClasses;
 
   /// Return the element representing the built-in class `Null`.
@@ -143,6 +144,9 @@
   @Deprecated('Use futureType instead')
   InterfaceType futureType2(DartType valueType);
 
+  /// Return `true` if [element] cannot be extended, implemented, or mixed in.
+  bool isNonSubtypableClass(ClassElement element);
+
   /// Return 'true' if [id] is the name of a getter on the `Object` type.
   bool isObjectGetter(String id);
 
diff --git a/pkg/analyzer/lib/src/dart/element/type_provider.dart b/pkg/analyzer/lib/src/dart/element/type_provider.dart
index 19def0f..2831cb48 100644
--- a/pkg/analyzer/lib/src/dart/element/type_provider.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_provider.dart
@@ -8,6 +8,29 @@
 import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 
+const Map<String, Set<String>> _nonSubtypableClassMap = {
+  'dart:async': _nonSubtypableDartAsyncClassNames,
+  'dart:core': _nonSubtypableDartCoreClassNames,
+};
+
+const Set<String> _nonSubtypableClassNames = {
+  ..._nonSubtypableDartCoreClassNames,
+  ..._nonSubtypableDartAsyncClassNames,
+};
+
+const Set<String> _nonSubtypableDartAsyncClassNames = {
+  'FutureOr',
+};
+
+const Set<String> _nonSubtypableDartCoreClassNames = {
+  'bool',
+  'double',
+  'int',
+  'Null',
+  'num',
+  'String',
+};
+
 /// Provide common functionality shared by the various TypeProvider
 /// implementations.
 abstract class TypeProviderBase implements TypeProvider {
@@ -257,6 +280,7 @@
       ? NeverTypeImpl.instance
       : NeverTypeImpl.instanceLegacy;
 
+  @Deprecated('Use isNonSubtypableClass instead')
   @override
   Set<ClassElement> get nonSubtypableClasses => _nonSubtypableClasses ??= {
         boolElement,
@@ -397,6 +421,17 @@
   }
 
   @override
+  bool isNonSubtypableClass(ClassElement element) {
+    var name = element.name;
+    if (_nonSubtypableClassNames.contains(name)) {
+      var libraryUriStr = element.library.source.uri.toString();
+      var ofLibrary = _nonSubtypableClassMap[libraryUriStr];
+      return ofLibrary != null && ofLibrary.contains(name);
+    }
+    return false;
+  }
+
+  @override
   InterfaceType iterableType(DartType elementType) {
     return iterableElement.instantiate(
       typeArguments: [elementType],
diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart
index e9fbe20..696dfb6 100644
--- a/pkg/analyzer/lib/src/error/inheritance_override.dart
+++ b/pkg/analyzer/lib/src/error/inheritance_override.dart
@@ -333,7 +333,7 @@
 
     DartType type = typeName.typeOrThrow;
     if (type is InterfaceType &&
-        typeProvider.nonSubtypableClasses.contains(type.element)) {
+        typeProvider.isNonSubtypableClass(type.element)) {
       reporter.reportErrorForNode(errorCode, typeName, [type]);
       return true;
     }
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 16387ea..291ac76 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -2356,9 +2356,9 @@
     if (_currentLibrary.source.isInSystemLibrary) {
       return false;
     }
-    return typeName.type is InterfaceType &&
-        _typeProvider.nonSubtypableClasses
-            .contains(typeName.typeOrThrow.element);
+    var type = typeName.type;
+    return type is InterfaceType &&
+        _typeProvider.isNonSubtypableClass(type.element);
   }
 
   void _checkForExtensionDeclaresMemberOfObject(MethodDeclaration node) {
@@ -3322,7 +3322,7 @@
       }
     }
 
-    if (!_typeProvider.nonSubtypableClasses.contains(superType.element)) {
+    if (!_typeProvider.isNonSubtypableClass(superType.element)) {
       // Don't report this diagnostic for non-subtypable classes because the
       // real problem was already reported.
       errorReporter.reportErrorForNode(
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index ff51f4f..6d4c820 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 1.3.0
+version: 1.4.0-dev
 description: This package provides a library that performs static analysis of Dart code.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer
 
diff --git a/tools/VERSION b/tools/VERSION
index 8bf87db..d7dd63b 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 13
 PATCH 0
-PRERELEASE 173
+PRERELEASE 174
 PRERELEASE_PATCH 0
\ No newline at end of file