Version 1.23.0-dev.9.1
Cherry-pick f212815ca303b5067d108554045229b2a475ef77 into dev
Cherry-pick 5dfc281f2f34165d3f0c1e96204c530e35dd200a into dev
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index 95aafe1..bb96168 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -10,8 +10,7 @@
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/generated/engine.dart'
- show AnalysisContext, AnalysisEngine;
+import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
import 'package:analyzer/src/generated/java_engine.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer/src/generated/utilities_dart.dart';
@@ -301,7 +300,7 @@
* was created.
*/
static FieldElement from(FieldElement field, ParameterizedType definingType) {
- if (!_isChangedByTypeSubstitution(field, definingType)) {
+ if (field == null || definingType.typeArguments.isEmpty) {
return field;
}
// TODO(brianwilkerson) Consider caching the substituted type in the
@@ -309,39 +308,6 @@
// We need to see how often the type is being re-computed.
return new FieldMember(field, definingType);
}
-
- /**
- * Determine whether the given [field]'s type is changed when type parameters
- * from the [definingType]'s declaration are replaced with the actual type
- * arguments from the defining type.
- */
- static bool _isChangedByTypeSubstitution(
- FieldElement field, ParameterizedType definingType) {
- List<DartType> argumentTypes = definingType.typeArguments;
- if (field != null && argumentTypes.length != 0) {
- DartType baseType = field.type;
- List<DartType> parameterTypes =
- TypeParameterTypeImpl.getTypes(definingType.typeParameters);
- if (baseType != null) {
- DartType substitutedType =
- baseType.substitute2(argumentTypes, parameterTypes);
- if (baseType != substitutedType) {
- return true;
- }
- }
- // If the field has a propagated type, then we need to check whether the
- // propagated type needs substitution.
- DartType basePropagatedType = field.propagatedType;
- if (basePropagatedType != null) {
- DartType substitutedPropagatedType =
- basePropagatedType.substitute2(argumentTypes, parameterTypes);
- if (basePropagatedType != substitutedPropagatedType) {
- return true;
- }
- }
- }
- return false;
- }
}
/**
@@ -843,7 +809,7 @@
*/
static PropertyAccessorElement from(
PropertyAccessorElement accessor, InterfaceType definingType) {
- if (!_isChangedByTypeSubstitution(accessor, definingType)) {
+ if (accessor == null || definingType.typeArguments.isEmpty) {
return accessor;
}
// TODO(brianwilkerson) Consider caching the substituted type in the
@@ -851,45 +817,6 @@
// We need to see how often the type is being re-computed.
return new PropertyAccessorMember(accessor, definingType);
}
-
- /**
- * Determine whether the given property [accessor]'s type is changed when type
- * parameters from the defining type's declaration are replaced with the
- * actual type arguments from the [definingType].
- */
- static bool _isChangedByTypeSubstitution(
- PropertyAccessorElement accessor, InterfaceType definingType) {
- List<DartType> argumentTypes = definingType.typeArguments;
- if (accessor != null && argumentTypes.length != 0) {
- FunctionType baseType = accessor.type;
- if (baseType == null) {
- AnalysisEngine.instance.logger.logInformation(
- 'Type of $accessor is null in PropertyAccessorMember._isChangedByTypeSubstitution');
- return false;
- }
- List<DartType> parameterTypes = definingType.element.type.typeArguments;
- FunctionType substitutedType =
- baseType.substitute2(argumentTypes, parameterTypes);
- if (baseType != substitutedType) {
- return true;
- }
- // If this property accessor is based on a field, that field might have a
- // propagated type. In which case we need to check whether the propagated
- // type of the field needs substitution.
- PropertyInducingElement field = accessor.variable;
- if (!field.isSynthetic) {
- DartType baseFieldType = field.propagatedType;
- if (baseFieldType != null) {
- DartType substitutedFieldType =
- baseFieldType.substitute2(argumentTypes, parameterTypes);
- if (baseFieldType != substitutedFieldType) {
- return true;
- }
- }
- }
- }
- return false;
- }
}
/**
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart
index 0945db2..9aed72a 100644
--- a/pkg/analyzer/lib/src/summary/link.dart
+++ b/pkg/analyzer/lib/src/summary/link.dart
@@ -2583,8 +2583,8 @@
FunctionType _inferExecutableType(
FunctionType rawMethodType,
- int numNamed,
- int numPositional,
+ int numNamedArguments,
+ int numPositionalArguments,
List<String> namedArgNames,
List<DartType> namedArgTypeList,
List<DartType> positionalArgTypes,
@@ -2599,36 +2599,46 @@
}
} else if (rawMethodType.typeFormals.isNotEmpty &&
ts is StrongTypeSystemImpl) {
- List<DartType> paramTypes = <DartType>[];
- List<DartType> argTypes = <DartType>[];
- // Add positional parameter and argument types.
- for (int i = 0; i < numPositional; i++) {
- ParameterElement parameter = rawMethodType.parameters[i];
- if (parameter != null) {
- paramTypes.add(parameter.type);
- argTypes.add(positionalArgTypes[i]);
- }
- }
- // Prepare named argument types map.
+ // Prepare the named argument types map.
Map<String, DartType> namedArgTypes = <String, DartType>{};
- for (int i = 0; i < numNamed; i++) {
+ for (int i = 0; i < numNamedArguments; i++) {
String name = namedArgNames[i];
DartType type = namedArgTypeList[i];
namedArgTypes[name] = type;
}
- // Add named parameter and argument types.
- Map<String, DartType> namedParameterTypes =
- rawMethodType.namedParameterTypes;
- namedArgTypes.forEach((String name, DartType argType) {
- DartType parameterType = namedParameterTypes[name];
- if (parameterType != null) {
- paramTypes.add(parameterType);
- argTypes.add(argType);
+
+ // Fill parameters and the corresponding arguments.
+ List<DartType> parameterTypes = <DartType>[];
+ List<DartType> argumentTypes = <DartType>[];
+ int positionalIndex = 0;
+ int numRequiredParameters = 0;
+ for (ParameterElement parameter in rawMethodType.parameters) {
+ if (parameter.parameterKind == ParameterKind.REQUIRED) {
+ numRequiredParameters++;
+ if (numRequiredParameters > numPositionalArguments) {
+ return null;
+ }
+ parameterTypes.add(parameter.type);
+ argumentTypes.add(positionalArgTypes[positionalIndex]);
+ positionalIndex++;
+ } else if (parameter.parameterKind == ParameterKind.POSITIONAL) {
+ if (positionalIndex < numPositionalArguments) {
+ parameterTypes.add(parameter.type);
+ argumentTypes.add(positionalArgTypes[positionalIndex]);
+ positionalIndex++;
+ }
+ } else if (parameter.parameterKind == ParameterKind.NAMED) {
+ DartType namedArgumentType = namedArgTypes[parameter.name];
+ if (namedArgumentType != null) {
+ parameterTypes.add(parameter.type);
+ argumentTypes.add(namedArgumentType);
+ }
}
- });
+ }
+
// Perform inference.
FunctionType inferred = ts.inferGenericFunctionCall(rawMethodType,
- paramTypes, argTypes, rawMethodType.returnType, null);
+ parameterTypes, argumentTypes, rawMethodType.returnType, null);
return inferred;
}
}
diff --git a/pkg/analyzer/test/src/summary/top_level_inference_test.dart b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
index 58b26a0..6be721b 100644
--- a/pkg/analyzer/test/src/summary/top_level_inference_test.dart
+++ b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
@@ -432,7 +432,7 @@
test_initializer_methodInvocation_hasTypeParameters() async {
var library = await _encodeDecodeLibrary(r'''
class A {
- List<T> m<T>(int p) => null;
+ List<T> m<T>() => null;
}
var vWithTypeArgument = new A().m<int>();
var vWithoutTypeArgument = new A().m();
@@ -631,6 +631,31 @@
''');
}
+ test_instanceField_functionTypeAlias_doesNotUseItsTypeParameter() async {
+ var library = await _encodeDecodeLibrary(r'''
+typedef F<T>();
+
+class A<T> {
+ F<T> get x => null;
+}
+
+class B extends A<int> {
+ get x => null;
+}
+''');
+ checkElementText(
+ library,
+ r'''
+typedef dynamic F<T>();
+class A<T> {
+ F get x {}
+}
+class B extends A<int> {
+ F get x {}
+}
+''');
+ }
+
test_method_error_conflict_parameterType_generic() async {
var library = await _encodeDecodeLibrary(r'''
class A<T> {
diff --git a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
index de02780..3e97028 100644
--- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
+++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
@@ -869,6 +869,15 @@
''');
}
+ test_constructors_tooManyPositionalArguments() async {
+ var unit = await checkFileElement(r'''
+class A<T> {}
+var a = new A/*error:EXTRA_POSITIONAL_ARGUMENTS*/(42);
+''');
+ var vars = unit.topLevelVariables;
+ expect(vars[0].type.toString(), 'A<dynamic>');
+ }
+
test_doNotInferOverriddenFieldsThatExplicitlySayDynamic_infer() async {
await checkFileElement('''
class A {
diff --git a/tools/VERSION b/tools/VERSION
index 6605793..9aa7e6f6 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -28,4 +28,4 @@
MINOR 23
PATCH 0
PRERELEASE 9
-PRERELEASE_PATCH 0
+PRERELEASE_PATCH 1