| 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]);
|
| + }
|
| + }
|
| + }
|
| }
|
| }
|
|
|
|
|