Skip to content

Commit a0cec02

Browse files
authored
Support the Never type in dartdoc (#2167)
1 parent 80dc7ae commit a0cec02

File tree

4 files changed

+44
-2
lines changed

4 files changed

+44
-2
lines changed

lib/src/element_type.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ abstract class ElementType extends Privacy {
2828
factory ElementType.from(
2929
DartType f, Library library, PackageGraph packageGraph,
3030
[ElementType returnedFrom]) {
31-
if (f.element == null || f.element.kind == ElementKind.DYNAMIC) {
31+
if (f.element == null ||
32+
f.element.kind == ElementKind.DYNAMIC ||
33+
f.element.kind == ElementKind.NEVER) {
3234
if (f is FunctionType) {
3335
return FunctionTypeElementType(f, library, packageGraph, returnedFrom);
3436
}

lib/src/model/model.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export 'model_element.dart';
3030
export 'model_function.dart';
3131
export 'model_node.dart';
3232
export 'nameable.dart';
33+
export 'never.dart';
3334
export 'operator.dart';
3435
export 'package.dart';
3536
export 'package_builder.dart';

lib/src/model/model_element.dart

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,8 @@ abstract class ModelElement extends Canonicalization
202202
e is ParameterElement ||
203203
e is TypeParameterElement ||
204204
e is GenericFunctionTypeElementImpl ||
205-
e.kind == ElementKind.DYNAMIC);
205+
e.kind == ElementKind.DYNAMIC ||
206+
e.kind == ElementKind.NEVER);
206207

207208
Member originalMember;
208209
// TODO(jcollins-g): Refactor object model to instantiate 'ModelMembers'
@@ -215,13 +216,17 @@ abstract class ModelElement extends Canonicalization
215216
Tuple3(e, library, enclosingContainer);
216217
ModelElement newModelElement;
217218
if (e.kind != ElementKind.DYNAMIC &&
219+
e.kind != ElementKind.NEVER &&
218220
packageGraph.allConstructedModelElements.containsKey(key)) {
219221
newModelElement = packageGraph.allConstructedModelElements[key];
220222
assert(newModelElement.element is! MultiplyInheritedExecutableElement);
221223
} else {
222224
if (e.kind == ElementKind.DYNAMIC) {
223225
newModelElement = Dynamic(e, packageGraph);
224226
}
227+
if (e.kind == ElementKind.NEVER) {
228+
newModelElement = NeverType(e, packageGraph);
229+
}
225230
if (e is MultiplyInheritedExecutableElement) {
226231
newModelElement = resolveMultiplyInheritedElement(
227232
e, library, packageGraph, enclosingContainer);
@@ -1120,6 +1125,7 @@ abstract class ModelElement extends Canonicalization
11201125
// element associated with a ModelElement or there's an analysis bug.
11211126
assert(name.isNotEmpty ||
11221127
this.element?.kind == ElementKind.DYNAMIC ||
1128+
this.element?.kind == ElementKind.NEVER ||
11231129
this is ModelFunction);
11241130

11251131
if (href == null) {

lib/src/model/never.dart

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'package:analyzer/dart/element/element.dart';
6+
import 'package:dartdoc/src/model/model.dart';
7+
8+
class NeverType extends ModelElement {
9+
NeverType(Element element, PackageGraph packageGraph)
10+
: super(element, null, packageGraph, null);
11+
12+
/// [never] is not a real object, and so we can't document it, so there
13+
/// can be nothing canonical for it.
14+
@override
15+
ModelElement get canonicalModelElement => null;
16+
17+
@override
18+
ModelElement get enclosingElement => throw UnsupportedError('');
19+
20+
/// And similiarly, even if someone references it directly it can have
21+
/// no hyperlink.
22+
@override
23+
String get href => null;
24+
25+
@override
26+
String get kind => 'Never';
27+
28+
@override
29+
String get linkedName => 'Never';
30+
31+
@override
32+
String get filePath => null;
33+
}

0 commit comments

Comments
 (0)