@@ -9,7 +9,7 @@ import 'package:dartdoc/src/model/comment_referable.dart';
99import 'package:dartdoc/src/model/model.dart' ;
1010import 'package:dartdoc/src/render/typedef_renderer.dart' ;
1111
12- class Typedef extends ModelElement
12+ abstract class Typedef extends ModelElement
1313 with TypeParameters , Categorization
1414 implements EnclosedElement {
1515 Typedef (TypeAliasElement element, Library library, PackageGraph packageGraph)
@@ -40,6 +40,8 @@ class Typedef extends ModelElement
4040 @override
4141 String get filePath => '${library .dirName }/$fileName ' ;
4242
43+ /// Helper for mustache templates, which can't do casting themselves
44+ /// without this.
4345 FunctionTypedef get asCallable => this as FunctionTypedef ;
4446
4547 @override
@@ -65,34 +67,73 @@ class Typedef extends ModelElement
6567
6668 TypedefRenderer get _renderer => packageGraph.rendererFactory.typedefRenderer;
6769
68- Map <String , CommentReferable > _referenceChildren;
70+ @override
71+ Iterable <CommentReferable > get referenceParents => [definingLibrary];
6972
73+ Map <String , CommentReferable > _referenceChildren;
7074 @override
7175 Map <String , CommentReferable > get referenceChildren {
7276 if (_referenceChildren == null ) {
7377 _referenceChildren = {};
74-
75- // Only consider parameters if this is a function typedef.
76- if (isCallable) {
77- _referenceChildren
78- .addEntriesIfAbsent (parameters.explicitOnCollisionWith (this ));
79- }
8078 _referenceChildren
8179 .addEntriesIfAbsent (typeParameters.explicitOnCollisionWith (this ));
8280 }
8381 return _referenceChildren;
8482 }
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+ }
85104
86105 @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+ }
88117}
89118
90119/// A typedef referring to a function type.
91120class FunctionTypedef extends Typedef {
92121 FunctionTypedef (
93122 TypeAliasElement element, Library library, PackageGraph packageGraph)
94- : super (element, library, packageGraph);
123+ : super (element, library, packageGraph) {
124+ assert (isCallable);
125+ }
95126
96127 @override
97128 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+ }
98139}
0 commit comments