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