Issue 46968. Fix resolution when a function typed field formal parameter has type parameters.

Bug: https://github.com/dart-lang/sdk/issues/46968
Change-Id: I20ba948b26040e00635612f52af7cf7e51230695
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/211465
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
This commit is contained in:
Konstantin Shcheglov 2021-08-26 21:08:59 +00:00 committed by commit-bot@chromium.org
parent 59216c7949
commit d4c00fdfcc
3 changed files with 47 additions and 15 deletions

View file

@ -475,22 +475,25 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
_setOrCreateMetadataElements(element, node.metadata);
_withElementHolder(ElementHolder(element), () {
_withNameScope(() {
_buildTypeParameterElements(node.typeParameters);
node.typeParameters?.accept(this);
node.type?.accept(this);
if (_elementWalker != null) {
_withElementWalker(ElementWalker.forParameter(element), () {
node.parameters?.accept(this);
_withElementWalker(
_elementWalker != null ? ElementWalker.forParameter(element) : null,
() {
_withNameScope(() {
_buildTypeParameterElements(node.typeParameters);
node.typeParameters?.accept(this);
node.type?.accept(this);
if (_elementWalker != null) {
node.parameters?.accept(this);
} else {
// Only for recovery, this should not happen in valid code.
element.type = node.type?.type ?? _dynamicType;
_withElementWalker(null, () {
node.parameters?.accept(this);
});
}
});
} else {
// Only for recovery, this should not happen in valid code.
element.type = node.type?.type ?? _dynamicType;
_withElementWalker(null, () {
node.parameters?.accept(this);
});
}
});
},
);
});
}

View file

@ -0,0 +1,27 @@
// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'context_collection_resolution.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(FieldFormalParameterResolutionTest);
});
}
@reflectiveTest
class FieldFormalParameterResolutionTest extends PubPackageResolutionTest {
/// There was a crash.
/// https://github.com/dart-lang/sdk/issues/46968
test_hasTypeParameters() async {
await assertNoErrorsInCode(r'''
class A {
T Function<T>(T) f;
A(U this.f<U>(U a));
}
''');
}
}

View file

@ -18,6 +18,7 @@ import 'enum_test.dart' as enum_resolution;
import 'export_test.dart' as export_;
import 'extension_method_test.dart' as extension_method;
import 'extension_override_test.dart' as extension_override;
import 'field_formal_parameter_test.dart' as field_formal_parameter;
import 'field_test.dart' as field;
import 'for_element_test.dart' as for_element;
import 'for_statement_test.dart' as for_in;
@ -82,6 +83,7 @@ main() {
export_.main();
extension_method.main();
extension_override.main();
field_formal_parameter.main();
field.main();
for_element.main();
for_in.main();