CQ. Fix resolution of CommentReference(s) on field / function-typed / super formal parameters.

Bug: https://buganizer.corp.google.com/issues/488989811
Change-Id: I54e97d9ef895999a648d1f6626403804407cd60e
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/484660
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
This commit is contained in:
Konstantin Shcheglov
2026-03-02 09:41:50 -08:00
committed by Commit Queue
parent c3cc1d53a3
commit 3828142590
2 changed files with 75 additions and 6 deletions
@@ -213,6 +213,7 @@ class ScopeContext {
var element = node.declaredFragment!.element;
node.metadata.accept(visitor);
node.documentationComment?.accept(visitor);
withTypeParameterScope(element.typeParameters, () {
node.type?.accept(visitor);
@@ -287,6 +288,7 @@ class ScopeContext {
var element = node.declaredFragment!.element;
node.metadata.accept(visitor);
node.documentationComment?.accept(visitor);
withTypeParameterScope(element.typeParameters, () {
node.returnType?.accept(visitor);
@@ -413,6 +415,7 @@ class ScopeContext {
var element = node.declaredFragment!.element;
node.metadata.accept(visitor);
node.documentationComment?.accept(visitor);
withTypeParameterScope(element.typeParameters, () {
node.type?.accept(visitor);
@@ -2086,6 +2086,62 @@ CommentReference
''');
}
test_onFieldFormalParameter() async {
// TODO(scheglov): add tests for references to nested formal parameters
await assertNoErrorsInCode(r'''
class A {
final int f;
A({
/// [int]
required this.f,
});
}
''');
var node = findNode.commentReference('int]');
assertResolvedNodeText(node, r'''
CommentReference
expression: SimpleIdentifier
token: int
element: dart:core::@class::int
staticType: null
''');
}
test_onFunctionTypedFormalParameter() async {
await assertNoErrorsInCode(r'''
void f(
/// [int]
void g(int a),
) {}
''');
var node = findNode.commentReference('int]');
assertResolvedNodeText(node, r'''
CommentReference
expression: SimpleIdentifier
token: int
element: dart:core::@class::int
staticType: null
''');
}
test_onFunctionTypedFormalParameter_self() async {
// TODO(scheglov): add tests for references to nested formal parameters
await assertNoErrorsInCode(r'''
/// [bar]
void f(int bar()) {}
''');
assertResolvedNodeText(findNode.commentReference('bar]'), r'''
CommentReference
expression: SimpleIdentifier
token: bar
element: <testLibrary>::@function::f::@formalParameter::bar
staticType: null
''');
}
test_onSimpleFormalParameter() async {
await assertNoErrorsInCode(r'''
void f(
@@ -2104,17 +2160,27 @@ CommentReference
''');
}
test_parameter_functionTyped() async {
test_onSuperFormalParameter() async {
// TODO(scheglov): add tests for references to nested formal parameters
await assertNoErrorsInCode(r'''
/// [bar]
foo(int bar()) {}
class A {
A({required int f});
}
class B extends A {
B({
/// [int]
required super.f,
});
}
''');
assertResolvedNodeText(findNode.commentReference('bar]'), r'''
var node = findNode.commentReference('int]');
assertResolvedNodeText(node, r'''
CommentReference
expression: SimpleIdentifier
token: bar
element: <testLibrary>::@function::foo::@formalParameter::bar
token: int
element: dart:core::@class::int
staticType: null
''');
}