mirror of
https://github.com/dart-lang/sdk
synced 2024-10-06 13:18:01 +00:00
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:
parent
59216c7949
commit
d4c00fdfcc
|
@ -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);
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
''');
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue