diff --git a/lib/src/markdown_processor.dart b/lib/src/markdown_processor.dart index e753506930..ec35bc1f48 100644 --- a/lib/src/markdown_processor.dart +++ b/lib/src/markdown_processor.dart @@ -744,10 +744,14 @@ class _MarkdownCommentReference { // [thing], a member of this class _addCanonicalResult(modelElement, tryClass); } - membersToCheck = (c.allModelElementsByNamePart[codeRefChompedParts.last] ?? - []) - .map(_convertConstructors); - membersToCheck.forEach((m) => _addCanonicalResult(m, tryClass)); + if (codeRefChompedParts.length < 2 || + codeRefChompedParts[codeRefChompedParts.length - 2] == c.name) { + membersToCheck = + (c.allModelElementsByNamePart[codeRefChompedParts.last] ?? + []) + .map(_convertConstructors); + membersToCheck.forEach((m) => _addCanonicalResult(m, tryClass)); + } results.remove(null); if (results.isNotEmpty) return; if (c.fullyQualifiedNameWithoutLibrary == codeRefChomped) { diff --git a/test/model_test.dart b/test/model_test.dart index 30b0c51d0a..a2fde98d31 100644 --- a/test/model_test.dart +++ b/test/model_test.dart @@ -1389,6 +1389,23 @@ void main() { }); group('Class edge cases', () { + test('Factories from unrelated classes are linked correctly', () { + Class A = packageGraph.localPublicLibraries + .firstWhere((l) => l.name == 'unrelated_factories') + .allClasses + .firstWhere((c) => c.name == 'A'); + Constructor fromMap = + A.constructors.firstWhere((c) => c.name == 'A.fromMap'); + expect(fromMap.documentationAsHtml, + contains(r'unrelated_factories/AB/AB.fromMap.html">AB.fromMap')); + expect(fromMap.documentationAsHtml, + contains(r'A/A.fromMap.html">fromMap')); + expect(fromMap.documentationAsHtml, + contains(r'unrelated_factories/AB-class.html">AB')); + expect(fromMap.documentationAsHtml, + contains(r'unrelated_factories/A-class.html">A')); + }); + test('Inherit from private class across private library to public library', () { Class GadgetExtender = packageGraph.localPublicLibraries diff --git a/test/src/utils.dart b/test/src/utils.dart index 4b00313d54..18c44d8a14 100644 --- a/test/src/utils.dart +++ b/test/src/utils.dart @@ -17,7 +17,7 @@ import 'package:path/path.dart' as path; /// The number of public libraries in testing/test_package, minus 2 for /// the excluded libraries listed in the initializers for _testPackageGraphMemo /// and minus 1 for the tag in the 'excluded' library. -const int kTestPackagePublicLibraries = 16; +const int kTestPackagePublicLibraries = 17; final RegExp quotables = RegExp(r'[ "\r\n\$]'); final RegExp observatoryPortRegexp = diff --git a/testing/test_package/lib/unrelated_factories.dart b/testing/test_package/lib/unrelated_factories.dart new file mode 100644 index 0000000000..d28a1591b6 --- /dev/null +++ b/testing/test_package/lib/unrelated_factories.dart @@ -0,0 +1,12 @@ +class A { + /// A link to [AB.fromMap], [fromMap], and [AB] and [A]. + factory A.fromMap(Map map) => A._A(); + + A._A(); +} + +class AB { + factory AB.fromMap(Map map) => AB._AB(); + + AB._AB(); +} \ No newline at end of file