Index: pkg/analyzer/lib/src/generated/declaration_resolver.dart |
diff --git a/pkg/analyzer/lib/src/generated/declaration_resolver.dart b/pkg/analyzer/lib/src/generated/declaration_resolver.dart |
index 1b51e8ebd5c3ad1e020c511344f8e70dd49cbc05..9bbba1a5d3a8d518d7b10a84146893b59da5d3b8 100644 |
--- a/pkg/analyzer/lib/src/generated/declaration_resolver.dart |
+++ b/pkg/analyzer/lib/src/generated/declaration_resolver.dart |
@@ -279,11 +279,20 @@ class DeclarationResolver extends RecursiveAstVisitor<Object> { |
@override |
Object visitGenericFunctionType(GenericFunctionType node) { |
- GenericFunctionTypeElement element = node.type.element; |
- _setGenericFunctionType(node.returnType, element.returnType); |
- _walk(new ElementWalker.forGenericFunctionType(element), () { |
- super.visitGenericFunctionType(node); |
- }); |
+ if (_walker.elementBuilder != null) { |
+ _walker.elementBuilder.visitGenericFunctionType(node); |
+ } else { |
+ DartType type = node.type; |
+ if (type != null) { |
+ Element element = type.element; |
+ if (element is GenericFunctionTypeElement) { |
+ _setGenericFunctionType(node.returnType, element.returnType); |
+ _walk(new ElementWalker.forGenericFunctionType(element), () { |
+ super.visitGenericFunctionType(node); |
+ }); |
+ } |
+ } |
+ } |
return null; |
} |
@@ -546,6 +555,18 @@ class DeclarationResolver extends RecursiveAstVisitor<Object> { |
void _setGenericFunctionType(TypeAnnotation typeNode, DartType type) { |
if (typeNode is GenericFunctionTypeImpl) { |
typeNode.type = type; |
+ } else if (typeNode is NamedType) { |
+ typeNode.type = type; |
+ if (type is ParameterizedType) { |
+ List<TypeAnnotation> nodes = |
+ typeNode.typeArguments?.arguments ?? const []; |
+ List<DartType> types = type.typeArguments; |
+ if (nodes.length == types.length) { |
+ for (int i = 0; i < nodes.length; i++) { |
+ _setGenericFunctionType(nodes[i], types[i]); |
+ } |
+ } |
+ } |
} |
} |