Skip to content

Commit 951bfc2

Browse files
authored
Introduce TemplateDataWithLibrary and TemplateDataWithContainer. (#2525)
These two interfaces are necessary in order to render certain TemplateData subtypes into _sidebar_for_library.html and _sidebar_for_container.html, respectively. Since _sidebar_for_library.html references `{{#library}}`, the static type rendered into this template needs a `library` getter. Same for the other sidebar. Additionally, _sidebar_for_container.html accesses `hasPublicConstructors` and `publicConstructorsSorted` on Container, so that type needs those getters.
1 parent f3e803c commit 951bfc2

File tree

4 files changed

+68
-11
lines changed

4 files changed

+68
-11
lines changed

lib/src/generator/template_data.dart

Lines changed: 55 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44

55
import 'package:dartdoc/src/model/model.dart';
66

7-
typedef ContainerSidebar = String Function(Container, TemplateData);
8-
typedef LibrarySidebar = String Function(Library, TemplateData);
7+
typedef ContainerSidebar = String Function(
8+
Container, TemplateDataWithContainer);
9+
typedef LibrarySidebar = String Function(Library, TemplateDataWithLibrary);
910

1011
abstract class TemplateOptions {
1112
String get relCanonicalPrefix;
@@ -62,6 +63,20 @@ abstract class TemplateData<T extends Documentable> {
6263
.composeLayoutTitle(name, kind, isDeprecated);
6364
}
6465

66+
/// A [TemplateData] which contains a library, for rendering the
67+
/// sidebar-for-library.
68+
abstract class TemplateDataWithLibrary<T extends Documentable>
69+
implements TemplateData<T> {
70+
Library get library;
71+
}
72+
73+
/// A [TemplateData] which contains a container, for rendering the
74+
/// sidebar-for-container.
75+
abstract class TemplateDataWithContainer<T extends Documentable>
76+
implements TemplateData<T> {
77+
Container get container;
78+
}
79+
6580
class PackageTemplateData extends TemplateData<Package> {
6681
final Package package;
6782
PackageTemplateData(
@@ -119,7 +134,9 @@ class CategoryTemplateData extends TemplateData<Category> {
119134
Category get self => category;
120135
}
121136

122-
class LibraryTemplateData extends TemplateData<Library> {
137+
class LibraryTemplateData extends TemplateData<Library>
138+
implements TemplateDataWithLibrary<Library> {
139+
@override
123140
final Library library;
124141
final LibrarySidebar _sidebarForLibrary;
125142

@@ -165,8 +182,10 @@ class MixinTemplateData extends ClassTemplateData<Mixin> {
165182
}
166183

167184
/// Base template data class for [Class], [Enum], and [Mixin].
168-
class ClassTemplateData<T extends Class> extends TemplateData<T> {
185+
class ClassTemplateData<T extends Class> extends TemplateData<T>
186+
implements TemplateDataWithLibrary<T>, TemplateDataWithContainer<T> {
169187
final Class clazz;
188+
@override
170189
final Library library;
171190
Class _objectType;
172191
final LibrarySidebar _sidebarForLibrary;
@@ -184,6 +203,7 @@ class ClassTemplateData<T extends Class> extends TemplateData<T> {
184203
String get sidebarForLibrary => _sidebarForLibrary(library, this);
185204
String get sidebarForContainer => _sidebarForContainer(container, this);
186205

206+
@override
187207
Container get container => clazz;
188208

189209
@override
@@ -219,8 +239,10 @@ class ClassTemplateData<T extends Class> extends TemplateData<T> {
219239
}
220240

221241
/// Base template data class for [Extension].
222-
class ExtensionTemplateData<T extends Extension> extends TemplateData<T> {
242+
class ExtensionTemplateData<T extends Extension> extends TemplateData<T>
243+
implements TemplateDataWithLibrary<T>, TemplateDataWithContainer<T> {
223244
final T extension;
245+
@override
224246
final Library library;
225247
final ContainerSidebar _sidebarForContainer;
226248
final LibrarySidebar _sidebarForLibrary;
@@ -237,6 +259,7 @@ class ExtensionTemplateData<T extends Extension> extends TemplateData<T> {
237259
String get sidebarForContainer => _sidebarForContainer(container, this);
238260
String get sidebarForLibrary => _sidebarForLibrary(library, this);
239261

262+
@override
240263
Container get container => extension;
241264

242265
@override
@@ -258,7 +281,11 @@ class ExtensionTemplateData<T extends Extension> extends TemplateData<T> {
258281
String get htmlBase => '../';
259282
}
260283

261-
class ConstructorTemplateData extends TemplateData<Constructor> {
284+
class ConstructorTemplateData extends TemplateData<Constructor>
285+
implements
286+
TemplateDataWithLibrary<Constructor>,
287+
TemplateDataWithContainer<Constructor> {
288+
@override
262289
final Library library;
263290
final Class clazz;
264291
final Constructor constructor;
@@ -275,6 +302,7 @@ class ConstructorTemplateData extends TemplateData<Constructor> {
275302

276303
String get sidebarForContainer => _sidebarForContainer(container, this);
277304

305+
@override
278306
Container get container => clazz;
279307
@override
280308
Constructor get self => constructor;
@@ -314,8 +342,10 @@ class EnumTemplateData extends ClassTemplateData<Enum> {
314342
Enum get self => eNum;
315343
}
316344

317-
class FunctionTemplateData extends TemplateData<ModelFunction> {
345+
class FunctionTemplateData extends TemplateData<ModelFunction>
346+
implements TemplateDataWithLibrary<ModelFunction> {
318347
final ModelFunction function;
348+
@override
319349
final Library library;
320350
final LibrarySidebar _sidebarForLibrary;
321351

@@ -343,9 +373,14 @@ class FunctionTemplateData extends TemplateData<ModelFunction> {
343373
String get htmlBase => '../';
344374
}
345375

346-
class MethodTemplateData extends TemplateData<Method> {
376+
class MethodTemplateData extends TemplateData<Method>
377+
implements
378+
TemplateDataWithLibrary<Method>,
379+
TemplateDataWithContainer<Method> {
380+
@override
347381
final Library library;
348382
final Method method;
383+
@override
349384
final Container container;
350385
final ContainerSidebar _sidebarForContainer;
351386

@@ -380,8 +415,13 @@ class MethodTemplateData extends TemplateData<Method> {
380415
String get htmlBase => '../../';
381416
}
382417

383-
class PropertyTemplateData extends TemplateData<Field> {
418+
class PropertyTemplateData extends TemplateData<Field>
419+
implements
420+
TemplateDataWithLibrary<Field>,
421+
TemplateDataWithContainer<Field> {
422+
@override
384423
final Library library;
424+
@override
385425
final Container container;
386426
final Field property;
387427
final ContainerSidebar _sidebarForContainer;
@@ -417,7 +457,9 @@ class PropertyTemplateData extends TemplateData<Field> {
417457
String get htmlBase => '../../';
418458
}
419459

420-
class TypedefTemplateData extends TemplateData<Typedef> {
460+
class TypedefTemplateData extends TemplateData<Typedef>
461+
implements TemplateDataWithLibrary<Typedef> {
462+
@override
421463
final Library library;
422464
final Typedef typeDef;
423465
final LibrarySidebar _sidebarForLibrary;
@@ -447,7 +489,9 @@ class TypedefTemplateData extends TemplateData<Typedef> {
447489
String get htmlBase => '../';
448490
}
449491

450-
class TopLevelPropertyTemplateData extends TemplateData<TopLevelVariable> {
492+
class TopLevelPropertyTemplateData extends TemplateData<TopLevelVariable>
493+
implements TemplateDataWithLibrary<TopLevelVariable> {
494+
@override
451495
final Library library;
452496
final TopLevelVariable property;
453497
final LibrarySidebar _sidebarForLibrary;

lib/src/model/class.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,13 +113,16 @@ class Class extends Container
113113
Iterable<Constructor> get constructors => element.constructors
114114
.map((e) => ModelElement.from(e, library, packageGraph) as Constructor);
115115

116+
@override
116117
bool get hasPublicConstructors => publicConstructors.isNotEmpty;
117118

118119
@visibleForTesting
119120
Iterable<Constructor> get publicConstructors =>
120121
model_utils.filterNonPublic(constructors);
121122

122123
List<Constructor> _publicConstructorsSorted;
124+
125+
@override
123126
Iterable<Constructor> get publicConstructorsSorted =>
124127
_publicConstructorsSorted ??= publicConstructors.toList()..sort(byName);
125128

lib/src/model/container.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@ abstract class Container extends ModelElement with TypeParameters {
7474
/// Whether all instance operators are inherited.
7575
bool get publicInheritedInstanceOperators => false;
7676

77+
bool get hasPublicConstructors;
78+
79+
Iterable<Constructor> get publicConstructorsSorted;
80+
7781
@nonVirtual
7882
bool get hasPublicInstanceMethods =>
7983
model_utils.filterNonPublic(instanceMethods).isNotEmpty;

lib/src/model/extension.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,4 +120,10 @@ class Extension extends Container
120120
assert(canonicalLibrary == library);
121121
return '${package.baseHref}$filePath';
122122
}
123+
124+
@override
125+
bool get hasPublicConstructors => false;
126+
127+
@override
128+
Iterable<Constructor> get publicConstructorsSorted => [];
123129
}

0 commit comments

Comments
 (0)