@@ -9,7 +9,7 @@ import 'package:dartdoc/src/model/comment_referable.dart';
9
9
import 'package:dartdoc/src/model/model.dart' ;
10
10
import 'package:dartdoc/src/render/typedef_renderer.dart' ;
11
11
12
- class Typedef extends ModelElement
12
+ abstract class Typedef extends ModelElement
13
13
with TypeParameters , Categorization
14
14
implements EnclosedElement {
15
15
Typedef (TypeAliasElement element, Library library, PackageGraph packageGraph)
@@ -40,6 +40,8 @@ class Typedef extends ModelElement
40
40
@override
41
41
String get filePath => '${library .dirName }/$fileName ' ;
42
42
43
+ /// Helper for mustache templates, which can't do casting themselves
44
+ /// without this.
43
45
FunctionTypedef get asCallable => this as FunctionTypedef ;
44
46
45
47
@override
@@ -65,34 +67,73 @@ class Typedef extends ModelElement
65
67
66
68
TypedefRenderer get _renderer => packageGraph.rendererFactory.typedefRenderer;
67
69
68
- Map <String , CommentReferable > _referenceChildren;
70
+ @override
71
+ Iterable <CommentReferable > get referenceParents => [definingLibrary];
69
72
73
+ Map <String , CommentReferable > _referenceChildren;
70
74
@override
71
75
Map <String , CommentReferable > get referenceChildren {
72
76
if (_referenceChildren == null ) {
73
77
_referenceChildren = {};
74
-
75
- // Only consider parameters if this is a function typedef.
76
- if (isCallable) {
77
- _referenceChildren
78
- .addEntriesIfAbsent (parameters.explicitOnCollisionWith (this ));
79
- }
80
78
_referenceChildren
81
79
.addEntriesIfAbsent (typeParameters.explicitOnCollisionWith (this ));
82
80
}
83
81
return _referenceChildren;
84
82
}
83
+ }
84
+
85
+ /// A typedef referring to a non-function typedef that is nevertheless not
86
+ /// referring to a defined class. An example is a typedef alias for `void` or
87
+ /// for `Function` itself.
88
+ class GeneralizedTypedef extends Typedef {
89
+ GeneralizedTypedef (
90
+ TypeAliasElement element, Library library, PackageGraph packageGraph)
91
+ : super (element, library, packageGraph) {
92
+ assert (! isCallable);
93
+ }
94
+ }
95
+
96
+ /// A typedef referring to a non-function, defined type.
97
+ class ClassTypedef extends Typedef {
98
+ ClassTypedef (
99
+ TypeAliasElement element, Library library, PackageGraph packageGraph)
100
+ : super (element, library, packageGraph) {
101
+ assert (! isCallable);
102
+ assert (modelType.modelElement is Class );
103
+ }
85
104
86
105
@override
87
- Iterable <CommentReferable > get referenceParents => [definingLibrary];
106
+ DefinedElementType get modelType => super .modelType;
107
+
108
+ @override
109
+ Map <String , CommentReferable > get referenceChildren {
110
+ if (_referenceChildren == null ) {
111
+ _referenceChildren = super .referenceChildren;
112
+ _referenceChildren
113
+ .addEntriesIfAbsent (modelType.modelElement.referenceChildren.entries);
114
+ }
115
+ return _referenceChildren;
116
+ }
88
117
}
89
118
90
119
/// A typedef referring to a function type.
91
120
class FunctionTypedef extends Typedef {
92
121
FunctionTypedef (
93
122
TypeAliasElement element, Library library, PackageGraph packageGraph)
94
- : super (element, library, packageGraph);
123
+ : super (element, library, packageGraph) {
124
+ assert (isCallable);
125
+ }
95
126
96
127
@override
97
128
Callable get modelType => super .modelType;
129
+
130
+ @override
131
+ Map <String , CommentReferable > get referenceChildren {
132
+ if (_referenceChildren == null ) {
133
+ _referenceChildren = super .referenceChildren;
134
+ _referenceChildren
135
+ .addEntriesIfAbsent (parameters.explicitOnCollisionWith (this ));
136
+ }
137
+ return _referenceChildren;
138
+ }
98
139
}
0 commit comments