Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(170)

Unified Diff: pkg/analyzer/lib/src/generated/element_resolver.dart

Issue 1504483002: Allow explicitly passing generic function type args (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: format Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/analyzer/lib/src/generated/element_resolver.dart
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 8c981ffa59dd0976af2648f4de478319fd789015..9cef47fcb6e5dc4d339595eef52e2a357f79bffd 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -635,6 +635,46 @@ class ElementResolver extends SimpleAstVisitor<Object> {
}
}
}
+ //
+ // Check for a generic method & apply type arguments if any were passed.
+ //
+ if (staticElement is MethodElement || staticElement is FunctionElement) {
+ FunctionType type = (staticElement as ExecutableElement).type;
+ List<TypeParameterElement> parameters = type.boundTypeParameters;
+
+ NodeList<TypeName> arguments = node.typeArguments?.arguments;
+ if (arguments != null && arguments.length != parameters.length) {
+ // Wrong number of type arguments. Ignore them
+ arguments = null;
+ _resolver.reportErrorForNode(
+ StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS,
+ methodName,
+ [type, parameters.length, arguments.length]);
+ }
+ if (parameters.isNotEmpty) {
+ List<DartType> typeArgs;
+ if (arguments == null) {
+ typeArgs = new List<DartType>.filled(
+ parameters.length, DynamicTypeImpl.instance);
+ } else {
+ typeArgs = new List<DartType>.from(arguments.map((n) => n.type));
+ }
+ type = type.instantiate(typeArgs);
+
+ if (staticElement is MethodMember) {
+ MethodMember member = staticElement;
+ staticElement =
+ new MethodMember(member.baseElement, member.definingType, type);
+ } else if (staticElement is MethodElement) {
+ ClassElement clazz = staticElement.enclosingElement;
+ staticElement = new MethodMember(staticElement, clazz.type, type);
+ } else {
+ staticElement =
+ new FunctionMember(staticElement as FunctionElement, type);
+ }
+ }
+ }
+
staticElement = _convertSetterToGetter(staticElement);
propagatedElement = _convertSetterToGetter(propagatedElement);
//

Powered by Google App Engine
This is Rietveld 408576698