Skip to content

Commit 54f845c

Browse files
committed
Support for generic function as type arguments in DeclarationResolver.
[email protected] BUG= Review-Url: https://codereview.chromium.org/2814223002 .
1 parent f0734f9 commit 54f845c

File tree

3 files changed

+77
-6
lines changed

3 files changed

+77
-6
lines changed

pkg/analyzer/lib/src/generated/declaration_resolver.dart

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -279,11 +279,20 @@ class DeclarationResolver extends RecursiveAstVisitor<Object> {
279279

280280
@override
281281
Object visitGenericFunctionType(GenericFunctionType node) {
282-
GenericFunctionTypeElement element = node.type.element;
283-
_setGenericFunctionType(node.returnType, element.returnType);
284-
_walk(new ElementWalker.forGenericFunctionType(element), () {
285-
super.visitGenericFunctionType(node);
286-
});
282+
if (_walker.elementBuilder != null) {
283+
_walker.elementBuilder.visitGenericFunctionType(node);
284+
} else {
285+
DartType type = node.type;
286+
if (type != null) {
287+
Element element = type.element;
288+
if (element is GenericFunctionTypeElement) {
289+
_setGenericFunctionType(node.returnType, element.returnType);
290+
_walk(new ElementWalker.forGenericFunctionType(element), () {
291+
super.visitGenericFunctionType(node);
292+
});
293+
}
294+
}
295+
}
287296
return null;
288297
}
289298

@@ -546,6 +555,18 @@ class DeclarationResolver extends RecursiveAstVisitor<Object> {
546555
void _setGenericFunctionType(TypeAnnotation typeNode, DartType type) {
547556
if (typeNode is GenericFunctionTypeImpl) {
548557
typeNode.type = type;
558+
} else if (typeNode is NamedType) {
559+
typeNode.type = type;
560+
if (type is ParameterizedType) {
561+
List<TypeAnnotation> nodes =
562+
typeNode.typeArguments?.arguments ?? const [];
563+
List<DartType> types = type.typeArguments;
564+
if (nodes.length == types.length) {
565+
for (int i = 0; i < nodes.length; i++) {
566+
_setGenericFunctionType(nodes[i], types[i]);
567+
}
568+
}
569+
}
549570
}
550571
}
551572

pkg/analyzer/test/generated/declaration_resolver_test.dart

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,57 @@ int Function(int, String) v;
520520
// no other validations than built into DeclarationResolver
521521
}
522522

523+
test_genericFunction_asTypeArgument() async {
524+
String code = r'''
525+
List<Function(int)> v;
526+
''';
527+
CompilationUnit unit = await resolveSource(code);
528+
// re-resolve
529+
_cloneResolveUnit(unit);
530+
// no other validations than built into DeclarationResolver
531+
}
532+
533+
test_genericFunction_asTypeArgument_lessNodes() async {
534+
String code = r'''
535+
Map<Function<int>> v;
536+
''';
537+
CompilationUnit unit = await resolveSource(code);
538+
// re-resolve
539+
_cloneResolveUnit(unit);
540+
// no other validations than built into DeclarationResolver
541+
}
542+
543+
test_genericFunction_asTypeArgument_moreNodes() async {
544+
String code = r'''
545+
List<Function<int>, Function<String>> v;
546+
''';
547+
CompilationUnit unit = await resolveSource(code);
548+
// re-resolve
549+
_cloneResolveUnit(unit);
550+
// no other validations than built into DeclarationResolver
551+
}
552+
553+
test_genericFunction_asTypeArgument_noNodes() async {
554+
String code = r'''
555+
List v;
556+
''';
557+
CompilationUnit unit = await resolveSource(code);
558+
// re-resolve
559+
_cloneResolveUnit(unit);
560+
// no other validations than built into DeclarationResolver
561+
}
562+
563+
test_genericFunction_asTypeArgument_ofInitializer() async {
564+
String code = r'''
565+
var v = <Function(int)>[];
566+
''';
567+
CompilationUnit unit = await resolveSource(code);
568+
CompilationUnit newUnit = _cloneResolveUnit(unit);
569+
var v = newUnit.declarations[0] as TopLevelVariableDeclaration;
570+
var initializer = v.variables.variables[0].initializer as ListLiteral;
571+
expect(initializer.typeArguments.arguments[0].type, isNotNull);
572+
}
573+
523574
test_invalid_functionDeclaration_getter_inFunction() async {
524575
String code = r'''
525576
var v = (() {

tests/language/language_analyzer2.status

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ enum_syntax_test/06: Fail # 21649
2323
regress_17382_test: Skip # don't care about the static warning.
2424
regress_23408_test: Skip # don't care about the static warning.
2525
regress_25246_test: Skip
26-
regress_29243_test: Crash # Issue 29335
2726
getter_setter_in_lib_test: Fail # issue 23286
2827

2928
# Test issue 12694 (was analyzer issue), (1) when "abstract" is import prefix using it as type is warning; (2) currently analyzer resolves prefix as field (don't ask)

0 commit comments

Comments
 (0)