Support the Never type in dartdoc (#2167)

diff --git a/lib/src/element_type.dart b/lib/src/element_type.dart
index f8118c7..bd39048 100644
--- a/lib/src/element_type.dart
+++ b/lib/src/element_type.dart
@@ -28,7 +28,9 @@
   factory ElementType.from(
       DartType f, Library library, PackageGraph packageGraph,
       [ElementType returnedFrom]) {
-    if (f.element == null || f.element.kind == ElementKind.DYNAMIC) {
+    if (f.element == null ||
+        f.element.kind == ElementKind.DYNAMIC ||
+        f.element.kind == ElementKind.NEVER) {
       if (f is FunctionType) {
         return FunctionTypeElementType(f, library, packageGraph, returnedFrom);
       }
diff --git a/lib/src/model/model.dart b/lib/src/model/model.dart
index 1de8844..c9138b5 100644
--- a/lib/src/model/model.dart
+++ b/lib/src/model/model.dart
@@ -30,6 +30,7 @@
 export 'model_function.dart';
 export 'model_node.dart';
 export 'nameable.dart';
+export 'never.dart';
 export 'operator.dart';
 export 'package.dart';
 export 'package_builder.dart';
diff --git a/lib/src/model/model_element.dart b/lib/src/model/model_element.dart
index 1f009bb..6852ab6 100644
--- a/lib/src/model/model_element.dart
+++ b/lib/src/model/model_element.dart
@@ -202,7 +202,8 @@
         e is ParameterElement ||
         e is TypeParameterElement ||
         e is GenericFunctionTypeElementImpl ||
-        e.kind == ElementKind.DYNAMIC);
+        e.kind == ElementKind.DYNAMIC ||
+        e.kind == ElementKind.NEVER);
 
     Member originalMember;
     // TODO(jcollins-g): Refactor object model to instantiate 'ModelMembers'
@@ -215,6 +216,7 @@
         Tuple3(e, library, enclosingContainer);
     ModelElement newModelElement;
     if (e.kind != ElementKind.DYNAMIC &&
+        e.kind != ElementKind.NEVER &&
         packageGraph.allConstructedModelElements.containsKey(key)) {
       newModelElement = packageGraph.allConstructedModelElements[key];
       assert(newModelElement.element is! MultiplyInheritedExecutableElement);
@@ -222,6 +224,9 @@
       if (e.kind == ElementKind.DYNAMIC) {
         newModelElement = Dynamic(e, packageGraph);
       }
+      if (e.kind == ElementKind.NEVER) {
+        newModelElement = NeverType(e, packageGraph);
+      }
       if (e is MultiplyInheritedExecutableElement) {
         newModelElement = resolveMultiplyInheritedElement(
             e, library, packageGraph, enclosingContainer);
@@ -1120,6 +1125,7 @@
     // element associated with a ModelElement or there's an analysis bug.
     assert(name.isNotEmpty ||
         this.element?.kind == ElementKind.DYNAMIC ||
+        this.element?.kind == ElementKind.NEVER ||
         this is ModelFunction);
 
     if (href == null) {
diff --git a/lib/src/model/never.dart b/lib/src/model/never.dart
new file mode 100644
index 0000000..5d25296
--- /dev/null
+++ b/lib/src/model/never.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2020, 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:analyzer/dart/element/element.dart';
+import 'package:dartdoc/src/model/model.dart';
+
+class NeverType extends ModelElement {
+  NeverType(Element element, PackageGraph packageGraph)
+      : super(element, null, packageGraph, null);
+
+  /// [never] is not a real object, and so we can't document it, so there
+  /// can be nothing canonical for it.
+  @override
+  ModelElement get canonicalModelElement => null;
+
+  @override
+  ModelElement get enclosingElement => throw UnsupportedError('');
+
+  /// And similiarly, even if someone references it directly it can have
+  /// no hyperlink.
+  @override
+  String get href => null;
+
+  @override
+  String get kind => 'Never';
+
+  @override
+  String get linkedName => 'Never';
+
+  @override
+  String get filePath => null;
+}