Fix links to overriden methods in docs for base class (#1998)

* Fix links to overriden methods in docs for base class

* fix spelling, format test code
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 487bc36..bc10a77 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,6 @@
 ## 0.28.5-dev
 * Support the latest version of `package:analyzer`.
+* Fix hyperlinks to overriden methods (#1994).
 
 ## 0.28.4
 * **Breaking change** Change the default for `allow-tools` command line flag to false.
diff --git a/lib/src/markdown_processor.dart b/lib/src/markdown_processor.dart
index 1d0b4bd..90a4a80 100644
--- a/lib/src/markdown_processor.dart
+++ b/lib/src/markdown_processor.dart
@@ -647,6 +647,10 @@
 
     for (Class tryClass in tryClasses) {
       if (tryClass != null) {
+        if (codeRefChomped.contains('.') &&
+            !codeRefChomped.startsWith(tryClass.name)) {
+          continue;
+        }
         _getResultsForClass(tryClass);
       }
       results.remove(null);
diff --git a/test/dartdoc_test.dart b/test/dartdoc_test.dart
index f49f5b1..29779a0 100644
--- a/test/dartdoc_test.dart
+++ b/test/dartdoc_test.dart
@@ -100,7 +100,8 @@
     });
 
     test('errors generate errors even when warnings are off', () async {
-      Dartdoc dartdoc = await buildDartdoc(['--allow-tools'], testPackageToolError, tempDir);
+      Dartdoc dartdoc =
+          await buildDartdoc(['--allow-tools'], testPackageToolError, tempDir);
       DartdocResults results = await dartdoc.generateDocsBase();
       PackageGraph p = results.packageGraph;
       Iterable<String> unresolvedToolErrors = p
@@ -258,7 +259,7 @@
         expect(p.name, 'test_package');
         expect(p.hasDocumentationFile, isTrue);
         // Total number of public libraries in test_package.
-        expect(packageGraph.defaultPackage.publicLibraries, hasLength(12));
+        expect(packageGraph.defaultPackage.publicLibraries, hasLength(14));
         expect(packageGraph.localPackages.length, equals(1));
       });
 
@@ -327,7 +328,7 @@
       PackageGraph p = results.packageGraph;
       expect(p.defaultPackage.name, 'test_package');
       expect(p.defaultPackage.hasDocumentationFile, isTrue);
-      expect(p.localPublicLibraries, hasLength(11));
+      expect(p.localPublicLibraries, hasLength(13));
       expect(p.localPublicLibraries.map((lib) => lib.name).contains('fake'),
           isFalse);
     });
diff --git a/test/model_test.dart b/test/model_test.dart
index b186657..9fcfb68 100644
--- a/test/model_test.dart
+++ b/test/model_test.dart
@@ -61,6 +61,7 @@
   Library errorLibrary;
   Library twoExportsLib;
   Library interceptorsLib;
+  Library baseClassLib;
   PackageGraph sdkAsPackageGraph;
   Library dartAsync;
 
@@ -82,6 +83,8 @@
         packageGraph.libraries.firstWhere((lib) => lib.name == 'two_exports');
     interceptorsLib = packageGraph.libraries
         .firstWhere((lib) => lib.name == 'dart:_interceptors');
+    baseClassLib =
+        packageGraph.libraries.firstWhere((lib) => lib.name == 'base_class');
     sdkAsPackageGraph = utils.testPackageGraphSdk;
   });
 
@@ -492,7 +495,7 @@
       expect(
           packageGraph
               .localPackages.first.defaultCategory.publicLibraries.length,
-          equals(5));
+          equals(7));
     });
 
     test('Verify libraries with multiple categories show up in multiple places',
@@ -516,7 +519,7 @@
       expect(
           packageGraph
               .localPackages.first.defaultCategory.publicLibraries.length,
-          equals(5));
+          equals(7));
     });
   });
 
@@ -588,7 +591,7 @@
       });
 
       test('libraries', () {
-        expect(packageGraph.localPublicLibraries, hasLength(10));
+        expect(packageGraph.localPublicLibraries, hasLength(12));
         expect(interceptorsLib.isPublic, isFalse);
       });
 
@@ -603,7 +606,7 @@
 
         Package package = packageGraph.localPackages.first;
         expect(package.name, 'test_package');
-        expect(package.publicLibraries, hasLength(10));
+        expect(package.publicLibraries, hasLength(12));
       });
 
       test('multiple packages, sorted default', () {
@@ -1432,6 +1435,15 @@
             contains('<a href="ex/B-class.html">ex.B</a>'));
       });
 
+      test('link to override method in implementer from base class', () {
+        final Class helperClass =
+            baseClassLib.classes.firstWhere((c) => c.name == 'Constraints');
+        expect(
+            helperClass.documentationAsHtml,
+            contains(
+                '<a href="override_class/BoxConstraints/debugAssertIsValid.html">BoxConstraints.debugAssertIsValid</a>'));
+      });
+
       test(
           'link to a name of a class from an imported library that exports the name',
           () {
diff --git a/testing/test_package/lib/base_class.dart b/testing/test_package/lib/base_class.dart
new file mode 100644
index 0000000..d35825e
--- /dev/null
+++ b/testing/test_package/lib/base_class.dart
@@ -0,0 +1,20 @@
+library base_class;
+
+/// Abstract class Constraints
+/// * The [debugAssertIsValid] method, which should assert if there's anything
+///   wrong with the constraints object. (We use this approach rather than
+///   asserting in constructors so that our constructors can be `const` and so
+///   that it is possible to create invalid constraints temporarily while
+///   building valid ones.) See the implementation of
+///   [BoxConstraints.debugAssertIsValid] for an example of the detailed checks
+///   that can be made.
+abstract class Constraints {
+  /// Abstract const constructor. This constructor enables subclasses to provide
+  /// const constructors so that they can be used in const expressions.
+  const Constraints();
+
+  /// Method is overriden in implementations.
+  bool debugAssertIsValid() {
+    return true;
+  }
+}
diff --git a/testing/test_package/lib/override_class.dart b/testing/test_package/lib/override_class.dart
new file mode 100644
index 0000000..3e0bee6
--- /dev/null
+++ b/testing/test_package/lib/override_class.dart
@@ -0,0 +1,12 @@
+import 'base_class.dart';
+
+class BoxConstraints extends Constraints {
+  /// Creates box constraints with the given constraints.
+  const BoxConstraints();
+
+  /// Overrides the method in the superclass.
+  @override
+  bool debugAssertIsValid() {
+    return false;
+  }
+}