Skip to content

Commit f361206

Browse files
committed
Fix issue with extension members and unfound doc comment references
1 parent 6a02ffb commit f361206

File tree

5 files changed

+29
-10
lines changed

5 files changed

+29
-10
lines changed

lib/src/model/comment_referable.dart

+6-4
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,12 @@ mixin CommentReferable implements Nameable {
104104
if (resultElement == null) return null;
105105
}
106106

107-
if (this case ModelElement(:var modelNode?) when resultElement == null) {
108-
var references = modelNode.commentData?.references;
109-
if (references != null) {
110-
resultElement = references[referenceLookup.lookup]?.element;
107+
if (resultElement == null) {
108+
if (this case ModelElement(:var modelNode?)) {
109+
var references = modelNode.commentData?.references;
110+
if (references != null) {
111+
resultElement = references[referenceLookup.lookup]?.element;
112+
}
111113
}
112114
}
113115

lib/src/model/container_member.dart

+5-2
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ mixin ContainerMember on ModelElement {
6161
// Until then, just pretend we're handling this correctly.
6262
[
6363
(documentationFrom.first as ModelElement).definingLibrary,
64-
(packageGraph.findCanonicalModelElementFor(this) ?? this).library,
65-
];
64+
if (this case Field(:var getter, :var setter))
65+
packageGraph.findCanonicalModelElementFor(getter ?? setter)?.library
66+
else
67+
(packageGraph.findCanonicalModelElementFor(this) ?? this).library,
68+
].nonNulls.toList();
6669
}

lib/src/model/model_element.dart

+1-3
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,6 @@ abstract class ModelElement
234234
originalMember: originalMember,
235235
);
236236

237-
if (enclosingContainer != null) assert(newModelElement is Inheritable);
238237
_cacheNewModelElement(e, newModelElement, library,
239238
enclosingContainer: enclosingContainer);
240239

@@ -324,11 +323,10 @@ abstract class ModelElement
324323
if (e.enclosingElement is ExtensionElement ||
325324
e.enclosingElement is InterfaceElement ||
326325
e is MultiplyInheritedExecutableElement) {
327-
if (enclosingContainer == null) {
326+
if (enclosingContainer == null || enclosingContainer is Extension) {
328327
return ContainerAccessor(e, library, packageGraph);
329328
}
330329

331-
assert(e.enclosingElement is! ExtensionElement);
332330
return ContainerAccessor.inherited(
333331
e, library, packageGraph, enclosingContainer,
334332
originalMember: originalMember as ExecutableMember?);

lib/src/model/package_graph.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -769,7 +769,7 @@ class PackageGraph with CommentReferable, Nameable {
769769
// TODO(keertip): Find a better way to exclude members of extensions
770770
// when libraries are specified using the "--include" flag.
771771
if (lib != null && lib.isDocumented) {
772-
return getModelFor(element, lib);
772+
return getModelFor(element, lib, enclosingContainer: preferredClass);
773773
}
774774
}
775775
// TODO(jcollins-g): The data structures should be changed to eliminate

test/extensions_test.dart

+16
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,22 @@ var f() {}
3737
);
3838
}
3939

40+
void test_referenceToMissingElement_onExtensionMember() async {
41+
var library = await bootPackageWithLibrary('''
42+
extension E on int {
43+
/// Text [NotFound] text.
44+
int get f => 7;
45+
}
46+
''');
47+
48+
// We are primarily testing that dartdoc does not crash when trying to
49+
// resolve an unknown reference, from the position of an extension member.
50+
expect(
51+
library.extensions.first.instanceFields.first.documentationAsHtml,
52+
contains('<p>Text <code>NotFound</code> text.</p>'),
53+
);
54+
}
55+
4056
void test_referenceToExtensionMethod() async {
4157
var library = await bootPackageWithLibrary('''
4258
extension Ex on int {

0 commit comments

Comments
 (0)