blob: 6e3fa339c6f491178cb76049c82d33343bda8083 [file]
// Copyright (c) 2018, 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';
import 'node_text_expectations.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(CommentResolutionTest);
defineReflectiveTests(UpdateNodeTextExpectations);
});
}
@reflectiveTest
class CommentResolutionTest extends PubPackageResolutionTest {
test_associatedSetterAndGetter_setterInScope_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
extension E1 on int {
int get foo => 0;
}
/// [foo]
extension E2 on int {
set foo(int value) {}
}
''');
var node = result.findNode.commentReference('foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@extension::E2::@setter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@extension::E2::@setter::foo
staticType: null
element: <testLibrary>::@extension::E2::@setter::foo
''');
}
test_associatedSetterAndGetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
int get foo => 0;
set foo(int value) {}
/// [foo]
void f() {}
''');
var node = result.findNode.commentReference('foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@getter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@getter::foo
staticType: null
element: <testLibrary>::@getter::foo
''');
}
test_beforeClass_unqualified() async {
var result = await resolveTestCodeWithDiagnostics(r'''
/// [foo]
class A {
foo() {}
}
''');
var node = result.findNode.commentReference('foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@class::A::@method::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@method::foo
staticType: null
element: <testLibrary>::@class::A::@method::foo
''');
}
test_beforeConstructor_fieldParameter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics(r'''
class A {
final int p;
/// [p]
A(this.p);
}
''');
var node = result.findNode.commentReference('p]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibrary>::@class::A::@constructor::new::@formalParameter::p
expression: SimpleIdentifier
token: p
element: <testLibrary>::@class::A::@constructor::new::@formalParameter::p
staticType: null
element: <testLibrary>::@class::A::@constructor::new::@formalParameter::p
''');
}
test_beforeConstructor_normalParameter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics(r'''
class A {
/// [p]
A(int p);
}''');
var node = result.findNode.commentReference('p]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibrary>::@class::A::@constructor::new::@formalParameter::p
expression: SimpleIdentifier
token: p
element: <testLibrary>::@class::A::@constructor::new::@formalParameter::p
staticType: null
element: <testLibrary>::@class::A::@constructor::new::@formalParameter::p
''');
}
test_beforeConstructor_superParameter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics(r'''
class A {
A(int p);
}
class B extends A {
/// [p]
B(super.p);
}
''');
var node = result.findNode.commentReference('p]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibrary>::@class::B::@constructor::new::@formalParameter::p
expression: SimpleIdentifier
token: p
element: <testLibrary>::@class::B::@constructor::new::@formalParameter::p
staticType: null
element: <testLibrary>::@class::B::@constructor::new::@formalParameter::p
''');
}
test_beforeEnum_unqualified() async {
var result = await resolveTestCodeWithDiagnostics(r'''
/// This is the [Samurai] kind.
enum Samurai {
/// Use [int].
WITH_SWORD,
/// Like [WITH_SWORD], but only without one.
WITHOUT_SWORD
}''');
var node1 = result.findNode.commentReference('Samurai]');
assertResolvedNodeText(node1, r'''
CommentReference
components
CommentReferenceComponent
name: Samurai
element: <testLibrary>::@enum::Samurai
expression: SimpleIdentifier
token: Samurai
element: <testLibrary>::@enum::Samurai
staticType: null
element: <testLibrary>::@enum::Samurai
''');
var node2 = result.findNode.commentReference('int]');
assertResolvedNodeText(node2, r'''
CommentReference
components
CommentReferenceComponent
name: int
element: dart:core::@class::int
expression: SimpleIdentifier
token: int
element: dart:core::@class::int
staticType: null
element: dart:core::@class::int
''');
var node3 = result.findNode.commentReference('WITH_SWORD]');
assertResolvedNodeText(node3, r'''
CommentReference
components
CommentReferenceComponent
name: WITH_SWORD
element: <testLibrary>::@enum::Samurai::@getter::WITH_SWORD
expression: SimpleIdentifier
token: WITH_SWORD
element: <testLibrary>::@enum::Samurai::@getter::WITH_SWORD
staticType: null
element: <testLibrary>::@enum::Samurai::@getter::WITH_SWORD
''');
}
test_beforeFunction_blockBody_unqualified() async {
var result = await resolveTestCodeWithDiagnostics(r'''
/// [p]
foo(int p) {}
''');
var node = result.findNode.commentReference('p]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibrary>::@function::foo::@formalParameter::p
expression: SimpleIdentifier
token: p
element: <testLibrary>::@function::foo::@formalParameter::p
staticType: null
element: <testLibrary>::@function::foo::@formalParameter::p
''');
}
test_beforeFunction_expressionBody_unqualified() async {
var result = await resolveTestCodeWithDiagnostics(r'''
/// [p]
foo(int p) => null;
''');
var node = result.findNode.commentReference('p]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibrary>::@function::foo::@formalParameter::p
expression: SimpleIdentifier
token: p
element: <testLibrary>::@function::foo::@formalParameter::p
staticType: null
element: <testLibrary>::@function::foo::@formalParameter::p
''');
}
test_beforeFunctionTypeAlias_unqualified() async {
var result = await resolveTestCodeWithDiagnostics(r'''
/// [p]
typedef Foo(int p);
''');
var node = result.findNode.commentReference('p]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: p@24
expression: SimpleIdentifier
token: p
element: p@24
staticType: null
element: p@24
''');
}
test_beforeGenericTypeAlias_unqualified() async {
var result = await resolveTestCodeWithDiagnostics(r'''
/// Can resolve [T], [S], and [p].
typedef Foo<T> = Function<S>(int p);
''');
var node1 = result.findNode.commentReference('T]');
assertResolvedNodeText(node1, r'''
CommentReference
components
CommentReferenceComponent
name: T
element: #E0 T
expression: SimpleIdentifier
token: T
element: #E0 T
staticType: null
element: #E0 T
''');
var node2 = result.findNode.commentReference('S]');
assertResolvedNodeText(node2, r'''
CommentReference
components
CommentReferenceComponent
name: S
element: #E0 S
expression: SimpleIdentifier
token: S
element: #E0 S
staticType: null
element: #E0 S
''');
var node3 = result.findNode.commentReference('p]');
assertResolvedNodeText(node3, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: p@68
expression: SimpleIdentifier
token: p
element: p@68
staticType: null
element: p@68
''');
}
test_beforeGetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics(r'''
/// [int]
get g => null;
''');
var node = result.findNode.commentReference('int]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: int
element: dart:core::@class::int
expression: SimpleIdentifier
token: int
element: dart:core::@class::int
staticType: null
element: dart:core::@class::int
''');
}
test_beforeMethod_unqualified() async {
var result = await resolveTestCodeWithDiagnostics(r'''
abstract class A {
/// [p1]
ma(int p1);
/// [p2]
mb(int p2);
/// [p3] and [p4]
mc(int p3, p4());
/// [p5] and [p6]
md(int p5, {int p6});
}
''');
var node1 = result.findNode.commentReference('p1]');
assertResolvedNodeText(node1, r'''
CommentReference
components
CommentReferenceComponent
name: p1
element: <testLibrary>::@class::A::@method::ma::@formalParameter::p1
expression: SimpleIdentifier
token: p1
element: <testLibrary>::@class::A::@method::ma::@formalParameter::p1
staticType: null
element: <testLibrary>::@class::A::@method::ma::@formalParameter::p1
''');
var node2 = result.findNode.commentReference('p2]');
assertResolvedNodeText(node2, r'''
CommentReference
components
CommentReferenceComponent
name: p2
element: <testLibrary>::@class::A::@method::mb::@formalParameter::p2
expression: SimpleIdentifier
token: p2
element: <testLibrary>::@class::A::@method::mb::@formalParameter::p2
staticType: null
element: <testLibrary>::@class::A::@method::mb::@formalParameter::p2
''');
var node3 = result.findNode.commentReference('p3]');
assertResolvedNodeText(node3, r'''
CommentReference
components
CommentReferenceComponent
name: p3
element: <testLibrary>::@class::A::@method::mc::@formalParameter::p3
expression: SimpleIdentifier
token: p3
element: <testLibrary>::@class::A::@method::mc::@formalParameter::p3
staticType: null
element: <testLibrary>::@class::A::@method::mc::@formalParameter::p3
''');
var node4 = result.findNode.commentReference('p4]');
assertResolvedNodeText(node4, r'''
CommentReference
components
CommentReferenceComponent
name: p4
element: <testLibrary>::@class::A::@method::mc::@formalParameter::p4
expression: SimpleIdentifier
token: p4
element: <testLibrary>::@class::A::@method::mc::@formalParameter::p4
staticType: null
element: <testLibrary>::@class::A::@method::mc::@formalParameter::p4
''');
var node5 = result.findNode.commentReference('p5]');
assertResolvedNodeText(node5, r'''
CommentReference
components
CommentReferenceComponent
name: p5
element: <testLibrary>::@class::A::@method::md::@formalParameter::p5
expression: SimpleIdentifier
token: p5
element: <testLibrary>::@class::A::@method::md::@formalParameter::p5
staticType: null
element: <testLibrary>::@class::A::@method::md::@formalParameter::p5
''');
var node6 = result.findNode.commentReference('p6]');
assertResolvedNodeText(node6, r'''
CommentReference
components
CommentReferenceComponent
name: p6
element: <testLibrary>::@class::A::@method::md::@formalParameter::p6
expression: SimpleIdentifier
token: p6
element: <testLibrary>::@class::A::@method::md::@formalParameter::p6
staticType: null
element: <testLibrary>::@class::A::@method::md::@formalParameter::p6
''');
}
test_class_constructor_named_qualified() async {
// TODO(srawlins): improve coverage regarding constructors, operators, the
// 'new' keyword, and members on an extension on a type variable
// (`extension <T> on T`).
var result = await resolveTestCodeWithDiagnostics('''
class A {
A.named();
}
/// [A.named]
void f() {}
''');
var node = result.findNode.commentReference('A.named]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <testLibrary>::@class::A
CommentReferenceComponent
period: .
name: named
element: <testLibrary>::@class::A::@constructor::named
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: <testLibrary>::@class::A
staticType: null
period: .
identifier: SimpleIdentifier
token: named
element: <testLibrary>::@class::A::@constructor::named
staticType: null
element: <testLibrary>::@class::A::@constructor::named
staticType: null
element: <testLibrary>::@class::A::@constructor::named
''');
}
test_class_constructor_named_qualified_importPrefix() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
class A {
A.named();
}
/// [self.A.named]
void f() {}
''');
// TODO(srawlins): Set the type of named, and test it, here and below.
var node = result.findNode.commentReference('A.named]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: A
element: <testLibrary>::@class::A
CommentReferenceComponent
period: .
name: named
element: <testLibrary>::@class::A::@constructor::named
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: <testLibrary>::@class::A
staticType: null
element: <testLibrary>::@class::A
staticType: null
operator: .
propertyName: SimpleIdentifier
token: named
element: <testLibrary>::@class::A::@constructor::named
staticType: null
staticType: null
element: <testLibrary>::@class::A::@constructor::named
''');
}
test_class_constructor_named_qualified_importPrefix_otherLibrary() async {
newFile('$testPackageLibPath/a.dart', 'class A { A.named(); }');
var result = await resolveTestCodeWithDiagnostics('''
import 'a.dart' as p;
/// [p.A.named]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@prefix::p
CommentReferenceComponent
period: .
name: A
element: package:test/a.dart::@class::A
CommentReferenceComponent
period: .
name: named
element: package:test/a.dart::@class::A::@constructor::named
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibraryFragment>::@prefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: package:test/a.dart::@class::A
staticType: null
element: package:test/a.dart::@class::A
staticType: null
operator: .
propertyName: SimpleIdentifier
token: named
element: package:test/a.dart::@class::A::@constructor::named
staticType: null
staticType: null
element: package:test/a.dart::@class::A::@constructor::named
''');
}
test_class_constructor_named_qualified_importPrefix_preferredOverInheritedGetter() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as p;
class A {
int get foo => 0;
}
class B extends A {
B.foo();
}
/// [p.B.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@prefix::p
CommentReferenceComponent
period: .
name: B
element: <testLibrary>::@class::B
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::B::@constructor::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibraryFragment>::@prefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: B
element: <testLibrary>::@class::B
staticType: null
element: <testLibrary>::@class::B
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@class::B::@constructor::foo
staticType: null
staticType: null
element: <testLibrary>::@class::B::@constructor::foo
''');
}
test_class_constructor_named_qualified_importPrefix_preferredOverInheritedMethod() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as p;
class A {
void foo() {}
}
class B extends A {
B.foo();
}
/// [p.B.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@prefix::p
CommentReferenceComponent
period: .
name: B
element: <testLibrary>::@class::B
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::B::@constructor::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibraryFragment>::@prefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: B
element: <testLibrary>::@class::B
staticType: null
element: <testLibrary>::@class::B
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@class::B::@constructor::foo
staticType: null
staticType: null
element: <testLibrary>::@class::B::@constructor::foo
''');
}
test_class_constructor_named_qualified_importPrefix_preferredOverInheritedSetter() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as p;
class A {
set foo(int value) {}
}
class B extends A {
B.foo();
}
/// [p.B.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@prefix::p
CommentReferenceComponent
period: .
name: B
element: <testLibrary>::@class::B
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::B::@constructor::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibraryFragment>::@prefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: B
element: <testLibrary>::@class::B
staticType: null
element: <testLibrary>::@class::B
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@class::B::@constructor::foo
staticType: null
staticType: null
element: <testLibrary>::@class::B::@constructor::foo
''');
}
test_class_constructor_named_qualified_preferredOverInheritedGetter() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
int get foo => 0;
}
class B extends A {
B.foo();
}
/// [B.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: B
element: <testLibrary>::@class::B
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::B::@constructor::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: B
element: <testLibrary>::@class::B
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@class::B::@constructor::foo
staticType: null
element: <testLibrary>::@class::B::@constructor::foo
staticType: null
element: <testLibrary>::@class::B::@constructor::foo
''');
}
test_class_constructor_named_qualified_preferredOverInheritedMethod() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
void foo() {}
}
class B extends A {
B.foo();
}
/// [B.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: B
element: <testLibrary>::@class::B
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::B::@constructor::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: B
element: <testLibrary>::@class::B
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@class::B::@constructor::foo
staticType: null
element: <testLibrary>::@class::B::@constructor::foo
staticType: null
element: <testLibrary>::@class::B::@constructor::foo
''');
}
test_class_constructor_named_qualified_preferredOverInheritedSetter() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
set foo(int value) {}
}
class B extends A {
B.foo();
}
/// [B.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: B
element: <testLibrary>::@class::B
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::B::@constructor::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: B
element: <testLibrary>::@class::B
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@class::B::@constructor::foo
staticType: null
element: <testLibrary>::@class::B::@constructor::foo
staticType: null
element: <testLibrary>::@class::B::@constructor::foo
''');
}
test_class_constructor_named_unqualified_inMember() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
A.named();
/// [named]
void foo() {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: named
element: <null>
expression: SimpleIdentifier
token: named
element: <null>
staticType: null
element: <null>
''');
}
test_class_constructor_unnamed_qualified() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
A();
}
/// [A.new]
void f() {}
''');
var node = result.findNode.commentReference('A.new]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <testLibrary>::@class::A
CommentReferenceComponent
period: .
name: new
element: <testLibrary>::@class::A::@constructor::new
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: <testLibrary>::@class::A
staticType: null
period: .
identifier: SimpleIdentifier
token: new
element: <testLibrary>::@class::A::@constructor::new
staticType: null
element: <testLibrary>::@class::A::@constructor::new
staticType: null
element: <testLibrary>::@class::A::@constructor::new
''');
}
test_class_constructor_unnamed_qualified_importPrefix() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
class A {
A();
}
/// [self.A.new]
void f() {}
''');
var node = result.findNode.commentReference('A.new]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: A
element: <testLibrary>::@class::A
CommentReferenceComponent
period: .
name: new
element: <testLibrary>::@class::A::@constructor::new
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: <testLibrary>::@class::A
staticType: null
element: <testLibrary>::@class::A
staticType: null
operator: .
propertyName: SimpleIdentifier
token: new
element: <testLibrary>::@class::A::@constructor::new
staticType: null
staticType: null
element: <testLibrary>::@class::A::@constructor::new
''');
}
test_class_extensionGetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
class A {}
extension E on A {
int get foo => 0;
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@extension::E::@getter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@extension::E::@getter::foo
staticType: null
element: <testLibrary>::@extension::E::@getter::foo
''');
}
test_class_extensionMethod_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
class A {}
extension E on A {
void foo() {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@extension::E::@method::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@extension::E::@method::foo
staticType: null
element: <testLibrary>::@extension::E::@method::foo
''');
}
test_class_extensionSetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
class A {}
extension E on A {
set foo(int value) {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@extension::E::@setter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@extension::E::@setter::foo
staticType: null
element: <testLibrary>::@extension::E::@setter::foo
''');
}
test_class_instanceGetter_qualified() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
int get foo => 0;
}
/// [A.foo]
void f() {}
''');
var node = result.findNode.commentReference('A.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <testLibrary>::@class::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@getter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: <testLibrary>::@class::A
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@getter::foo
staticType: null
element: <testLibrary>::@class::A::@getter::foo
staticType: null
element: <testLibrary>::@class::A::@getter::foo
''');
}
test_class_instanceGetter_qualified_importPrefix() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
class A {
int get foo => 0;
}
/// [self.A.foo]
void f() {}
''');
var node = result.findNode.commentReference('A.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: A
element: <testLibrary>::@class::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@getter::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: <testLibrary>::@class::A
staticType: null
element: <testLibrary>::@class::A
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@getter::foo
staticType: null
staticType: null
element: <testLibrary>::@class::A::@getter::foo
''');
}
test_class_instanceGetter_qualified_importPrefix_inherited_preferredOverInheritedSetter() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as p;
class A {
int get foo => 0;
set foo(int value) {}
}
class B extends A {}
/// [p.B.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@prefix::p
CommentReferenceComponent
period: .
name: B
element: <testLibrary>::@class::B
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@getter::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibraryFragment>::@prefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: B
element: <testLibrary>::@class::B
staticType: null
element: <testLibrary>::@class::B
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@getter::foo
staticType: null
staticType: null
element: <testLibrary>::@class::A::@getter::foo
''');
}
test_class_instanceGetter_qualified_importPrefix_onTypedef() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
class A {
int get foo => 0;
}
typedef B = A;
/// [self.B.foo]
void f() {}
''');
var node = result.findNode.commentReference('B.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: B
element: <testLibrary>::@typeAlias::B
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@getter::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: B
element: <testLibrary>::@typeAlias::B
staticType: null
element: <testLibrary>::@typeAlias::B
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@getter::foo
staticType: null
staticType: null
element: <testLibrary>::@class::A::@getter::foo
''');
}
test_class_instanceGetter_qualified_inherited_preferredOverInheritedSetter() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
int get foo => 0;
set foo(int value) {}
}
class B extends A {}
/// [B.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: B
element: <testLibrary>::@class::B
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@getter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: B
element: <testLibrary>::@class::B
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@getter::foo
staticType: null
element: <testLibrary>::@class::A::@getter::foo
staticType: null
element: <testLibrary>::@class::A::@getter::foo
''');
}
test_class_instanceGetter_qualified_onTypedef() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
int get foo => 0;
}
typedef B = A;
/// [B.foo]
void f() {}
''');
var node = result.findNode.commentReference('B.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: B
element: <testLibrary>::@typeAlias::B
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@getter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: B
element: <testLibrary>::@typeAlias::B
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@getter::foo
staticType: null
element: <testLibrary>::@class::A::@getter::foo
staticType: null
element: <testLibrary>::@class::A::@getter::foo
''');
}
test_class_instanceGetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
class A {
int get foo => 0;
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@class::A::@getter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@getter::foo
staticType: null
element: <testLibrary>::@class::A::@getter::foo
''');
}
test_class_instanceMethod_qualified() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
void foo() {}
}
/// [A.foo]
void f() {}
''');
var node = result.findNode.commentReference('A.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <testLibrary>::@class::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@method::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: <testLibrary>::@class::A
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@method::foo
staticType: null
element: <testLibrary>::@class::A::@method::foo
staticType: null
element: <testLibrary>::@class::A::@method::foo
''');
}
test_class_instanceMethod_qualified_importPrefix() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
class A {
void foo() {}
}
/// [self.A.foo]
void f() {}
''');
var node = result.findNode.commentReference('A.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: A
element: <testLibrary>::@class::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@method::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: <testLibrary>::@class::A
staticType: null
element: <testLibrary>::@class::A
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@method::foo
staticType: null
staticType: null
element: <testLibrary>::@class::A::@method::foo
''');
}
test_class_instanceMethod_qualified_importPrefix_sameNameAsConstructor() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as p;
class A {
A.foo();
void foo() {}
}
/// [p.A.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@prefix::p
CommentReferenceComponent
period: .
name: A
element: <testLibrary>::@class::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@method::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibraryFragment>::@prefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: <testLibrary>::@class::A
staticType: null
element: <testLibrary>::@class::A
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@method::foo
staticType: null
staticType: null
element: <testLibrary>::@class::A::@method::foo
''');
}
test_class_instanceMethod_qualified_sameNameAsConstructor() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
A.foo();
void foo() {}
}
/// [A.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <testLibrary>::@class::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@method::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: <testLibrary>::@class::A
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@method::foo
staticType: null
element: <testLibrary>::@class::A::@method::foo
staticType: null
element: <testLibrary>::@class::A::@method::foo
''');
}
test_class_instanceMethod_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
class A {
void foo() {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@class::A::@method::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@method::foo
staticType: null
element: <testLibrary>::@class::A::@method::foo
''');
}
test_class_instanceSetter_qualified() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
set foo(int _) {}
}
/// [A.foo]
void f() {}
''');
var node = result.findNode.commentReference('A.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <testLibrary>::@class::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@setter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: <testLibrary>::@class::A
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@setter::foo
staticType: null
element: <testLibrary>::@class::A::@setter::foo
staticType: null
element: <testLibrary>::@class::A::@setter::foo
''');
}
test_class_instanceSetter_qualified_importPrefix() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
class A {
set foo(int value) {}
}
/// [self.A.foo]
void f() {}
''');
var node = result.findNode.commentReference('A.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: A
element: <testLibrary>::@class::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@setter::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: <testLibrary>::@class::A
staticType: null
element: <testLibrary>::@class::A
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@setter::foo
staticType: null
staticType: null
element: <testLibrary>::@class::A::@setter::foo
''');
}
test_class_instanceSetter_qualified_importPrefix_inherited() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as p;
class A {
set foo(int value) {}
}
class B extends A {}
/// [p.B.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@prefix::p
CommentReferenceComponent
period: .
name: B
element: <testLibrary>::@class::B
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@setter::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibraryFragment>::@prefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: B
element: <testLibrary>::@class::B
staticType: null
element: <testLibrary>::@class::B
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@setter::foo
staticType: null
staticType: null
element: <testLibrary>::@class::A::@setter::foo
''');
}
test_class_instanceSetter_qualified_importPrefix_inherited_onTypedef() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as p;
class A {
set foo(int value) {}
}
class B extends A {}
typedef C = B;
/// [p.C.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@prefix::p
CommentReferenceComponent
period: .
name: C
element: <testLibrary>::@typeAlias::C
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@setter::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibraryFragment>::@prefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: C
element: <testLibrary>::@typeAlias::C
staticType: null
element: <testLibrary>::@typeAlias::C
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@setter::foo
staticType: null
staticType: null
element: <testLibrary>::@class::A::@setter::foo
''');
}
test_class_instanceSetter_qualified_importPrefix_preferredOverInheritedGetter() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as p;
class A {
int get foo => 0;
}
class B extends A {
set foo(int value) {}
}
/// [p.B.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@prefix::p
CommentReferenceComponent
period: .
name: B
element: <testLibrary>::@class::B
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::B::@setter::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibraryFragment>::@prefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: B
element: <testLibrary>::@class::B
staticType: null
element: <testLibrary>::@class::B
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@class::B::@setter::foo
staticType: null
staticType: null
element: <testLibrary>::@class::B::@setter::foo
''');
}
test_class_instanceSetter_qualified_importPrefix_sameNameAsConstructor() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as p;
class A {
A.foo();
set foo(int value) {}
}
/// [p.A.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@prefix::p
CommentReferenceComponent
period: .
name: A
element: <testLibrary>::@class::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@setter::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibraryFragment>::@prefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: <testLibrary>::@class::A
staticType: null
element: <testLibrary>::@class::A
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@setter::foo
staticType: null
staticType: null
element: <testLibrary>::@class::A::@setter::foo
''');
}
test_class_instanceSetter_qualified_inherited() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
set foo(int value) {}
}
class B extends A {}
/// [B.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: B
element: <testLibrary>::@class::B
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@setter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: B
element: <testLibrary>::@class::B
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@setter::foo
staticType: null
element: <testLibrary>::@class::A::@setter::foo
staticType: null
element: <testLibrary>::@class::A::@setter::foo
''');
}
test_class_instanceSetter_qualified_inherited_onTypedef() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
set foo(int value) {}
}
class B extends A {}
typedef C = B;
/// [C.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: C
element: <testLibrary>::@typeAlias::C
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@setter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: C
element: <testLibrary>::@typeAlias::C
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@setter::foo
staticType: null
element: <testLibrary>::@class::A::@setter::foo
staticType: null
element: <testLibrary>::@class::A::@setter::foo
''');
}
test_class_instanceSetter_qualified_preferredOverInheritedGetter() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
int get foo => 0;
}
class B extends A {
set foo(int value) {}
}
/// [B.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: B
element: <testLibrary>::@class::B
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::B::@setter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: B
element: <testLibrary>::@class::B
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@class::B::@setter::foo
staticType: null
element: <testLibrary>::@class::B::@setter::foo
staticType: null
element: <testLibrary>::@class::B::@setter::foo
''');
}
test_class_instanceSetter_qualified_sameNameAsConstructor() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
A.foo();
set foo(int value) {}
}
/// [A.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <testLibrary>::@class::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@setter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: <testLibrary>::@class::A
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@setter::foo
staticType: null
element: <testLibrary>::@class::A::@setter::foo
staticType: null
element: <testLibrary>::@class::A::@setter::foo
''');
}
test_class_instanceSetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
class A {
set foo(int value) {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@class::A::@setter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@setter::foo
staticType: null
element: <testLibrary>::@class::A::@setter::foo
''');
}
test_class_instanceSetter_unqualified_preferredOverInheritedGetter() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
int get foo => 0;
}
/// [foo]
class B extends A {
set foo(int value) {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@class::B::@setter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@class::B::@setter::foo
staticType: null
element: <testLibrary>::@class::B::@setter::foo
''');
}
test_class_invalid_ambiguous_unqualified() async {
newFile('$testPackageLibPath/a1.dart', r'''
class A {}
''');
newFile('$testPackageLibPath/a2.dart', r'''
class A {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
import 'a1.dart';
// ^^^^^^^^^
// [diag.unusedImport] Unused import: 'a1.dart'.
import 'a2.dart';
// ^^^^^^^^^
// [diag.unusedImport] Unused import: 'a2.dart'.
/// [A]
// ^
// [diag.ambiguousCommentReferenceName] The name 'A' is ambiguous because it is defined in the libraries 'package:test/a1.dart' and 'package:test/a2.dart'.
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: multiplyDefinedElement
package:test/a1.dart::@class::A
package:test/a2.dart::@class::A
expression: SimpleIdentifier
token: A
element: multiplyDefinedElement
package:test/a1.dart::@class::A
package:test/a2.dart::@class::A
staticType: null
element: multiplyDefinedElement
package:test/a1.dart::@class::A
package:test/a2.dart::@class::A
''');
}
test_class_invalid_ambiguousExtension_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
class A {}
extension E1 on A {
int get foo => 1;
}
extension E2 on A {
int get foo => 2;
}
''');
var node = result.findNode.commentReference('foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <null>
expression: SimpleIdentifier
token: foo
element: <null>
staticType: null
element: <null>
''');
}
test_class_invalid_unresolved_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
class A {}
''');
var node = result.findNode.commentReference('foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <null>
expression: SimpleIdentifier
token: foo
element: <null>
staticType: null
element: <null>
''');
}
test_class_staticGetter_qualified() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
static int get foo => 0;
}
/// [A.foo]
void f() {}
''');
var node = result.findNode.commentReference('A.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <testLibrary>::@class::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@getter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: <testLibrary>::@class::A
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@getter::foo
staticType: null
element: <testLibrary>::@class::A::@getter::foo
staticType: null
element: <testLibrary>::@class::A::@getter::foo
''');
}
test_class_staticGetter_qualified_importPrefix() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
class A {
static int get foo => 0;
}
/// [self.A.foo]
void f() {}
''');
var node = result.findNode.commentReference('A.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: A
element: <testLibrary>::@class::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@getter::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: <testLibrary>::@class::A
staticType: null
element: <testLibrary>::@class::A
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@getter::foo
staticType: null
staticType: null
element: <testLibrary>::@class::A::@getter::foo
''');
}
test_class_staticGetter_qualified_importPrefix_onTypedef() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
class A {
static int get foo => 0;
}
typedef B = A;
/// [self.B.foo]
void f() {}
''');
var node = result.findNode.commentReference('B.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: B
element: <testLibrary>::@typeAlias::B
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@getter::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: B
element: <testLibrary>::@typeAlias::B
staticType: null
element: <testLibrary>::@typeAlias::B
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@getter::foo
staticType: null
staticType: null
element: <testLibrary>::@class::A::@getter::foo
''');
}
test_class_staticGetter_qualified_onTypedef() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
static int get foo => 0;
}
typedef B = A;
/// [B.foo]
void f() {}
''');
var node = result.findNode.commentReference('B.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: B
element: <testLibrary>::@typeAlias::B
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@getter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: B
element: <testLibrary>::@typeAlias::B
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@getter::foo
staticType: null
element: <testLibrary>::@class::A::@getter::foo
staticType: null
element: <testLibrary>::@class::A::@getter::foo
''');
}
test_class_staticGetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
class A {
static int get foo => 0;
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@class::A::@getter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@getter::foo
staticType: null
element: <testLibrary>::@class::A::@getter::foo
''');
}
test_class_staticGetter_unqualified_superclass() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
static int get foo => 0;
}
/// [foo]
class B extends A {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <null>
expression: SimpleIdentifier
token: foo
element: <null>
staticType: null
element: <null>
''');
}
test_class_staticMethod_qualified() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
static void foo() {}
}
/// [A.foo]
void f() {}
''');
var node = result.findNode.commentReference('A.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <testLibrary>::@class::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@method::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: <testLibrary>::@class::A
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@method::foo
staticType: null
element: <testLibrary>::@class::A::@method::foo
staticType: null
element: <testLibrary>::@class::A::@method::foo
''');
}
test_class_staticMethod_qualified_importPrefix() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
class A {
static void foo() {}
}
/// [self.A.foo]
void f() {}
''');
var node = result.findNode.commentReference('A.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: A
element: <testLibrary>::@class::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@method::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: <testLibrary>::@class::A
staticType: null
element: <testLibrary>::@class::A
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@method::foo
staticType: null
staticType: null
element: <testLibrary>::@class::A::@method::foo
''');
}
test_class_staticMethod_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
class A {
static void foo() {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@class::A::@method::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@method::foo
staticType: null
element: <testLibrary>::@class::A::@method::foo
''');
}
test_class_staticMethod_unqualified_superclass() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
static void foo() {}
}
/// [foo]
class B extends A {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <null>
expression: SimpleIdentifier
token: foo
element: <null>
staticType: null
element: <null>
''');
}
test_class_staticSetter_qualified() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
static set foo(int _) {}
}
/// [A.foo]
void f() {}
''');
var node = result.findNode.commentReference('A.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <testLibrary>::@class::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@setter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: <testLibrary>::@class::A
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@setter::foo
staticType: null
element: <testLibrary>::@class::A::@setter::foo
staticType: null
element: <testLibrary>::@class::A::@setter::foo
''');
}
test_class_staticSetter_qualified_importPrefix() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
class A {
static set foo(int value) {}
}
/// [self.A.foo]
void f() {}
''');
var node = result.findNode.commentReference('A.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: A
element: <testLibrary>::@class::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@setter::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: <testLibrary>::@class::A
staticType: null
element: <testLibrary>::@class::A
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@setter::foo
staticType: null
staticType: null
element: <testLibrary>::@class::A::@setter::foo
''');
}
test_class_staticSetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
class A {
static set foo(int value) {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@class::A::@setter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@setter::foo
staticType: null
element: <testLibrary>::@class::A::@setter::foo
''');
}
test_class_staticSetter_unqualified_superclass() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
static set foo(int value) {}
}
/// [foo]
class B extends A {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <null>
expression: SimpleIdentifier
token: foo
element: <null>
staticType: null
element: <null>
''');
}
test_docImport_associatedSetterAndGetter_setterInScope_unqualified() async {
newFile('$testPackageLibPath/foo.dart', r'''
extension E1 on int {
int get foo => 0;
}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'foo.dart';
library;
/// [foo]
extension E2 on int {
set foo(int value) {}
}
''');
var node = result.findNode.commentReference('foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@extension::E2::@setter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@extension::E2::@setter::foo
staticType: null
element: <testLibrary>::@extension::E2::@setter::foo
''');
}
test_docImport_associatedSetterAndGetter_unqualified() async {
newFile('$testPackageLibPath/foo.dart', r'''
int get foo => 0;
set foo(int value) {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'foo.dart';
library;
/// [foo]
void f() {}
''');
var node = result.findNode.commentReference('foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: package:test/foo.dart::@getter::foo
expression: SimpleIdentifier
token: foo
element: package:test/foo.dart::@getter::foo
staticType: null
element: package:test/foo.dart::@getter::foo
''');
}
test_docImport_class_constructor_named_qualified() async {
newFile('$testPackageLibPath/foo.dart', r'''
class A {
A.named();
}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'foo.dart';
library;
/// [A.named]
void f() {}
''');
var node = result.findNode.commentReference('A.named]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: package:test/foo.dart::@class::A
CommentReferenceComponent
period: .
name: named
element: package:test/foo.dart::@class::A::@constructor::named
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: package:test/foo.dart::@class::A
staticType: null
period: .
identifier: SimpleIdentifier
token: named
element: package:test/foo.dart::@class::A::@constructor::named
staticType: null
element: package:test/foo.dart::@class::A::@constructor::named
staticType: null
element: package:test/foo.dart::@class::A::@constructor::named
''');
}
test_docImport_class_constructor_named_qualified_importPrefix() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {
A.named();
}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'a.dart' as p;
library;
/// [p.A.named]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@docImportPrefix::p
CommentReferenceComponent
period: .
name: A
element: package:test/a.dart::@class::A
CommentReferenceComponent
period: .
name: named
element: package:test/a.dart::@class::A::@constructor::named
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibraryFragment>::@docImportPrefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: package:test/a.dart::@class::A
staticType: null
element: package:test/a.dart::@class::A
staticType: null
operator: .
propertyName: SimpleIdentifier
token: named
element: package:test/a.dart::@class::A::@constructor::named
staticType: null
staticType: null
element: package:test/a.dart::@class::A::@constructor::named
''');
}
test_docImport_class_constructor_unnamed_qualified() async {
newFile('$testPackageLibPath/foo.dart', r'''
class A {
A();
}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'foo.dart';
library;
/// [A.new]
void f() {}
''');
var node = result.findNode.commentReference('A.new]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: package:test/foo.dart::@class::A
CommentReferenceComponent
period: .
name: new
element: package:test/foo.dart::@class::A::@constructor::new
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: package:test/foo.dart::@class::A
staticType: null
period: .
identifier: SimpleIdentifier
token: new
element: package:test/foo.dart::@class::A::@constructor::new
staticType: null
element: package:test/foo.dart::@class::A::@constructor::new
staticType: null
element: package:test/foo.dart::@class::A::@constructor::new
''');
}
test_docImport_class_instanceGetter_qualified() async {
newFile('$testPackageLibPath/foo.dart', r'''
class A {
int get foo => 0;
}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'foo.dart';
library;
/// [A.foo]
void f() {}
''');
var node = result.findNode.commentReference('A.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: package:test/foo.dart::@class::A
CommentReferenceComponent
period: .
name: foo
element: package:test/foo.dart::@class::A::@getter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: package:test/foo.dart::@class::A
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: package:test/foo.dart::@class::A::@getter::foo
staticType: null
element: package:test/foo.dart::@class::A::@getter::foo
staticType: null
element: package:test/foo.dart::@class::A::@getter::foo
''');
}
test_docImport_class_instanceMethod_invalid_ambiguous_qualified() async {
newFile('$testPackageLibPath/a1.dart', r'''
class A {
void foo() {}
}
''');
newFile('$testPackageLibPath/a2.dart', r'''
class A {
void foo() {}
}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'a1.dart';
/// @docImport 'a2.dart';
library;
/// [A.foo]
// ^
// [diag.ambiguousCommentReferenceName] The name 'A' is ambiguous because it is defined in the libraries 'package:test/a1.dart' and 'package:test/a2.dart'.
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: multiplyDefinedElement
package:test/a1.dart::@class::A
package:test/a2.dart::@class::A
CommentReferenceComponent
period: .
name: foo
element: <null>
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: multiplyDefinedElement
package:test/a1.dart::@class::A
package:test/a2.dart::@class::A
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <null>
staticType: null
element: <null>
staticType: null
element: <null>
''');
}
test_docImport_class_instanceMethod_qualified() async {
newFile('$testPackageLibPath/foo.dart', r'''
class A {
void foo() {}
}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'foo.dart';
library;
/// [A.foo]
void f() {}
''');
var node = result.findNode.commentReference('A.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: package:test/foo.dart::@class::A
CommentReferenceComponent
period: .
name: foo
element: package:test/foo.dart::@class::A::@method::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: package:test/foo.dart::@class::A
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: package:test/foo.dart::@class::A::@method::foo
staticType: null
element: package:test/foo.dart::@class::A::@method::foo
staticType: null
element: package:test/foo.dart::@class::A::@method::foo
''');
}
test_docImport_class_invalid_ambiguous_qualified_importPrefix() async {
newFile('$testPackageLibPath/a1.dart', r'''
class A {}
''');
newFile('$testPackageLibPath/a2.dart', r'''
class A {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'a1.dart' as p;
/// @docImport 'a2.dart' as p;
library;
/// [p.A]
// ^
// [diag.ambiguousCommentReferenceName] The name 'A' is ambiguous because it is defined in the libraries 'package:test/a1.dart' and 'package:test/a2.dart'.
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@docImportPrefix::p
CommentReferenceComponent
period: .
name: A
element: multiplyDefinedElement
package:test/a1.dart::@class::A
package:test/a2.dart::@class::A
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibraryFragment>::@docImportPrefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: multiplyDefinedElement
package:test/a1.dart::@class::A
package:test/a2.dart::@class::A
staticType: null
element: multiplyDefinedElement
package:test/a1.dart::@class::A
package:test/a2.dart::@class::A
staticType: null
element: multiplyDefinedElement
package:test/a1.dart::@class::A
package:test/a2.dart::@class::A
''');
}
test_docImport_class_invalid_ambiguous_unqualified() async {
newFile('$testPackageLibPath/a1.dart', r'''
class A {}
''');
newFile('$testPackageLibPath/a2.dart', r'''
class A {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'a1.dart';
/// @docImport 'a2.dart';
library;
/// [A]
// ^
// [diag.ambiguousCommentReferenceName] The name 'A' is ambiguous because it is defined in the libraries 'package:test/a1.dart' and 'package:test/a2.dart'.
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: multiplyDefinedElement
package:test/a1.dart::@class::A
package:test/a2.dart::@class::A
expression: SimpleIdentifier
token: A
element: multiplyDefinedElement
package:test/a1.dart::@class::A
package:test/a2.dart::@class::A
staticType: null
element: multiplyDefinedElement
package:test/a1.dart::@class::A
package:test/a2.dart::@class::A
''');
}
test_docImport_class_invalid_unresolved_unqualified_importPrefix() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'a.dart' as p;
library;
/// [A]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <null>
expression: SimpleIdentifier
token: A
element: <null>
staticType: null
element: <null>
''');
}
test_docImport_class_qualified_importPrefix() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'a.dart' as p;
library;
/// [p.A]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@docImportPrefix::p
CommentReferenceComponent
period: .
name: A
element: package:test/a.dart::@class::A
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibraryFragment>::@docImportPrefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: package:test/a.dart::@class::A
staticType: null
element: package:test/a.dart::@class::A
staticType: null
element: package:test/a.dart::@class::A
''');
}
test_docImport_class_qualified_importPrefix_inPart() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
var part = getFile('$testPackageLibPath/part.dart');
var results = await resolveFilesWithDiagnostics({
testFile: r'''
/// @docImport 'a.dart' as p;
library;
part 'part.dart';
''',
part: r'''
part of 'test.dart';
/// [p.A]
void f() {}
''',
});
var node = results[part]!.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@docImportPrefix::p
CommentReferenceComponent
period: .
name: A
element: package:test/a.dart::@class::A
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibraryFragment>::@docImportPrefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: package:test/a.dart::@class::A
staticType: null
element: package:test/a.dart::@class::A
staticType: null
element: package:test/a.dart::@class::A
''');
}
test_docImport_class_qualified_importPrefix_shadowedByImport() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
newFile('$testPackageLibPath/b.dart', r'''
class B {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'b.dart' as p;
library;
import 'a.dart' as p;
/// [p.A] and [p.B].
p.A? f() => null;
''');
var node = result.findNode.comment('/// [p.A]');
assertResolvedNodeText(node, r'''
Comment
references
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@prefix::p
CommentReferenceComponent
period: .
name: A
element: package:test/a.dart::@class::A
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibraryFragment>::@prefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: package:test/a.dart::@class::A
staticType: null
element: package:test/a.dart::@class::A
staticType: null
element: package:test/a.dart::@class::A
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@prefix::p
CommentReferenceComponent
period: .
name: B
element: <null>
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibraryFragment>::@prefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: B
element: <null>
staticType: null
element: <null>
staticType: null
element: <null>
tokens
/// [p.A] and [p.B].
''');
}
test_docImport_class_qualified_importPrefix_shared() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
newFile('$testPackageLibPath/b.dart', r'''
class B {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'a.dart' as p;
/// @docImport 'b.dart' as p;
library;
/// [p.A] and [p.B].
void f() {}
''');
var node = result.findNode.comment('/// [p.A]');
assertResolvedNodeText(node, r'''
Comment
references
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@docImportPrefix::p
CommentReferenceComponent
period: .
name: A
element: package:test/a.dart::@class::A
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibraryFragment>::@docImportPrefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: package:test/a.dart::@class::A
staticType: null
element: package:test/a.dart::@class::A
staticType: null
element: package:test/a.dart::@class::A
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@docImportPrefix::p
CommentReferenceComponent
period: .
name: B
element: package:test/b.dart::@class::B
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibraryFragment>::@docImportPrefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: B
element: package:test/b.dart::@class::B
staticType: null
element: package:test/b.dart::@class::B
staticType: null
element: package:test/b.dart::@class::B
tokens
/// [p.A] and [p.B].
''');
}
test_docImport_class_staticGetter_qualified() async {
newFile('$testPackageLibPath/foo.dart', r'''
class A {
static int get foo => 0;
}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'foo.dart';
library;
/// [A.foo]
void f() {}
''');
var node = result.findNode.commentReference('A.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: package:test/foo.dart::@class::A
CommentReferenceComponent
period: .
name: foo
element: package:test/foo.dart::@class::A::@getter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: package:test/foo.dart::@class::A
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: package:test/foo.dart::@class::A::@getter::foo
staticType: null
element: package:test/foo.dart::@class::A::@getter::foo
staticType: null
element: package:test/foo.dart::@class::A::@getter::foo
''');
}
test_docImport_class_staticMethod_qualified() async {
newFile('$testPackageLibPath/foo.dart', r'''
class A {
static void foo() {}
}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'foo.dart';
library;
/// [A.foo]
void f() {}
''');
var node = result.findNode.commentReference('A.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: package:test/foo.dart::@class::A
CommentReferenceComponent
period: .
name: foo
element: package:test/foo.dart::@class::A::@method::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: package:test/foo.dart::@class::A
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: package:test/foo.dart::@class::A::@method::foo
staticType: null
element: package:test/foo.dart::@class::A::@method::foo
staticType: null
element: package:test/foo.dart::@class::A::@method::foo
''');
}
test_docImport_class_staticSetter_qualified() async {
newFile('$testPackageLibPath/foo.dart', r'''
class A {
static set foo(int _) {}
}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'foo.dart';
library;
/// [A.foo]
void f() {}
''');
var node = result.findNode.commentReference('A.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: package:test/foo.dart::@class::A
CommentReferenceComponent
period: .
name: foo
element: package:test/foo.dart::@class::A::@setter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: package:test/foo.dart::@class::A
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: package:test/foo.dart::@class::A::@setter::foo
staticType: null
element: package:test/foo.dart::@class::A::@setter::foo
staticType: null
element: package:test/foo.dart::@class::A::@setter::foo
''');
}
test_docImport_class_unqualified_hideCombinator() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
class B {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'a.dart' hide A;
library;
/// [A] and [B].
void f() {}
''');
var node = result.findNode.comment('/// [A]');
assertResolvedNodeText(node, r'''
Comment
references
CommentReference
components
CommentReferenceComponent
name: A
element: <null>
expression: SimpleIdentifier
token: A
element: <null>
staticType: null
element: <null>
CommentReference
components
CommentReferenceComponent
name: B
element: package:test/a.dart::@class::B
expression: SimpleIdentifier
token: B
element: package:test/a.dart::@class::B
staticType: null
element: package:test/a.dart::@class::B
tokens
/// [A] and [B].
''');
}
test_docImport_class_unqualified_hideCombinator_ambiguous() async {
newFile('$testPackageLibPath/a1.dart', r'''
class A {}
''');
newFile('$testPackageLibPath/a2.dart', r'''
class A {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'a1.dart';
/// @docImport 'a2.dart' hide A;
library;
/// [A]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: package:test/a1.dart::@class::A
expression: SimpleIdentifier
token: A
element: package:test/a1.dart::@class::A
staticType: null
element: package:test/a1.dart::@class::A
''');
}
test_docImport_class_unqualified_inSubpart() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
var part = getFile('$testPackageLibPath/part.dart');
var subpart = getFile('$testPackageLibPath/subpart.dart');
var results = await resolveFilesWithDiagnostics({
testFile: r'''
/// @docImport 'a.dart';
library;
part 'part.dart';
''',
part: r'''
part of 'test.dart';
part 'subpart.dart';
''',
subpart: r'''
part of 'part.dart';
/// [A]
void f() {}
''',
});
var node = results[subpart]!.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: package:test/a.dart::@class::A
expression: SimpleIdentifier
token: A
element: package:test/a.dart::@class::A
staticType: null
element: package:test/a.dart::@class::A
''');
}
test_docImport_class_unqualified_shadowedByDeclaration() async {
newFile('$testPackageLibPath/a1.dart', r'''
class A {}
''');
newFile('$testPackageLibPath/a2.dart', r'''
class A {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'a1.dart';
/// @docImport 'a2.dart';
library;
/// [A]
void f() {}
class A {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <testLibrary>::@class::A
expression: SimpleIdentifier
token: A
element: <testLibrary>::@class::A
staticType: null
element: <testLibrary>::@class::A
''');
}
test_docImport_class_unqualified_showCombinator() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
class B {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'a.dart' show A;
library;
/// [A] and [B].
void f() {}
''');
var node = result.findNode.comment('/// [A]');
assertResolvedNodeText(node, r'''
Comment
references
CommentReference
components
CommentReferenceComponent
name: A
element: package:test/a.dart::@class::A
expression: SimpleIdentifier
token: A
element: package:test/a.dart::@class::A
staticType: null
element: package:test/a.dart::@class::A
CommentReference
components
CommentReferenceComponent
name: B
element: <null>
expression: SimpleIdentifier
token: B
element: <null>
staticType: null
element: <null>
tokens
/// [A] and [B].
''');
}
test_docImport_directive_importPrefix() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'a.dart' as p;
library;
''');
var node = result.findNode.comment('@docImport');
assertResolvedNodeText(node, r'''
Comment
tokens
/// @docImport 'a.dart' as p;
docImports
DocImport
offset: 4
import: ImportDirective
importKeyword: import
uri: SimpleStringLiteral
literal: 'a.dart'
asKeyword: as
prefixName: p
semicolon: ;
prefix: SimpleIdentifier
token: p
element: <testLibraryFragment>::@docImportPrefix::p
staticType: null
libraryImport: LibraryImport
uri: DirectiveUriWithLibrary
uri: package:test/a.dart
''');
}
test_docImport_extension_instanceGetter_qualified() async {
newFile('$testPackageLibPath/foo.dart', r'''
extension E on int {
int get foo => 0;
}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'foo.dart';
library;
/// [E.foo]
void f() {}
''');
var node = result.findNode.commentReference('E.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: E
element: package:test/foo.dart::@extension::E
CommentReferenceComponent
period: .
name: foo
element: package:test/foo.dart::@extension::E::@getter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: E
element: package:test/foo.dart::@extension::E
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: package:test/foo.dart::@extension::E::@getter::foo
staticType: null
element: package:test/foo.dart::@extension::E::@getter::foo
staticType: null
element: package:test/foo.dart::@extension::E::@getter::foo
''');
}
test_docImport_extension_instanceMethod_qualified() async {
newFile('$testPackageLibPath/foo.dart', r'''
extension E on int {
void foo() {}
}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'foo.dart';
library;
/// [E.foo]
void f() {}
''');
var node = result.findNode.commentReference('E.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: E
element: package:test/foo.dart::@extension::E
CommentReferenceComponent
period: .
name: foo
element: package:test/foo.dart::@extension::E::@method::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: E
element: package:test/foo.dart::@extension::E
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: package:test/foo.dart::@extension::E::@method::foo
staticType: null
element: package:test/foo.dart::@extension::E::@method::foo
staticType: null
element: package:test/foo.dart::@extension::E::@method::foo
''');
}
test_docImport_extension_instanceSetter_qualified() async {
newFile('$testPackageLibPath/foo.dart', r'''
extension E on int {
set foo(int _) {}
}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'foo.dart';
library;
/// [E.foo]
void f() {}
''');
var node = result.findNode.commentReference('E.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: E
element: package:test/foo.dart::@extension::E
CommentReferenceComponent
period: .
name: foo
element: package:test/foo.dart::@extension::E::@setter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: E
element: package:test/foo.dart::@extension::E
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: package:test/foo.dart::@extension::E::@setter::foo
staticType: null
element: package:test/foo.dart::@extension::E::@setter::foo
staticType: null
element: package:test/foo.dart::@extension::E::@setter::foo
''');
}
test_docImport_extension_staticGetter_qualified() async {
newFile('$testPackageLibPath/foo.dart', r'''
extension E on int {
static int get foo => 0;
}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'foo.dart';
library;
/// [E.foo]
void f() {}
''');
var node = result.findNode.commentReference('E.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: E
element: package:test/foo.dart::@extension::E
CommentReferenceComponent
period: .
name: foo
element: package:test/foo.dart::@extension::E::@getter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: E
element: package:test/foo.dart::@extension::E
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: package:test/foo.dart::@extension::E::@getter::foo
staticType: null
element: package:test/foo.dart::@extension::E::@getter::foo
staticType: null
element: package:test/foo.dart::@extension::E::@getter::foo
''');
}
test_docImport_extension_staticMethod_qualified() async {
newFile('$testPackageLibPath/foo.dart', r'''
extension E on int {
static void foo() {}
}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'foo.dart';
library;
/// [E.foo]
void f() {}
''');
var node = result.findNode.commentReference('E.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: E
element: package:test/foo.dart::@extension::E
CommentReferenceComponent
period: .
name: foo
element: package:test/foo.dart::@extension::E::@method::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: E
element: package:test/foo.dart::@extension::E
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: package:test/foo.dart::@extension::E::@method::foo
staticType: null
element: package:test/foo.dart::@extension::E::@method::foo
staticType: null
element: package:test/foo.dart::@extension::E::@method::foo
''');
}
test_docImport_extension_staticSetter_qualified() async {
newFile('$testPackageLibPath/foo.dart', r'''
extension E on int {
static set foo(int _) {}
}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'foo.dart';
library;
/// [E.foo]
void f() {}
''');
var node = result.findNode.commentReference('E.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: E
element: package:test/foo.dart::@extension::E
CommentReferenceComponent
period: .
name: foo
element: package:test/foo.dart::@extension::E::@setter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: E
element: package:test/foo.dart::@extension::E
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: package:test/foo.dart::@extension::E::@setter::foo
staticType: null
element: package:test/foo.dart::@extension::E::@setter::foo
staticType: null
element: package:test/foo.dart::@extension::E::@setter::foo
''');
}
test_docImport_fromExport_unqualified() async {
newFile('$testPackageLibPath/one.dart', r'''
class C {}
''');
newFile('$testPackageLibPath/two.dart', r'''
export 'one.dart';
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'two.dart';
library;
/// [C]
void f() {}
''');
var node = result.findNode.commentReference('C]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: C
element: package:test/one.dart::@class::C
expression: SimpleIdentifier
token: C
element: package:test/one.dart::@class::C
staticType: null
element: package:test/one.dart::@class::C
''');
}
test_docImport_fromExport_unqualified_sameElement() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
newFile('$testPackageLibPath/b.dart', r'''
export 'a.dart';
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'a.dart';
/// @docImport 'b.dart';
library;
/// [A]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: package:test/a.dart::@class::A
expression: SimpleIdentifier
token: A
element: package:test/a.dart::@class::A
staticType: null
element: package:test/a.dart::@class::A
''');
}
test_docImport_importPrefix_unqualified() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'a.dart' as p;
library;
/// [p]
void f() {}
''');
nodeTextConfiguration.withImportPrefixScopeLibraries = true;
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@docImportPrefix::p
scopeLibraries
package:test/a.dart
expression: SimpleIdentifier
token: p
element: <testLibraryFragment>::@docImportPrefix::p
scopeLibraries
package:test/a.dart
staticType: null
element: <testLibraryFragment>::@docImportPrefix::p
scopeLibraries
package:test/a.dart
''');
}
test_docImport_importPrefix_unqualified_shared() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
newFile('$testPackageLibPath/b.dart', r'''
class B {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'a.dart' as p;
/// @docImport 'b.dart' as p;
library;
/// [p]
// ^
// [diag.ambiguousCommentReferencePrefix] The prefix 'p' can't be used to reference a library, because it's used to import more than one library: 'package:test/a.dart' and 'package:test/b.dart'.
void f() {}
''');
nodeTextConfiguration.withImportPrefixScopeLibraries = true;
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@docImportPrefix::p
scopeLibraries
package:test/a.dart
package:test/b.dart
expression: SimpleIdentifier
token: p
element: <testLibraryFragment>::@docImportPrefix::p
scopeLibraries
package:test/a.dart
package:test/b.dart
staticType: null
element: <testLibraryFragment>::@docImportPrefix::p
scopeLibraries
package:test/a.dart
package:test/b.dart
''');
}
test_docImport_importPrefix_unqualified_shared_sameLibrary() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
class B {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'a.dart' as p show A;
/// @docImport 'a.dart' as p show B;
library;
/// [p]
void f() {}
''');
nodeTextConfiguration.withImportPrefixScopeLibraries = true;
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@docImportPrefix::p
scopeLibraries
package:test/a.dart
expression: SimpleIdentifier
token: p
element: <testLibraryFragment>::@docImportPrefix::p
scopeLibraries
package:test/a.dart
staticType: null
element: <testLibraryFragment>::@docImportPrefix::p
scopeLibraries
package:test/a.dart
''');
}
test_docImport_importPrefix_unqualified_shared_uriDoesNotExist() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'a.dart' as p;
/// @docImport 'b.dart' as p;
// ^^^^^^^^
// [diag.uriDoesNotExistInDocImport] Target of URI doesn't exist: 'b.dart'.
library;
/// [p]
void f() {}
''');
nodeTextConfiguration.withImportPrefixScopeLibraries = true;
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@docImportPrefix::p
scopeLibraries
package:test/a.dart
expression: SimpleIdentifier
token: p
element: <testLibraryFragment>::@docImportPrefix::p
scopeLibraries
package:test/a.dart
staticType: null
element: <testLibraryFragment>::@docImportPrefix::p
scopeLibraries
package:test/a.dart
''');
}
test_docImport_importPrefix_wildcard() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'a.dart' as _;
library;
/// [_] and [_.A].
void f() {}
''');
var node = result.findNode.comment('/// [_]');
assertResolvedNodeText(node, r'''
Comment
references
CommentReference
components
CommentReferenceComponent
name: _
element: <null>
expression: SimpleIdentifier
token: _
element: <null>
staticType: null
element: <null>
CommentReference
components
CommentReferenceComponent
name: _
element: <null>
CommentReferenceComponent
period: .
name: A
element: <null>
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: _
element: <null>
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: <null>
staticType: null
element: <null>
staticType: null
element: <null>
tokens
/// [_] and [_.A].
''');
}
test_docImport_newKeyword() async {
newFile('$testPackageLibPath/foo.dart', r'''
class A {
A();
A.named();
}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'foo.dart';
library;
/// [new A] or [new A.named]
main() {}
''');
var node = result.findNode.comment('[new A]');
assertResolvedNodeText(node, r'''
Comment
tokens
/// [new A] or [new A.named]
''');
}
test_docImport_onEnumValue_unqualified() async {
newFile('$testPackageLibPath/foo.dart', r'''
void foo() {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'foo.dart';
library;
enum E {
/// [foo].
one,
two;
}
''');
var node = result.findNode.commentReference('foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: package:test/foo.dart::@function::foo
expression: SimpleIdentifier
token: foo
element: package:test/foo.dart::@function::foo
staticType: null
element: package:test/foo.dart::@function::foo
''');
}
test_docImport_onExtensionType_unqualified() async {
newFile('$testPackageLibPath/foo.dart', r'''
void foo() {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'foo.dart';
library;
/// [foo].
extension type ET(int it) {}
''');
var node = result.findNode.commentReference('foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: package:test/foo.dart::@function::foo
expression: SimpleIdentifier
token: foo
element: package:test/foo.dart::@function::foo
staticType: null
element: package:test/foo.dart::@function::foo
''');
}
test_docImport_onField_unqualified() async {
newFile('$testPackageLibPath/foo.dart', r'''
class A {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'foo.dart';
library;
class C {
/// Text [A].
int x = 1;
}
''');
var node = result.findNode.commentReference('A]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: package:test/foo.dart::@class::A
expression: SimpleIdentifier
token: A
element: package:test/foo.dart::@class::A
staticType: null
element: package:test/foo.dart::@class::A
''');
}
test_docImport_onLibrary_multipleDirectives() async {
newFile('$testPackageLibPath/a.dart', 'class A {}');
newFile('$testPackageLibPath/b.dart', 'class B {}');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'a.dart';
library;
/// @docImport 'b.dart';
library;
// [diag.multipleLibraryDirectives][column 1][length 7] Only one library directive may be declared in a file.
/// [A] and [B].
void f() {}
''');
var node = result.findNode.comment('/// [A]');
assertResolvedNodeText(node, r'''
Comment
references
CommentReference
components
CommentReferenceComponent
name: A
element: package:test/a.dart::@class::A
expression: SimpleIdentifier
token: A
element: package:test/a.dart::@class::A
staticType: null
element: package:test/a.dart::@class::A
CommentReference
components
CommentReferenceComponent
name: B
element: <null>
expression: SimpleIdentifier
token: B
element: <null>
staticType: null
element: <null>
tokens
/// [A] and [B].
''');
}
test_docImport_onLibrary_unqualified() async {
newFile('$testPackageLibPath/foo.dart', r'''
class A {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'foo.dart';
///
/// Text [A].
library;
''');
var node = result.findNode.commentReference('A]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: package:test/foo.dart::@class::A
expression: SimpleIdentifier
token: A
element: package:test/foo.dart::@class::A
staticType: null
element: package:test/foo.dart::@class::A
''');
}
test_docImport_onTopLevelFunction_unqualified() async {
newFile('$testPackageLibPath/foo.dart', r'''
void foo() {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'foo.dart';
library;
/// [foo].
void f() {}
''');
var node = result.findNode.commentReference('foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: package:test/foo.dart::@function::foo
expression: SimpleIdentifier
token: foo
element: package:test/foo.dart::@function::foo
staticType: null
element: package:test/foo.dart::@function::foo
''');
}
test_docImport_onTopLevelVariable_unqualified() async {
newFile('$testPackageLibPath/foo.dart', r'''
class A {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'foo.dart';
library;
/// Text [A].
int x = 1;
''');
var node = result.findNode.commentReference('A]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: package:test/foo.dart::@class::A
expression: SimpleIdentifier
token: A
element: package:test/foo.dart::@class::A
staticType: null
element: package:test/foo.dart::@class::A
''');
}
test_docImport_onTypedef_unqualified() async {
newFile('$testPackageLibPath/foo.dart', r'''
void foo() {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
/// @docImport 'foo.dart';
library;
/// [foo].
typedef T = int;
''');
var node = result.findNode.commentReference('foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: package:test/foo.dart::@function::foo
expression: SimpleIdentifier
token: foo
element: package:test/foo.dart::@function::foo
staticType: null
element: package:test/foo.dart::@function::foo
''');
}
test_docImport_partOf_class_invalid_unresolved_unqualified_inLibrary() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
var part = getFile('$testPackageLibPath/part.dart');
var results = await resolveFilesWithDiagnostics({
testFile: r'''
part 'part.dart';
/// [A]
void f() {}
''',
part: r'''
/// @docImport 'a.dart';
part of 'test.dart';
''',
});
var node = results[testFile]!.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <null>
expression: SimpleIdentifier
token: A
element: <null>
staticType: null
element: <null>
''');
}
test_docImport_partOf_class_invalid_unresolved_unqualified_inSiblingPart() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
var part1 = getFile('$testPackageLibPath/part1.dart');
var part2 = getFile('$testPackageLibPath/part2.dart');
var results = await resolveFilesWithDiagnostics({
testFile: r'''
part 'part1.dart';
part 'part2.dart';
''',
part1: r'''
/// @docImport 'a.dart';
part of 'test.dart';
''',
part2: r'''
part of 'test.dart';
/// [A]
void f() {}
''',
});
var node = results[part2]!.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <null>
expression: SimpleIdentifier
token: A
element: <null>
staticType: null
element: <null>
''');
}
test_docImport_partOf_class_qualified_importPrefix_extendsLibraryDocImportPrefix() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
newFile('$testPackageLibPath/b.dart', r'''
class B {}
''');
var part = getFile('$testPackageLibPath/part.dart');
var results = await resolveFilesWithDiagnostics({
testFile: r'''
/// @docImport 'a.dart' as p;
library;
part 'part.dart';
/// [p.B]
void f() {}
''',
part: r'''
/// @docImport 'b.dart' as p;
part of 'test.dart';
/// [p.A] and [p.B].
void g() {}
''',
});
var node = results[part]!.findNode.comment('/// [p.A]');
assertResolvedNodeText(node, r'''
Comment
references
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibrary>::@fragment::package:test/part.dart::@docImportPrefix::p
CommentReferenceComponent
period: .
name: A
element: package:test/a.dart::@class::A
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibrary>::@fragment::package:test/part.dart::@docImportPrefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: package:test/a.dart::@class::A
staticType: null
element: package:test/a.dart::@class::A
staticType: null
element: package:test/a.dart::@class::A
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibrary>::@fragment::package:test/part.dart::@docImportPrefix::p
CommentReferenceComponent
period: .
name: B
element: package:test/b.dart::@class::B
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibrary>::@fragment::package:test/part.dart::@docImportPrefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: B
element: package:test/b.dart::@class::B
staticType: null
element: package:test/b.dart::@class::B
staticType: null
element: package:test/b.dart::@class::B
tokens
/// [p.A] and [p.B].
''');
node = results[testFile]!.findNode.comment('/// [p.B]');
assertResolvedNodeText(node, r'''
Comment
references
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@docImportPrefix::p
CommentReferenceComponent
period: .
name: B
element: <null>
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibraryFragment>::@docImportPrefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: B
element: <null>
staticType: null
element: <null>
staticType: null
element: <null>
tokens
/// [p.B]
''');
}
test_docImport_partOf_class_qualified_importPrefix_extendsLibraryDocImportPrefix_deferred() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
newFile('$testPackageLibPath/b.dart', r'''
class B {}
''');
var part = getFile('$testPackageLibPath/part.dart');
var results = await resolveFilesWithDiagnostics({
testFile: r'''
/// @docImport 'a.dart' deferred as p;
// ^^^^^^^^
// [diag.docImportCannotBeDeferred] Doc imports can't be deferred.
library;
part 'part.dart';
''',
part: r'''
/// @docImport 'b.dart' as p;
part of 'test.dart';
/// [p.A] and [p.B].
void g() {}
''',
});
var node = results[part]!.findNode.comment('/// [p.A]');
assertResolvedNodeText(node, r'''
Comment
references
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibrary>::@fragment::package:test/part.dart::@docImportPrefix::p
CommentReferenceComponent
period: .
name: A
element: <null>
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibrary>::@fragment::package:test/part.dart::@docImportPrefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: <null>
staticType: null
element: <null>
staticType: null
element: <null>
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibrary>::@fragment::package:test/part.dart::@docImportPrefix::p
CommentReferenceComponent
period: .
name: B
element: package:test/b.dart::@class::B
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibrary>::@fragment::package:test/part.dart::@docImportPrefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: B
element: package:test/b.dart::@class::B
staticType: null
element: package:test/b.dart::@class::B
staticType: null
element: package:test/b.dart::@class::B
tokens
/// [p.A] and [p.B].
''');
}
test_docImport_partOf_class_qualified_importPrefix_extendsLibraryDocImportPrefix_shadowedByNoPrefix_getter() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
newFile('$testPackageLibPath/c.dart', r'''
class C {}
''');
newFile('$testPackageLibPath/x.dart', r'''
int get p => 0;
''');
var subpart = getFile('$testPackageLibPath/subpart.dart');
var results = await resolveFilesWithDiagnostics({
testFile: r'''
/// @docImport 'a.dart' as p;
library;
part 'part.dart';
''',
getFile('$testPackageLibPath/part.dart'): r'''
/// @docImport 'x.dart';
part of 'test.dart';
part 'subpart.dart';
''',
subpart: r'''
/// @docImport 'c.dart' as p;
part of 'part.dart';
/// [p.A] and [p.C].
void g() {}
''',
});
var node = results[subpart]!.findNode.comment('/// [p.A]');
assertResolvedNodeText(node, r'''
Comment
references
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibrary>::@fragment::package:test/subpart.dart::@docImportPrefix::p
CommentReferenceComponent
period: .
name: A
element: <null>
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibrary>::@fragment::package:test/subpart.dart::@docImportPrefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: <null>
staticType: null
element: <null>
staticType: null
element: <null>
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibrary>::@fragment::package:test/subpart.dart::@docImportPrefix::p
CommentReferenceComponent
period: .
name: C
element: package:test/c.dart::@class::C
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibrary>::@fragment::package:test/subpart.dart::@docImportPrefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: C
element: package:test/c.dart::@class::C
staticType: null
element: package:test/c.dart::@class::C
staticType: null
element: package:test/c.dart::@class::C
tokens
/// [p.A] and [p.C].
''');
}
test_docImport_partOf_class_qualified_importPrefix_extendsLibraryDocImportPrefix_shadowedByNoPrefix_setter() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
newFile('$testPackageLibPath/c.dart', r'''
class C {}
''');
newFile('$testPackageLibPath/x.dart', r'''
set p(int _) {}
''');
var subpart = getFile('$testPackageLibPath/subpart.dart');
var results = await resolveFilesWithDiagnostics({
testFile: r'''
/// @docImport 'a.dart' as p;
library;
part 'part.dart';
''',
getFile('$testPackageLibPath/part.dart'): r'''
/// @docImport 'x.dart';
part of 'test.dart';
part 'subpart.dart';
''',
subpart: r'''
/// @docImport 'c.dart' as p;
part of 'part.dart';
/// [p.A] and [p.C].
void g() {}
''',
});
var node = results[subpart]!.findNode.comment('/// [p.A]');
assertResolvedNodeText(node, r'''
Comment
references
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibrary>::@fragment::package:test/subpart.dart::@docImportPrefix::p
CommentReferenceComponent
period: .
name: A
element: <null>
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibrary>::@fragment::package:test/subpart.dart::@docImportPrefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: <null>
staticType: null
element: <null>
staticType: null
element: <null>
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibrary>::@fragment::package:test/subpart.dart::@docImportPrefix::p
CommentReferenceComponent
period: .
name: C
element: package:test/c.dart::@class::C
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibrary>::@fragment::package:test/subpart.dart::@docImportPrefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: C
element: package:test/c.dart::@class::C
staticType: null
element: package:test/c.dart::@class::C
staticType: null
element: package:test/c.dart::@class::C
tokens
/// [p.A] and [p.C].
''');
}
test_docImport_partOf_class_qualified_importPrefix_extendsPartDocImportPrefix() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
newFile('$testPackageLibPath/b.dart', r'''
class B {}
''');
newFile('$testPackageLibPath/c.dart', r'''
class C {}
''');
var part = getFile('$testPackageLibPath/part.dart');
var subpart = getFile('$testPackageLibPath/subpart.dart');
var results = await resolveFilesWithDiagnostics({
testFile: r'''
/// @docImport 'a.dart' as p;
library;
part 'part.dart';
''',
part: r'''
/// @docImport 'b.dart' as p;
part of 'test.dart';
part 'subpart.dart';
/// [p.C]
void f() {}
''',
subpart: r'''
/// @docImport 'c.dart' as p;
part of 'part.dart';
/// [p.A] and [p.B] and [p.C].
void g() {}
''',
});
var node = results[subpart]!.findNode.comment('/// [p.A]');
assertResolvedNodeText(node, r'''
Comment
references
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibrary>::@fragment::package:test/subpart.dart::@docImportPrefix::p
CommentReferenceComponent
period: .
name: A
element: package:test/a.dart::@class::A
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibrary>::@fragment::package:test/subpart.dart::@docImportPrefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: package:test/a.dart::@class::A
staticType: null
element: package:test/a.dart::@class::A
staticType: null
element: package:test/a.dart::@class::A
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibrary>::@fragment::package:test/subpart.dart::@docImportPrefix::p
CommentReferenceComponent
period: .
name: B
element: package:test/b.dart::@class::B
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibrary>::@fragment::package:test/subpart.dart::@docImportPrefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: B
element: package:test/b.dart::@class::B
staticType: null
element: package:test/b.dart::@class::B
staticType: null
element: package:test/b.dart::@class::B
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibrary>::@fragment::package:test/subpart.dart::@docImportPrefix::p
CommentReferenceComponent
period: .
name: C
element: package:test/c.dart::@class::C
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibrary>::@fragment::package:test/subpart.dart::@docImportPrefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: C
element: package:test/c.dart::@class::C
staticType: null
element: package:test/c.dart::@class::C
staticType: null
element: package:test/c.dart::@class::C
tokens
/// [p.A] and [p.B] and [p.C].
''');
node = results[part]!.findNode.comment('/// [p.C]');
assertResolvedNodeText(node, r'''
Comment
references
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibrary>::@fragment::package:test/part.dart::@docImportPrefix::p
CommentReferenceComponent
period: .
name: C
element: <null>
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibrary>::@fragment::package:test/part.dart::@docImportPrefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: C
element: <null>
staticType: null
element: <null>
staticType: null
element: <null>
tokens
/// [p.C]
''');
}
test_docImport_partOf_class_qualified_importPrefix_extendsPartDocImportPrefix_shadowsNoPrefix() async {
newFile('$testPackageLibPath/b.dart', r'''
class B {}
''');
newFile('$testPackageLibPath/c.dart', r'''
class C {}
''');
newFile('$testPackageLibPath/x.dart', r'''
int get p => 0;
''');
var subpart = getFile('$testPackageLibPath/subpart.dart');
var results = await resolveFilesWithDiagnostics({
testFile: r'''
library;
part 'part.dart';
''',
getFile('$testPackageLibPath/part.dart'): r'''
/// @docImport 'x.dart';
/// @docImport 'b.dart' as p;
part of 'test.dart';
part 'subpart.dart';
''',
subpart: r'''
/// @docImport 'c.dart' as p;
part of 'part.dart';
/// [p.B] and [p.C].
void g() {}
''',
});
var node = results[subpart]!.findNode.comment('/// [p.B]');
assertResolvedNodeText(node, r'''
Comment
references
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibrary>::@fragment::package:test/subpart.dart::@docImportPrefix::p
CommentReferenceComponent
period: .
name: B
element: package:test/b.dart::@class::B
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibrary>::@fragment::package:test/subpart.dart::@docImportPrefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: B
element: package:test/b.dart::@class::B
staticType: null
element: package:test/b.dart::@class::B
staticType: null
element: package:test/b.dart::@class::B
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibrary>::@fragment::package:test/subpart.dart::@docImportPrefix::p
CommentReferenceComponent
period: .
name: C
element: package:test/c.dart::@class::C
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibrary>::@fragment::package:test/subpart.dart::@docImportPrefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: C
element: package:test/c.dart::@class::C
staticType: null
element: package:test/c.dart::@class::C
staticType: null
element: package:test/c.dart::@class::C
tokens
/// [p.B] and [p.C].
''');
}
test_docImport_partOf_class_qualified_importPrefix_shadowedByImport() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
newFile('$testPackageLibPath/b.dart', r'''
class B {}
''');
var part = getFile('$testPackageLibPath/part.dart');
var results = await resolveFilesWithDiagnostics({
testFile: r'''
import 'a.dart' as p;
part 'part.dart';
p.A? f() => null;
''',
part: r'''
/// @docImport 'b.dart' as p;
part of 'test.dart';
/// [p.B]
void g() {}
''',
});
var node = results[part]!.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@prefix::p
CommentReferenceComponent
period: .
name: B
element: <null>
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibraryFragment>::@prefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: B
element: <null>
staticType: null
element: <null>
staticType: null
element: <null>
''');
}
test_docImport_partOf_class_unqualified_beforeEnhancedParts() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
var part = getFile('$testPackageLibPath/part.dart');
var results = await resolveFilesWithDiagnostics({
testFile: r'''
// %before-language-feature: enhanced-parts
part 'part.dart';
''',
part: r'''
// %before-language-feature: enhanced-parts
/// @docImport 'a.dart';
// ^^^^^^^^
// [diag.docImportInPartFile] Doc imports in part files require the 'enhanced-parts' language feature.
part of 'test.dart';
/// [A]
void f() {}
''',
});
var node = results[part]!.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <null>
expression: SimpleIdentifier
token: A
element: <null>
staticType: null
element: <null>
''');
}
test_docImport_partOf_class_unqualified_importPreferredOverDocImport() async {
newFile('$testPackageLibPath/a1.dart', r'''
class A {}
''');
newFile('$testPackageLibPath/a2.dart', r'''
class A {}
''');
var part = getFile('$testPackageLibPath/part.dart');
var results = await resolveFilesWithDiagnostics({
testFile: r'''
part 'part.dart';
''',
part: r'''
/// @docImport 'a2.dart';
part of 'test.dart';
import 'a1.dart';
/// [A]
A? f() => null;
''',
});
var node = results[part]!.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: package:test/a1.dart::@class::A
expression: SimpleIdentifier
token: A
element: package:test/a1.dart::@class::A
staticType: null
element: package:test/a1.dart::@class::A
''');
}
test_docImport_partOf_class_unqualified_inSubpart() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
var part = getFile('$testPackageLibPath/part.dart');
var subpart = getFile('$testPackageLibPath/subpart.dart');
var results = await resolveFilesWithDiagnostics({
testFile: r'''
part 'part.dart';
''',
part: r'''
/// @docImport 'a.dart';
part of 'test.dart';
part 'subpart.dart';
''',
subpart: r'''
part of 'part.dart';
/// [A]
void f() {}
''',
});
var node = results[subpart]!.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: package:test/a.dart::@class::A
expression: SimpleIdentifier
token: A
element: package:test/a.dart::@class::A
staticType: null
element: package:test/a.dart::@class::A
''');
}
test_docImport_partOf_class_unqualified_shadowsLibraryDocImport() async {
newFile('$testPackageLibPath/a1.dart', r'''
class A {}
''');
newFile('$testPackageLibPath/a2.dart', r'''
class A {}
''');
var part = getFile('$testPackageLibPath/part.dart');
var results = await resolveFilesWithDiagnostics({
testFile: r'''
/// @docImport 'a1.dart';
library;
part 'part.dart';
/// [A]
void f() {}
''',
part: r'''
/// @docImport 'a2.dart';
part of 'test.dart';
/// [A]
void g() {}
''',
});
var node = results[part]!.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: package:test/a2.dart::@class::A
expression: SimpleIdentifier
token: A
element: package:test/a2.dart::@class::A
staticType: null
element: package:test/a2.dart::@class::A
''');
node = results[testFile]!.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: package:test/a1.dart::@class::A
expression: SimpleIdentifier
token: A
element: package:test/a1.dart::@class::A
staticType: null
element: package:test/a1.dart::@class::A
''');
}
test_docImport_partOf_class_unqualified_shadowsPartDocImport() async {
newFile('$testPackageLibPath/a1.dart', r'''
class A {}
''');
newFile('$testPackageLibPath/a2.dart', r'''
class A {}
''');
var part = getFile('$testPackageLibPath/part.dart');
var subpart = getFile('$testPackageLibPath/subpart.dart');
var results = await resolveFilesWithDiagnostics({
testFile: r'''
part 'part.dart';
''',
part: r'''
/// @docImport 'a1.dart';
part of 'test.dart';
part 'subpart.dart';
/// [A]
void f() {}
''',
subpart: r'''
/// @docImport 'a2.dart';
part of 'part.dart';
/// [A]
void g() {}
''',
});
var node = results[subpart]!.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: package:test/a2.dart::@class::A
expression: SimpleIdentifier
token: A
element: package:test/a2.dart::@class::A
staticType: null
element: package:test/a2.dart::@class::A
''');
node = results[part]!.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: package:test/a1.dart::@class::A
expression: SimpleIdentifier
token: A
element: package:test/a1.dart::@class::A
staticType: null
element: package:test/a1.dart::@class::A
''');
}
test_docImport_partOf_class_unqualified_withLibraryDocImport() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
newFile('$testPackageLibPath/b.dart', r'''
class B {}
''');
var part = getFile('$testPackageLibPath/part.dart');
var results = await resolveFilesWithDiagnostics({
testFile: r'''
/// @docImport 'a.dart';
library;
part 'part.dart';
''',
part: r'''
/// @docImport 'b.dart';
part of 'test.dart';
/// [A] and [B].
void f() {}
''',
});
var node = results[part]!.findNode.comment('/// [A]');
assertResolvedNodeText(node, r'''
Comment
references
CommentReference
components
CommentReferenceComponent
name: A
element: package:test/a.dart::@class::A
expression: SimpleIdentifier
token: A
element: package:test/a.dart::@class::A
staticType: null
element: package:test/a.dart::@class::A
CommentReference
components
CommentReferenceComponent
name: B
element: package:test/b.dart::@class::B
expression: SimpleIdentifier
token: B
element: package:test/b.dart::@class::B
staticType: null
element: package:test/b.dart::@class::B
tokens
/// [A] and [B].
''');
}
test_docImport_partOf_directive_importPrefix() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
var part = getFile('$testPackageLibPath/part.dart');
var results = await resolveFilesWithDiagnostics({
testFile: r'''
part 'part.dart';
''',
part: r'''
/// @docImport 'a.dart' as p;
part of 'test.dart';
''',
});
var node = results[part]!.findNode.comment('@docImport');
assertResolvedNodeText(node, r'''
Comment
tokens
/// @docImport 'a.dart' as p;
docImports
DocImport
offset: 4
import: ImportDirective
importKeyword: import
uri: SimpleStringLiteral
literal: 'a.dart'
asKeyword: as
prefixName: p
semicolon: ;
prefix: SimpleIdentifier
token: p
element: <testLibrary>::@fragment::package:test/part.dart::@docImportPrefix::p
staticType: null
libraryImport: LibraryImport
uri: DirectiveUriWithLibrary
uri: package:test/a.dart
''');
}
test_docImport_partOf_importPrefix_unqualified_extendsLibraryDocImportPrefix() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
newFile('$testPackageLibPath/b.dart', r'''
class B {}
''');
var part = getFile('$testPackageLibPath/part.dart');
var results = await resolveFilesWithDiagnostics({
testFile: r'''
/// @docImport 'a.dart' as p;
library;
part 'part.dart';
/// [p]
void f() {}
''',
part: r'''
/// @docImport 'b.dart' as p;
part of 'test.dart';
/// [p]
// ^
// [diag.ambiguousCommentReferencePrefix] The prefix 'p' can't be used to reference a library, because it's used to import more than one library: 'package:test/a.dart' and 'package:test/b.dart'.
void g() {}
''',
});
nodeTextConfiguration.withImportPrefixScopeLibraries = true;
var libraryNode = results[testFile]!.findNode.singleCommentReference;
assertResolvedNodeText(libraryNode, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@docImportPrefix::p
scopeLibraries
package:test/a.dart
expression: SimpleIdentifier
token: p
element: <testLibraryFragment>::@docImportPrefix::p
scopeLibraries
package:test/a.dart
staticType: null
element: <testLibraryFragment>::@docImportPrefix::p
scopeLibraries
package:test/a.dart
''');
var partNode = results[part]!.findNode.singleCommentReference;
assertResolvedNodeText(partNode, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibrary>::@fragment::package:test/part.dart::@docImportPrefix::p
scopeLibraries
package:test/b.dart
package:test/a.dart
expression: SimpleIdentifier
token: p
element: <testLibrary>::@fragment::package:test/part.dart::@docImportPrefix::p
scopeLibraries
package:test/b.dart
package:test/a.dart
staticType: null
element: <testLibrary>::@fragment::package:test/part.dart::@docImportPrefix::p
scopeLibraries
package:test/b.dart
package:test/a.dart
''');
}
test_enum_instanceGetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
enum E {
v;
int get foo => 0;
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@enum::E::@getter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@enum::E::@getter::foo
staticType: null
element: <testLibrary>::@enum::E::@getter::foo
''');
}
test_enum_instanceMethod_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
enum E {
v;
void foo() {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@enum::E::@method::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@enum::E::@method::foo
staticType: null
element: <testLibrary>::@enum::E::@method::foo
''');
}
test_enum_instanceSetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
enum E {
v;
set foo(int value) {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@enum::E::@setter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@enum::E::@setter::foo
staticType: null
element: <testLibrary>::@enum::E::@setter::foo
''');
}
test_enum_member_extensionGetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
enum E {
v;
/// [name]
void foo() {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: name
element: dart:core::@extension::EnumName::@getter::name
expression: SimpleIdentifier
token: name
element: dart:core::@extension::EnumName::@getter::name
staticType: null
element: dart:core::@extension::EnumName::@getter::name
''');
}
test_enum_staticGetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
enum E {
v;
static int get foo => 0;
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@enum::E::@getter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@enum::E::@getter::foo
staticType: null
element: <testLibrary>::@enum::E::@getter::foo
''');
}
test_enum_staticMethod_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
enum E {
v;
static void foo() {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@enum::E::@method::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@enum::E::@method::foo
staticType: null
element: <testLibrary>::@enum::E::@method::foo
''');
}
test_enum_staticSetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
enum E {
v;
static set foo(int value) {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@enum::E::@setter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@enum::E::@setter::foo
staticType: null
element: <testLibrary>::@enum::E::@setter::foo
''');
}
test_extension_extendedType_instanceGetter_qualified() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
int get foo => 0;
}
/// [A.foo]
extension E on A {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <testLibrary>::@class::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@class::A::@getter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: <testLibrary>::@class::A
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@getter::foo
staticType: null
element: <testLibrary>::@class::A::@getter::foo
staticType: null
element: <testLibrary>::@class::A::@getter::foo
''');
}
test_extension_extendedType_instanceGetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
int get foo => 0;
}
/// [foo]
extension E on A {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@class::A::@getter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@getter::foo
staticType: null
element: <testLibrary>::@class::A::@getter::foo
''');
}
test_extension_extendedTypeParameter_instanceGetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
int get foo => 0;
}
/// [foo]
extension E<T extends A> on T {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@class::A::@getter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@getter::foo
staticType: null
element: <testLibrary>::@class::A::@getter::foo
''');
}
test_extension_instanceGetter_qualified() async {
var result = await resolveTestCodeWithDiagnostics('''
extension E on int {
int get foo => 0;
}
/// [E.foo]
void f() {}
''');
var node = result.findNode.commentReference('E.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: E
element: <testLibrary>::@extension::E
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extension::E::@getter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: E
element: <testLibrary>::@extension::E
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@extension::E::@getter::foo
staticType: null
element: <testLibrary>::@extension::E::@getter::foo
staticType: null
element: <testLibrary>::@extension::E::@getter::foo
''');
}
test_extension_instanceGetter_qualified_importPrefix() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
extension E on int {
int get foo => 0;
}
/// [self.E.foo]
void f() {}
''');
var node = result.findNode.commentReference('foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: E
element: <testLibrary>::@extension::E
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extension::E::@getter::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: E
element: <testLibrary>::@extension::E
staticType: null
element: <testLibrary>::@extension::E
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@extension::E::@getter::foo
staticType: null
staticType: null
element: <testLibrary>::@extension::E::@getter::foo
''');
}
test_extension_instanceGetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
extension E on int {
int get foo => 0;
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@extension::E::@getter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@extension::E::@getter::foo
staticType: null
element: <testLibrary>::@extension::E::@getter::foo
''');
}
test_extension_instanceGetter_unqualified_preferredOverExtendedType() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
int get foo => 0;
}
/// [foo]
extension E on A {
int get foo => 0;
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@extension::E::@getter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@extension::E::@getter::foo
staticType: null
element: <testLibrary>::@extension::E::@getter::foo
''');
}
test_extension_instanceMethod_qualified() async {
var result = await resolveTestCodeWithDiagnostics('''
extension E on int {
void foo() {}
}
/// [E.foo]
void f() {}
''');
var node = result.findNode.commentReference('E.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: E
element: <testLibrary>::@extension::E
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extension::E::@method::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: E
element: <testLibrary>::@extension::E
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@extension::E::@method::foo
staticType: null
element: <testLibrary>::@extension::E::@method::foo
staticType: null
element: <testLibrary>::@extension::E::@method::foo
''');
}
test_extension_instanceMethod_qualified_importPrefix() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
extension E on int {
void foo() {}
}
/// [self.E.foo]
void f() {}
''');
var node = result.findNode.commentReference('E.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: E
element: <testLibrary>::@extension::E
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extension::E::@method::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: E
element: <testLibrary>::@extension::E
staticType: null
element: <testLibrary>::@extension::E
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@extension::E::@method::foo
staticType: null
staticType: null
element: <testLibrary>::@extension::E::@method::foo
''');
}
test_extension_instanceMethod_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
extension E on int {
void foo() {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@extension::E::@method::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@extension::E::@method::foo
staticType: null
element: <testLibrary>::@extension::E::@method::foo
''');
}
test_extension_instanceSetter_qualified() async {
var result = await resolveTestCodeWithDiagnostics('''
extension E on int {
set foo(int _) {}
}
/// [E.foo]
void f() {}
''');
var node = result.findNode.commentReference('E.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: E
element: <testLibrary>::@extension::E
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extension::E::@setter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: E
element: <testLibrary>::@extension::E
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@extension::E::@setter::foo
staticType: null
element: <testLibrary>::@extension::E::@setter::foo
staticType: null
element: <testLibrary>::@extension::E::@setter::foo
''');
}
test_extension_instanceSetter_qualified_importPrefix() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
extension E on int {
set foo(int value) {}
}
/// [self.E.foo]
void f() {}
''');
var node = result.findNode.commentReference('E.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: E
element: <testLibrary>::@extension::E
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extension::E::@setter::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: E
element: <testLibrary>::@extension::E
staticType: null
element: <testLibrary>::@extension::E
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@extension::E::@setter::foo
staticType: null
staticType: null
element: <testLibrary>::@extension::E::@setter::foo
''');
}
test_extension_instanceSetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
extension E on int {
set foo(int value) {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@extension::E::@setter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@extension::E::@setter::foo
staticType: null
element: <testLibrary>::@extension::E::@setter::foo
''');
}
test_extension_invalid_extendedFunctionType_instanceMethod_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [toString]
extension E on void Function() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: toString
element: <null>
expression: SimpleIdentifier
token: toString
element: <null>
staticType: null
element: <null>
''');
}
test_extension_member_extendedType_instanceGetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
int get foo => 0;
}
extension E on A {
/// [foo]
void bar() {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@class::A::@getter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@getter::foo
staticType: null
element: <testLibrary>::@class::A::@getter::foo
''');
}
test_extension_member_extendedTypeParameter_instanceGetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
int get foo => 0;
}
extension E<T extends A> on T {
/// [foo]
void bar() {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@class::A::@getter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@class::A::@getter::foo
staticType: null
element: <testLibrary>::@class::A::@getter::foo
''');
}
test_extension_staticGetter_qualified() async {
var result = await resolveTestCodeWithDiagnostics('''
extension E on int {
static int get foo => 0;
}
/// [E.foo]
void f() {}
''');
var node = result.findNode.commentReference('E.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: E
element: <testLibrary>::@extension::E
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extension::E::@getter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: E
element: <testLibrary>::@extension::E
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@extension::E::@getter::foo
staticType: null
element: <testLibrary>::@extension::E::@getter::foo
staticType: null
element: <testLibrary>::@extension::E::@getter::foo
''');
}
test_extension_staticGetter_qualified_importPrefix() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
extension E on int {
static int get foo => 0;
}
/// [self.E.foo]
void f() {}
''');
var node = result.findNode.commentReference('E.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: E
element: <testLibrary>::@extension::E
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extension::E::@getter::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: E
element: <testLibrary>::@extension::E
staticType: null
element: <testLibrary>::@extension::E
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@extension::E::@getter::foo
staticType: null
staticType: null
element: <testLibrary>::@extension::E::@getter::foo
''');
}
test_extension_staticGetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
extension E on int {
static int get foo => 0;
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@extension::E::@getter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@extension::E::@getter::foo
staticType: null
element: <testLibrary>::@extension::E::@getter::foo
''');
}
test_extension_staticMethod_qualified() async {
var result = await resolveTestCodeWithDiagnostics('''
extension E on int {
static void foo() {}
}
/// [E.foo]
void f() {}
''');
var node = result.findNode.commentReference('E.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: E
element: <testLibrary>::@extension::E
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extension::E::@method::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: E
element: <testLibrary>::@extension::E
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@extension::E::@method::foo
staticType: null
element: <testLibrary>::@extension::E::@method::foo
staticType: null
element: <testLibrary>::@extension::E::@method::foo
''');
}
test_extension_staticMethod_qualified_importPrefix() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
extension E on int {
static void foo() {}
}
/// [self.E.foo]
void f() {}
''');
var node = result.findNode.commentReference('E.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: E
element: <testLibrary>::@extension::E
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extension::E::@method::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: E
element: <testLibrary>::@extension::E
staticType: null
element: <testLibrary>::@extension::E
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@extension::E::@method::foo
staticType: null
staticType: null
element: <testLibrary>::@extension::E::@method::foo
''');
}
test_extension_staticMethod_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
extension E on int {
static void foo() {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@extension::E::@method::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@extension::E::@method::foo
staticType: null
element: <testLibrary>::@extension::E::@method::foo
''');
}
test_extension_staticSetter_qualified() async {
var result = await resolveTestCodeWithDiagnostics('''
extension E on int {
static set foo(int _) {}
}
/// [E.foo]
void f() {}
''');
var node = result.findNode.commentReference('E.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: E
element: <testLibrary>::@extension::E
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extension::E::@setter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: E
element: <testLibrary>::@extension::E
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@extension::E::@setter::foo
staticType: null
element: <testLibrary>::@extension::E::@setter::foo
staticType: null
element: <testLibrary>::@extension::E::@setter::foo
''');
}
test_extension_staticSetter_qualified_importPrefix() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
extension E on int {
static set foo(int value) {}
}
/// [self.E.foo]
void f() {}
''');
var node = result.findNode.commentReference('E.foo]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: E
element: <testLibrary>::@extension::E
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extension::E::@setter::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: E
element: <testLibrary>::@extension::E
staticType: null
element: <testLibrary>::@extension::E
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@extension::E::@setter::foo
staticType: null
staticType: null
element: <testLibrary>::@extension::E::@setter::foo
''');
}
test_extension_staticSetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
extension E on int {
static set foo(int value) {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@extension::E::@setter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@extension::E::@setter::foo
staticType: null
element: <testLibrary>::@extension::E::@setter::foo
''');
}
test_extensionType_constructor_named_qualified() async {
var result = await resolveTestCodeWithDiagnostics('''
extension type A(int it) {
A.named(this.it);
}
/// [A.named]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <testLibrary>::@extensionType::A
CommentReferenceComponent
period: .
name: named
element: <testLibrary>::@extensionType::A::@constructor::named
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: <testLibrary>::@extensionType::A
staticType: null
period: .
identifier: SimpleIdentifier
token: named
element: <testLibrary>::@extensionType::A::@constructor::named
staticType: null
element: <testLibrary>::@extensionType::A::@constructor::named
staticType: null
element: <testLibrary>::@extensionType::A::@constructor::named
''');
}
test_extensionType_constructor_named_qualified_importPrefix() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
extension type A(int it) {
A.named(this.it);
}
/// [self.A.named]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: A
element: <testLibrary>::@extensionType::A
CommentReferenceComponent
period: .
name: named
element: <testLibrary>::@extensionType::A::@constructor::named
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: <testLibrary>::@extensionType::A
staticType: null
element: <testLibrary>::@extensionType::A
staticType: null
operator: .
propertyName: SimpleIdentifier
token: named
element: <testLibrary>::@extensionType::A::@constructor::named
staticType: null
staticType: null
element: <testLibrary>::@extensionType::A::@constructor::named
''');
}
test_extensionType_constructor_unnamed_qualified() async {
var result = await resolveTestCodeWithDiagnostics('''
extension type A(int it) {}
/// [A.new]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <testLibrary>::@extensionType::A
CommentReferenceComponent
period: .
name: new
element: <testLibrary>::@extensionType::A::@constructor::new
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: <testLibrary>::@extensionType::A
staticType: null
period: .
identifier: SimpleIdentifier
token: new
element: <testLibrary>::@extensionType::A::@constructor::new
staticType: null
element: <testLibrary>::@extensionType::A::@constructor::new
staticType: null
element: <testLibrary>::@extensionType::A::@constructor::new
''');
}
test_extensionType_constructor_unnamed_qualified_importPrefix() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
extension type A(int it) {}
/// [self.A.new]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: A
element: <testLibrary>::@extensionType::A
CommentReferenceComponent
period: .
name: new
element: <testLibrary>::@extensionType::A::@constructor::new
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: <testLibrary>::@extensionType::A
staticType: null
element: <testLibrary>::@extensionType::A
staticType: null
operator: .
propertyName: SimpleIdentifier
token: new
element: <testLibrary>::@extensionType::A::@constructor::new
staticType: null
staticType: null
element: <testLibrary>::@extensionType::A::@constructor::new
''');
}
test_extensionType_instanceGetter_qualified() async {
var result = await resolveTestCodeWithDiagnostics('''
extension type A(int it) {
int get foo => 0;
}
/// [A.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <testLibrary>::@extensionType::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extensionType::A::@getter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: <testLibrary>::@extensionType::A
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@extensionType::A::@getter::foo
staticType: null
element: <testLibrary>::@extensionType::A::@getter::foo
staticType: null
element: <testLibrary>::@extensionType::A::@getter::foo
''');
}
test_extensionType_instanceGetter_qualified_importPrefix() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
extension type A(int it) {
int get foo => 0;
}
/// [self.A.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: A
element: <testLibrary>::@extensionType::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extensionType::A::@getter::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: <testLibrary>::@extensionType::A
staticType: null
element: <testLibrary>::@extensionType::A
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@extensionType::A::@getter::foo
staticType: null
staticType: null
element: <testLibrary>::@extensionType::A::@getter::foo
''');
}
test_extensionType_instanceGetter_qualified_importPrefix_onTypedef() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
extension type A(int it) {
int get foo => 0;
}
typedef B = A;
/// [self.B.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: B
element: <testLibrary>::@typeAlias::B
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extensionType::A::@getter::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: B
element: <testLibrary>::@typeAlias::B
staticType: null
element: <testLibrary>::@typeAlias::B
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@extensionType::A::@getter::foo
staticType: null
staticType: null
element: <testLibrary>::@extensionType::A::@getter::foo
''');
}
test_extensionType_instanceGetter_qualified_onTypedef() async {
var result = await resolveTestCodeWithDiagnostics('''
extension type A(int it) {
int get foo => 0;
}
typedef B = A;
/// [B.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: B
element: <testLibrary>::@typeAlias::B
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extensionType::A::@getter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: B
element: <testLibrary>::@typeAlias::B
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@extensionType::A::@getter::foo
staticType: null
element: <testLibrary>::@extensionType::A::@getter::foo
staticType: null
element: <testLibrary>::@extensionType::A::@getter::foo
''');
}
test_extensionType_instanceGetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
extension type A(int it) {
int get foo => 0;
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@extensionType::A::@getter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@extensionType::A::@getter::foo
staticType: null
element: <testLibrary>::@extensionType::A::@getter::foo
''');
}
test_extensionType_instanceMethod_qualified() async {
var result = await resolveTestCodeWithDiagnostics('''
extension type A(int it) {
void foo() {}
}
/// [A.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <testLibrary>::@extensionType::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extensionType::A::@method::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: <testLibrary>::@extensionType::A
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@extensionType::A::@method::foo
staticType: null
element: <testLibrary>::@extensionType::A::@method::foo
staticType: null
element: <testLibrary>::@extensionType::A::@method::foo
''');
}
test_extensionType_instanceMethod_qualified_importPrefix() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
extension type A(int it) {
void foo() {}
}
/// [self.A.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: A
element: <testLibrary>::@extensionType::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extensionType::A::@method::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: <testLibrary>::@extensionType::A
staticType: null
element: <testLibrary>::@extensionType::A
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@extensionType::A::@method::foo
staticType: null
staticType: null
element: <testLibrary>::@extensionType::A::@method::foo
''');
}
test_extensionType_instanceMethod_qualified_inherited() async {
var result = await resolveTestCodeWithDiagnostics('''
extension type A(int it) implements B {}
extension type B(int it) {
void foo() {}
}
/// [A.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <testLibrary>::@extensionType::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extensionType::B::@method::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: <testLibrary>::@extensionType::A
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@extensionType::B::@method::foo
staticType: null
element: <testLibrary>::@extensionType::B::@method::foo
staticType: null
element: <testLibrary>::@extensionType::B::@method::foo
''');
}
test_extensionType_instanceMethod_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
extension type A(int it) {
void foo() {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@extensionType::A::@method::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@extensionType::A::@method::foo
staticType: null
element: <testLibrary>::@extensionType::A::@method::foo
''');
}
test_extensionType_instanceSetter_qualified() async {
var result = await resolveTestCodeWithDiagnostics('''
extension type A(int it) {
set foo(int value) {}
}
/// [A.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <testLibrary>::@extensionType::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extensionType::A::@setter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: <testLibrary>::@extensionType::A
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@extensionType::A::@setter::foo
staticType: null
element: <testLibrary>::@extensionType::A::@setter::foo
staticType: null
element: <testLibrary>::@extensionType::A::@setter::foo
''');
}
test_extensionType_instanceSetter_qualified_importPrefix() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
extension type A(int it) {
set foo(int value) {}
}
/// [self.A.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: A
element: <testLibrary>::@extensionType::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extensionType::A::@setter::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: <testLibrary>::@extensionType::A
staticType: null
element: <testLibrary>::@extensionType::A
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@extensionType::A::@setter::foo
staticType: null
staticType: null
element: <testLibrary>::@extensionType::A::@setter::foo
''');
}
test_extensionType_instanceSetter_qualified_importPrefix_inherited() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as p;
extension type A(int it) {
set foo(int value) {}
}
extension type B(int it) implements A {}
/// [p.B.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@prefix::p
CommentReferenceComponent
period: .
name: B
element: <testLibrary>::@extensionType::B
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extensionType::A::@setter::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibraryFragment>::@prefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: B
element: <testLibrary>::@extensionType::B
staticType: null
element: <testLibrary>::@extensionType::B
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@extensionType::A::@setter::foo
staticType: null
staticType: null
element: <testLibrary>::@extensionType::A::@setter::foo
''');
}
test_extensionType_instanceSetter_qualified_inherited() async {
var result = await resolveTestCodeWithDiagnostics('''
extension type A(int it) {
set foo(int value) {}
}
extension type B(int it) implements A {}
/// [B.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: B
element: <testLibrary>::@extensionType::B
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extensionType::A::@setter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: B
element: <testLibrary>::@extensionType::B
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@extensionType::A::@setter::foo
staticType: null
element: <testLibrary>::@extensionType::A::@setter::foo
staticType: null
element: <testLibrary>::@extensionType::A::@setter::foo
''');
}
test_extensionType_instanceSetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
extension type A(int it) {
set foo(int value) {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@extensionType::A::@setter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@extensionType::A::@setter::foo
staticType: null
element: <testLibrary>::@extensionType::A::@setter::foo
''');
}
test_extensionType_qualified_importPrefix() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
extension type A(int it) {}
/// [self.A]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: A
element: <testLibrary>::@extensionType::A
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: <testLibrary>::@extensionType::A
staticType: null
element: <testLibrary>::@extensionType::A
staticType: null
element: <testLibrary>::@extensionType::A
''');
}
test_extensionType_representation_qualified() async {
var result = await resolveTestCodeWithDiagnostics('''
extension type A(int it) {}
/// [A.it]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <testLibrary>::@extensionType::A
CommentReferenceComponent
period: .
name: it
element: <testLibrary>::@extensionType::A::@getter::it
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: <testLibrary>::@extensionType::A
staticType: null
period: .
identifier: SimpleIdentifier
token: it
element: <testLibrary>::@extensionType::A::@getter::it
staticType: null
element: <testLibrary>::@extensionType::A::@getter::it
staticType: null
element: <testLibrary>::@extensionType::A::@getter::it
''');
}
test_extensionType_representation_qualified_importPrefix() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
extension type A(int it) {}
/// [self.A.it]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: A
element: <testLibrary>::@extensionType::A
CommentReferenceComponent
period: .
name: it
element: <testLibrary>::@extensionType::A::@getter::it
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: <testLibrary>::@extensionType::A
staticType: null
element: <testLibrary>::@extensionType::A
staticType: null
operator: .
propertyName: SimpleIdentifier
token: it
element: <testLibrary>::@extensionType::A::@getter::it
staticType: null
staticType: null
element: <testLibrary>::@extensionType::A::@getter::it
''');
}
test_extensionType_staticGetter_qualified() async {
var result = await resolveTestCodeWithDiagnostics('''
extension type A(int it) {
static int get foo => 0;
}
/// [A.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <testLibrary>::@extensionType::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extensionType::A::@getter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: <testLibrary>::@extensionType::A
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@extensionType::A::@getter::foo
staticType: null
element: <testLibrary>::@extensionType::A::@getter::foo
staticType: null
element: <testLibrary>::@extensionType::A::@getter::foo
''');
}
test_extensionType_staticGetter_qualified_importPrefix() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
extension type A(int it) {
static int get foo => 0;
}
/// [self.A.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: A
element: <testLibrary>::@extensionType::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extensionType::A::@getter::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: <testLibrary>::@extensionType::A
staticType: null
element: <testLibrary>::@extensionType::A
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@extensionType::A::@getter::foo
staticType: null
staticType: null
element: <testLibrary>::@extensionType::A::@getter::foo
''');
}
test_extensionType_staticGetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
extension type A(int it) {
static int get foo => 0;
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@extensionType::A::@getter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@extensionType::A::@getter::foo
staticType: null
element: <testLibrary>::@extensionType::A::@getter::foo
''');
}
test_extensionType_staticMethod_qualified() async {
var result = await resolveTestCodeWithDiagnostics('''
extension type A(int it) {
static void foo() {}
}
/// [A.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <testLibrary>::@extensionType::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extensionType::A::@method::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: <testLibrary>::@extensionType::A
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@extensionType::A::@method::foo
staticType: null
element: <testLibrary>::@extensionType::A::@method::foo
staticType: null
element: <testLibrary>::@extensionType::A::@method::foo
''');
}
test_extensionType_staticMethod_qualified_importPrefix() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
extension type A(int it) {
static void foo() {}
}
/// [self.A.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: A
element: <testLibrary>::@extensionType::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extensionType::A::@method::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: <testLibrary>::@extensionType::A
staticType: null
element: <testLibrary>::@extensionType::A
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@extensionType::A::@method::foo
staticType: null
staticType: null
element: <testLibrary>::@extensionType::A::@method::foo
''');
}
test_extensionType_staticMethod_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
extension type A(int it) {
static void foo() {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@extensionType::A::@method::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@extensionType::A::@method::foo
staticType: null
element: <testLibrary>::@extensionType::A::@method::foo
''');
}
test_extensionType_staticSetter_qualified() async {
var result = await resolveTestCodeWithDiagnostics('''
extension type A(int it) {
static set foo(int value) {}
}
/// [A.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <testLibrary>::@extensionType::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extensionType::A::@setter::foo
expression: PrefixedIdentifier
prefix: SimpleIdentifier
token: A
element: <testLibrary>::@extensionType::A
staticType: null
period: .
identifier: SimpleIdentifier
token: foo
element: <testLibrary>::@extensionType::A::@setter::foo
staticType: null
element: <testLibrary>::@extensionType::A::@setter::foo
staticType: null
element: <testLibrary>::@extensionType::A::@setter::foo
''');
}
test_extensionType_staticSetter_qualified_importPrefix() async {
var result = await resolveTestCodeWithDiagnostics('''
import '' as self;
extension type A(int it) {
static set foo(int value) {}
}
/// [self.A.foo]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: self
element: <testLibraryFragment>::@prefix::self
CommentReferenceComponent
period: .
name: A
element: <testLibrary>::@extensionType::A
CommentReferenceComponent
period: .
name: foo
element: <testLibrary>::@extensionType::A::@setter::foo
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: self
element: <testLibraryFragment>::@prefix::self
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: <testLibrary>::@extensionType::A
staticType: null
element: <testLibrary>::@extensionType::A
staticType: null
operator: .
propertyName: SimpleIdentifier
token: foo
element: <testLibrary>::@extensionType::A::@setter::foo
staticType: null
staticType: null
element: <testLibrary>::@extensionType::A::@setter::foo
''');
}
test_extensionType_staticSetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
extension type A(int it) {
static set foo(int value) {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@extensionType::A::@setter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@extensionType::A::@setter::foo
staticType: null
element: <testLibrary>::@extensionType::A::@setter::foo
''');
}
test_extensionType_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
extension type A(int it) {}
/// [A]
void f() {}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: A
element: <testLibrary>::@extensionType::A
expression: SimpleIdentifier
token: A
element: <testLibrary>::@extensionType::A
staticType: null
element: <testLibrary>::@extensionType::A
''');
}
test_importPrefix_unqualified() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
import 'a.dart' as p;
/// [p]
void f() {}
''');
nodeTextConfiguration.withImportPrefixScopeLibraries = true;
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@prefix::p
scopeLibraries
package:test/a.dart
expression: SimpleIdentifier
token: p
element: <testLibraryFragment>::@prefix::p
scopeLibraries
package:test/a.dart
staticType: null
element: <testLibraryFragment>::@prefix::p
scopeLibraries
package:test/a.dart
''');
}
test_importPrefix_unqualified_shared() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
newFile('$testPackageLibPath/b.dart', r'''
class B {}
''');
var result = await resolveTestCodeWithDiagnostics(r'''
import 'a.dart' as p;
import 'b.dart' as p;
/// [p]
// ^
// [diag.ambiguousCommentReferencePrefix] The prefix 'p' can't be used to reference a library, because it's used to import more than one library: 'package:test/a.dart' and 'package:test/b.dart'.
void f(p.A a, p.B b) {}
''');
nodeTextConfiguration.withImportPrefixScopeLibraries = true;
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@prefix::p
scopeLibraries
package:test/a.dart
package:test/b.dart
expression: SimpleIdentifier
token: p
element: <testLibraryFragment>::@prefix::p
scopeLibraries
package:test/a.dart
package:test/b.dart
staticType: null
element: <testLibraryFragment>::@prefix::p
scopeLibraries
package:test/a.dart
package:test/b.dart
''');
}
test_mixin_instanceGetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
mixin M {
int get foo => 0;
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@mixin::M::@getter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@mixin::M::@getter::foo
staticType: null
element: <testLibrary>::@mixin::M::@getter::foo
''');
}
test_mixin_instanceMethod_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
mixin M {
void foo() {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@mixin::M::@method::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@mixin::M::@method::foo
staticType: null
element: <testLibrary>::@mixin::M::@method::foo
''');
}
test_mixin_instanceSetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
mixin M {
set foo(int value) {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@mixin::M::@setter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@mixin::M::@setter::foo
staticType: null
element: <testLibrary>::@mixin::M::@setter::foo
''');
}
test_mixin_staticGetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
mixin M {
static int get foo => 0;
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@mixin::M::@getter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@mixin::M::@getter::foo
staticType: null
element: <testLibrary>::@mixin::M::@getter::foo
''');
}
test_mixin_staticMethod_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
mixin M {
static void foo() {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@mixin::M::@method::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@mixin::M::@method::foo
staticType: null
element: <testLibrary>::@mixin::M::@method::foo
''');
}
test_mixin_staticSetter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [foo]
mixin M {
static set foo(int value) {}
}
''');
var node = result.findNode.singleCommentReference;
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: foo
element: <testLibrary>::@mixin::M::@setter::foo
expression: SimpleIdentifier
token: foo
element: <testLibrary>::@mixin::M::@setter::foo
staticType: null
element: <testLibrary>::@mixin::M::@setter::foo
''');
}
test_newKeyword() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
A();
A.named();
}
/// [new A] or [new A.named]
main() {}
''');
var node = result.findNode.comment('[new A]');
assertResolvedNodeText(node, r'''
Comment
tokens
/// [new A] or [new A.named]
''');
}
test_newKeyword_missingConstructor() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
A.named();
}
/// [new A]
void f() {}
''');
var node = result.findNode.comment('[new A]');
assertResolvedNodeText(node, r'''
Comment
tokens
/// [new A]
''');
}
test_newKeyword_unresolved() async {
var result = await resolveTestCodeWithDiagnostics('''
/// [new Missing]
void f() {}
''');
var node = result.findNode.comment('[new Missing]');
assertResolvedNodeText(node, r'''
Comment
tokens
/// [new Missing]
''');
}
test_onFieldFormalParameter_unqualified() async {
// TODO(scheglov): add tests for references to nested formal parameters
var result = await resolveTestCodeWithDiagnostics(r'''
class A {
final int f;
A({
/// [int]
required this.f,
});
}
''');
var node = result.findNode.commentReference('int]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: int
element: dart:core::@class::int
expression: SimpleIdentifier
token: int
element: dart:core::@class::int
staticType: null
element: dart:core::@class::int
''');
}
test_onFunctionTypedFormalParameter_self_unqualified() async {
// TODO(scheglov): add tests for references to nested formal parameters
var result = await resolveTestCodeWithDiagnostics(r'''
/// [bar]
void f(int bar()) {}
''');
var node = result.findNode.commentReference('bar]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: bar
element: <testLibrary>::@function::f::@formalParameter::bar
expression: SimpleIdentifier
token: bar
element: <testLibrary>::@function::f::@formalParameter::bar
staticType: null
element: <testLibrary>::@function::f::@formalParameter::bar
''');
}
test_onFunctionTypedFormalParameter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics(r'''
void f(
/// [int]
void g(int a),
) {}
''');
var node = result.findNode.commentReference('int]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: int
element: dart:core::@class::int
expression: SimpleIdentifier
token: int
element: dart:core::@class::int
staticType: null
element: dart:core::@class::int
''');
}
test_onSimpleFormalParameter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics(r'''
void f(
/// [int]
int x,
) {}
''');
var node = result.findNode.commentReference('int]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: int
element: dart:core::@class::int
expression: SimpleIdentifier
token: int
element: dart:core::@class::int
staticType: null
element: dart:core::@class::int
''');
}
test_onSuperFormalParameter_unqualified() async {
// TODO(scheglov): add tests for references to nested formal parameters
var result = await resolveTestCodeWithDiagnostics(r'''
class A {
A({required int f});
}
class B extends A {
B({
/// [int]
required super.f,
});
}
''');
var node = result.findNode.commentReference('int]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: int
element: dart:core::@class::int
expression: SimpleIdentifier
token: int
element: dart:core::@class::int
staticType: null
element: dart:core::@class::int
''');
}
test_operator_qualified_importPrefix() async {
newFile('$testPackageLibPath/a.dart', '''
class A {
A operator +(A other) => this;
}
''');
var result = await resolveTestCodeWithDiagnostics('''
import 'a.dart' as p;
/// [p.A.operator +]
void f() {}
''');
var node = result.findNode.commentReference('p.A.operator +]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@prefix::p
CommentReferenceComponent
period: .
name: A
element: package:test/a.dart::@class::A
CommentReferenceComponent
period: .
operatorKeyword: operator
name: +
element: package:test/a.dart::@class::A::@method::+
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibraryFragment>::@prefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: package:test/a.dart::@class::A
staticType: null
element: package:test/a.dart::@class::A
staticType: null
operator: .
propertyName: SimpleIdentifier
token: +
element: package:test/a.dart::@class::A::@method::+
staticType: null
staticType: null
element: package:test/a.dart::@class::A::@method::+
''');
}
test_operator_unqualified() async {
var result = await resolveTestCodeWithDiagnostics('''
class A {
/// [operator +] and [+]
A operator +(A other) => this;
}
''');
var node = result.findNode.commentReference('operator +]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
operatorKeyword: operator
name: +
element: <testLibrary>::@class::A::@method::+
expression: SimpleIdentifier
token: +
element: <testLibrary>::@class::A::@method::+
staticType: null
element: <testLibrary>::@class::A::@method::+
''');
var bare = result.findNode.commentReference('+]\n');
assertResolvedNodeText(bare, r'''
CommentReference
components
CommentReferenceComponent
name: +
element: <testLibrary>::@class::A::@method::+
expression: SimpleIdentifier
token: +
element: <testLibrary>::@class::A::@method::+
staticType: null
element: <testLibrary>::@class::A::@method::+
''');
}
test_partialResolution_qualified_importPrefix() async {
newFile('$testPackageLibPath/a.dart', 'class A {}');
var result = await resolveTestCodeWithDiagnostics('''
import 'a.dart' as p;
/// [p.A.missing]
void f() {}
''');
var node = result.findNode.commentReference('p.A.missing]');
assertResolvedNodeText(node, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@prefix::p
CommentReferenceComponent
period: .
name: A
element: package:test/a.dart::@class::A
CommentReferenceComponent
period: .
name: missing
element: <null>
expression: PropertyAccess
target: PrefixedIdentifier
prefix: SimpleIdentifier
token: p
element: <testLibraryFragment>::@prefix::p
staticType: null
period: .
identifier: SimpleIdentifier
token: A
element: package:test/a.dart::@class::A
staticType: null
element: package:test/a.dart::@class::A
staticType: null
operator: .
propertyName: SimpleIdentifier
token: missing
element: <null>
staticType: null
staticType: null
element: <null>
''');
}
test_partOf_importPrefix_unqualified_deferred() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
newFile('$testPackageLibPath/b.dart', r'''
class B {}
''');
var part = getFile('$testPackageLibPath/part.dart');
var results = await resolveFilesWithDiagnostics({
testFile: r'''
import 'a.dart' as p;
part 'part.dart';
/// [p]
void f(p.A a) {}
''',
part: r'''
part of 'test.dart';
import 'b.dart' deferred as p;
/// [p]
void g() {}
''',
});
nodeTextConfiguration.withImportPrefixScopeLibraries = true;
var libraryNode = results[testFile]!.findNode.singleCommentReference;
assertResolvedNodeText(libraryNode, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@prefix::p
scopeLibraries
package:test/a.dart
expression: SimpleIdentifier
token: p
element: <testLibraryFragment>::@prefix::p
scopeLibraries
package:test/a.dart
staticType: null
element: <testLibraryFragment>::@prefix::p
scopeLibraries
package:test/a.dart
''');
var partNode = results[part]!.findNode.singleCommentReference;
assertResolvedNodeText(partNode, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibrary>::@fragment::package:test/part.dart::@prefix::p
scopeLibraries
package:test/b.dart
expression: SimpleIdentifier
token: p
element: <testLibrary>::@fragment::package:test/part.dart::@prefix::p
scopeLibraries
package:test/b.dart
staticType: null
element: <testLibrary>::@fragment::package:test/part.dart::@prefix::p
scopeLibraries
package:test/b.dart
''');
}
test_partOf_importPrefix_unqualified_extendsLibraryImportPrefix() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {}
''');
newFile('$testPackageLibPath/b.dart', r'''
class B {}
''');
var part = getFile('$testPackageLibPath/part.dart');
var results = await resolveFilesWithDiagnostics({
testFile: r'''
import 'a.dart' as p;
part 'part.dart';
/// [p]
void f(p.A a) {}
''',
part: r'''
part of 'test.dart';
import 'b.dart' as p;
/// [p]
// ^
// [diag.ambiguousCommentReferencePrefix] The prefix 'p' can't be used to reference a library, because it's used to import more than one library: 'package:test/a.dart' and 'package:test/b.dart'.
void g(p.B b) {}
''',
});
nodeTextConfiguration.withImportPrefixScopeLibraries = true;
var libraryNode = results[testFile]!.findNode.singleCommentReference;
assertResolvedNodeText(libraryNode, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibraryFragment>::@prefix::p
scopeLibraries
package:test/a.dart
expression: SimpleIdentifier
token: p
element: <testLibraryFragment>::@prefix::p
scopeLibraries
package:test/a.dart
staticType: null
element: <testLibraryFragment>::@prefix::p
scopeLibraries
package:test/a.dart
''');
var partNode = results[part]!.findNode.singleCommentReference;
assertResolvedNodeText(partNode, r'''
CommentReference
components
CommentReferenceComponent
name: p
element: <testLibrary>::@fragment::package:test/part.dart::@prefix::p
scopeLibraries
package:test/b.dart
package:test/a.dart
expression: SimpleIdentifier
token: p
element: <testLibrary>::@fragment::package:test/part.dart::@prefix::p
scopeLibraries
package:test/b.dart
package:test/a.dart
staticType: null
element: <testLibrary>::@fragment::package:test/part.dart::@prefix::p
scopeLibraries
package:test/b.dart
package:test/a.dart
''');
}
test_setter_unqualified() async {
var result = await resolveTestCodeWithDiagnostics(r'''
class A {
/// [x] in A
mA() {}
set x(value) {}
}
class B extends A {
/// [x] in B
mB() {}
}
''');
var node1 = result.findNode.commentReference('x] in A');
assertResolvedNodeText(node1, r'''
CommentReference
components
CommentReferenceComponent
name: x
element: <testLibrary>::@class::A::@setter::x
expression: SimpleIdentifier
token: x
element: <testLibrary>::@class::A::@setter::x
staticType: null
element: <testLibrary>::@class::A::@setter::x
''');
var node2 = result.findNode.commentReference('x] in B');
assertResolvedNodeText(node2, r'''
CommentReference
components
CommentReferenceComponent
name: x
element: <testLibrary>::@class::A::@setter::x
expression: SimpleIdentifier
token: x
element: <testLibrary>::@class::A::@setter::x
staticType: null
element: <testLibrary>::@class::A::@setter::x
''');
}
}