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;
+}