Version 2.5.1
diff --git a/CHANGELOG.md b/CHANGELOG.md
index dff27ac..d9ef813 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+## 2.5.1 - 2019-09-27
+
+This is a patch release that prevents type inference failures in the analyzer
+(Issue [38365][]).
+
+[38365]: https://github.com/dart-lang/sdk/issues/38365
+
## 2.5.0 - 2019-09-10
### Language
diff --git a/pkg/analyzer/lib/src/dart/element/type_algebra.dart b/pkg/analyzer/lib/src/dart/element/type_algebra.dart
index fede84b..e841369 100644
--- a/pkg/analyzer/lib/src/dart/element/type_algebra.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_algebra.dart
@@ -201,6 +201,34 @@
return freshElement;
}
+ @override
+ List<TypeParameterElement> freshTypeParameters(
+ List<TypeParameterElement> elements) {
+ if (elements.isEmpty) {
+ return const <TypeParameterElement>[];
+ }
+
+ var freshElements = List<TypeParameterElement>(elements.length);
+ for (var i = 0; i < elements.length; i++) {
+ var element = elements[i];
+ var freshElement = TypeParameterElementImpl(element.name, -1);
+ freshElements[i] = freshElement;
+ var freshType = TypeParameterTypeImpl(freshElement);
+ freshElement.type = freshType;
+ substitution[element] = freshType;
+ }
+
+ for (var i = 0; i < freshElements.length; i++) {
+ var element = elements[i];
+ if (element.bound != null) {
+ TypeParameterElementImpl freshElement = freshElements[i];
+ freshElement.bound = visit(element.bound);
+ }
+ }
+
+ return freshElements;
+ }
+
DartType lookup(TypeParameterElement parameter, bool upperBound) {
return substitution[parameter];
}
@@ -247,8 +275,8 @@
}
}
- @override
- TypeParameterElement freshTypeParameter(TypeParameterElement element) {
+ List<TypeParameterElement> freshTypeParameters(
+ List<TypeParameterElement> parameters) {
throw 'Create a fresh environment first';
}
@@ -283,15 +311,8 @@
target.useCounter++;
}
- TypeParameterElement freshTypeParameter(TypeParameterElement element);
-
List<TypeParameterElement> freshTypeParameters(
- List<TypeParameterElement> parameters) {
- if (parameters.isEmpty) {
- return const <TypeParameterElement>[];
- }
- return parameters.map(freshTypeParameter).toList();
- }
+ List<TypeParameterElement> elements);
DartType getSubstitute(TypeParameterElement parameter) {
var environment = this;
@@ -339,14 +360,18 @@
// any uses, but does not tell if the resulting function type is distinct.
// Our own use counter will get incremented if something from our
// environment has been used inside the function.
- var inner = type.typeFormals.isEmpty ? this : newInnerEnvironment();
int before = this.useCounter;
+ var inner = this;
+ var typeFormals = type.typeFormals;
+ if (typeFormals.isNotEmpty) {
+ inner = newInnerEnvironment();
+ typeFormals = inner.freshTypeParameters(typeFormals);
+ }
+
// Invert the variance when translating parameters.
inner.invertVariance();
- var typeFormals = inner.freshTypeParameters(type.typeFormals);
-
var parameters = type.parameters.map((parameter) {
var type = inner.visit(parameter.type);
return _parameterElement(parameter, type);
@@ -376,14 +401,18 @@
// any uses, but does not tell if the resulting function type is distinct.
// Our own use counter will get incremented if something from our
// environment has been used inside the function.
- var inner = type.typeFormals.isEmpty ? this : newInnerEnvironment();
int before = this.useCounter;
+ var inner = this;
+ var typeFormals = type.typeFormals;
+ if (typeFormals.isNotEmpty) {
+ inner = newInnerEnvironment();
+ typeFormals = inner.freshTypeParameters(typeFormals);
+ }
+
// Invert the variance when translating parameters.
inner.invertVariance();
- var typeFormals = inner.freshTypeParameters(type.typeFormals);
-
var parameters = type.parameters.map((parameter) {
var type = inner.visit(parameter.type);
return _parameterElement(parameter, type);
diff --git a/tools/VERSION b/tools/VERSION
index 546548f..4ef1ceb 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -32,7 +32,7 @@
CHANNEL stable
MAJOR 2
MINOR 5
-PATCH 0
+PATCH 1
PRERELEASE 0
PRERELEASE_PATCH 0
ABI_VERSION 11