Skip to content

Commit d152fcd

Browse files
authored
Refactor sidebar handling to improve performance (#2444)
* Beginning refactor * clean up unneeded templates * Holy cow, 50% speed improvement * Add empty (as yet unused) sidebar files for Markdown * dartfmt * Clean up sidebar_for_container * dartfmt * review comment
1 parent b351c99 commit d152fcd

21 files changed

+193
-251
lines changed

lib/src/generator/dartdoc_generator_backend.dart

Lines changed: 46 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,32 @@ class DartdocGeneratorBackendOptions implements TemplateOptions {
4444
this.useBaseHref = false});
4545
}
4646

47+
class SidebarGenerator<T extends Documentable> {
48+
final Template template;
49+
final Map<T, String> _renderCache = {};
50+
51+
SidebarGenerator(this.template);
52+
53+
// Retrieve the render for a specific key, or generate it using the given
54+
// template data if you need.
55+
String getRenderFor(T key, TemplateData templateData) {
56+
return _renderCache[key] ??= template.renderString(templateData);
57+
}
58+
}
59+
4760
/// Base GeneratorBackend for Dartdoc's supported formats.
4861
abstract class DartdocGeneratorBackend implements GeneratorBackend {
4962
final DartdocGeneratorBackendOptions options;
5063
final Templates templates;
64+
final SidebarGenerator<Library> sidebarForLibrary;
65+
final SidebarGenerator<Container> sidebarForContainer;
5166

5267
DartdocGeneratorBackend(
5368
DartdocGeneratorBackendOptions options, this.templates)
54-
: options = (options ?? DartdocGeneratorBackendOptions());
69+
: options = options ?? DartdocGeneratorBackendOptions(),
70+
sidebarForContainer =
71+
SidebarGenerator(templates.sidebarContainerTemplate),
72+
sidebarForLibrary = SidebarGenerator(templates.sidebarLibraryTemplate);
5573

5674
/// Helper method to bind template data and emit the content to the writer.
5775
void render(FileWriter writer, String filename, Template template,
@@ -101,63 +119,72 @@ abstract class DartdocGeneratorBackend implements GeneratorBackend {
101119
@override
102120
void generateLibrary(
103121
FileWriter writer, PackageGraph packageGraph, Library lib) {
104-
TemplateData data = LibraryTemplateData(options, packageGraph, lib);
122+
TemplateData data = LibraryTemplateData(
123+
options, packageGraph, lib, sidebarForLibrary.getRenderFor);
105124
render(writer, lib.filePath, templates.libraryTemplate, data);
106125
}
107126

108127
@override
109128
void generateClass(
110129
FileWriter writer, PackageGraph packageGraph, Library lib, Class clazz) {
111-
TemplateData data = ClassTemplateData(options, packageGraph, lib, clazz);
130+
TemplateData data = ClassTemplateData(options, packageGraph, lib, clazz,
131+
sidebarForLibrary.getRenderFor, sidebarForContainer.getRenderFor);
112132
render(writer, clazz.filePath, templates.classTemplate, data);
113133
}
114134

115135
@override
116136
void generateExtension(FileWriter writer, PackageGraph packageGraph,
117137
Library lib, Extension extension) {
118-
TemplateData data =
119-
ExtensionTemplateData(options, packageGraph, lib, extension);
138+
TemplateData data = ExtensionTemplateData(
139+
options,
140+
packageGraph,
141+
lib,
142+
extension,
143+
sidebarForLibrary.getRenderFor,
144+
sidebarForContainer.getRenderFor);
120145
render(writer, extension.filePath, templates.extensionTemplate, data);
121146
}
122147

123148
@override
124149
void generateMixin(
125150
FileWriter writer, PackageGraph packageGraph, Library lib, Mixin mixin) {
126-
TemplateData data = MixinTemplateData(options, packageGraph, lib, mixin);
151+
TemplateData data = MixinTemplateData(options, packageGraph, lib, mixin,
152+
sidebarForLibrary.getRenderFor, sidebarForContainer.getRenderFor);
127153
render(writer, mixin.filePath, templates.mixinTemplate, data);
128154
}
129155

130156
@override
131157
void generateConstructor(FileWriter writer, PackageGraph packageGraph,
132158
Library lib, Class clazz, Constructor constructor) {
133-
TemplateData data =
134-
ConstructorTemplateData(options, packageGraph, lib, clazz, constructor);
159+
TemplateData data = ConstructorTemplateData(options, packageGraph, lib,
160+
clazz, constructor, sidebarForContainer.getRenderFor);
135161

136162
render(writer, constructor.filePath, templates.constructorTemplate, data);
137163
}
138164

139165
@override
140166
void generateEnum(
141167
FileWriter writer, PackageGraph packageGraph, Library lib, Enum eNum) {
142-
TemplateData data = EnumTemplateData(options, packageGraph, lib, eNum);
168+
TemplateData data = EnumTemplateData(options, packageGraph, lib, eNum,
169+
sidebarForLibrary.getRenderFor, sidebarForContainer.getRenderFor);
143170

144171
render(writer, eNum.filePath, templates.enumTemplate, data);
145172
}
146173

147174
@override
148175
void generateFunction(FileWriter writer, PackageGraph packageGraph,
149176
Library lib, ModelFunction function) {
150-
TemplateData data =
151-
FunctionTemplateData(options, packageGraph, lib, function);
177+
TemplateData data = FunctionTemplateData(
178+
options, packageGraph, lib, function, sidebarForLibrary.getRenderFor);
152179

153180
render(writer, function.filePath, templates.functionTemplate, data);
154181
}
155182

156183
@override
157184
void generateMethod(FileWriter writer, PackageGraph packageGraph, Library lib,
158185
Container clazz, Method method) {
159-
TemplateData data =
160-
MethodTemplateData(options, packageGraph, lib, clazz, method);
186+
TemplateData data = MethodTemplateData(options, packageGraph, lib, clazz,
187+
method, sidebarForContainer.getRenderFor);
161188

162189
render(writer, method.filePath, templates.methodTemplate, data);
163190
}
@@ -170,17 +197,17 @@ abstract class DartdocGeneratorBackend implements GeneratorBackend {
170197
@override
171198
void generateProperty(FileWriter writer, PackageGraph packageGraph,
172199
Library lib, Container clazz, Field property) {
173-
TemplateData data =
174-
PropertyTemplateData(options, packageGraph, lib, clazz, property);
200+
TemplateData data = PropertyTemplateData(options, packageGraph, lib, clazz,
201+
property, sidebarForContainer.getRenderFor);
175202

176203
render(writer, property.filePath, templates.propertyTemplate, data);
177204
}
178205

179206
@override
180207
void generateTopLevelProperty(FileWriter writer, PackageGraph packageGraph,
181208
Library lib, TopLevelVariable property) {
182-
TemplateData data =
183-
TopLevelPropertyTemplateData(options, packageGraph, lib, property);
209+
TemplateData data = TopLevelPropertyTemplateData(
210+
options, packageGraph, lib, property, sidebarForLibrary.getRenderFor);
184211

185212
render(writer, property.filePath, templates.topLevelPropertyTemplate, data);
186213
}
@@ -193,8 +220,8 @@ abstract class DartdocGeneratorBackend implements GeneratorBackend {
193220
@override
194221
void generateTypeDef(FileWriter writer, PackageGraph packageGraph,
195222
Library lib, Typedef typeDef) {
196-
TemplateData data =
197-
TypedefTemplateData(options, packageGraph, lib, typeDef);
223+
TemplateData data = TypedefTemplateData(
224+
options, packageGraph, lib, typeDef, sidebarForLibrary.getRenderFor);
198225

199226
render(writer, typeDef.filePath, templates.typeDefTemplate, data);
200227
}

lib/src/generator/template_data.dart

Lines changed: 94 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +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);
9+
710
abstract class TemplateOptions {
811
String get relCanonicalPrefix;
912
String get toolVersion;
@@ -118,11 +121,13 @@ class CategoryTemplateData extends TemplateData<Category> {
118121

119122
class LibraryTemplateData extends TemplateData<Library> {
120123
final Library library;
124+
final LibrarySidebar _sidebarForLibrary;
121125

122-
LibraryTemplateData(
123-
TemplateOptions htmlOptions, PackageGraph packageGraph, this.library)
126+
LibraryTemplateData(TemplateOptions htmlOptions, PackageGraph packageGraph,
127+
this.library, this._sidebarForLibrary)
124128
: super(htmlOptions, packageGraph);
125129

130+
String get sidebarForLibrary => _sidebarForLibrary(library, this);
126131
@override
127132
String get title => '${library.name} library - Dart API';
128133
@override
@@ -145,9 +150,15 @@ class LibraryTemplateData extends TemplateData<Library> {
145150
class MixinTemplateData extends ClassTemplateData<Mixin> {
146151
final Mixin mixin;
147152

148-
MixinTemplateData(TemplateOptions htmlOptions, PackageGraph packageGraph,
149-
Library library, this.mixin)
150-
: super(htmlOptions, packageGraph, library, mixin);
153+
MixinTemplateData(
154+
TemplateOptions htmlOptions,
155+
PackageGraph packageGraph,
156+
Library library,
157+
this.mixin,
158+
LibrarySidebar _sidebarForLibrary,
159+
ContainerSidebar _sidebarForContainer)
160+
: super(htmlOptions, packageGraph, library, mixin, _sidebarForLibrary,
161+
_sidebarForContainer);
151162

152163
@override
153164
Mixin get self => mixin;
@@ -158,11 +169,23 @@ class ClassTemplateData<T extends Class> extends TemplateData<T> {
158169
final Class clazz;
159170
final Library library;
160171
Class _objectType;
161-
162-
ClassTemplateData(TemplateOptions htmlOptions, PackageGraph packageGraph,
163-
this.library, this.clazz)
172+
final LibrarySidebar _sidebarForLibrary;
173+
final ContainerSidebar _sidebarForContainer;
174+
175+
ClassTemplateData(
176+
TemplateOptions htmlOptions,
177+
PackageGraph packageGraph,
178+
this.library,
179+
this.clazz,
180+
this._sidebarForLibrary,
181+
this._sidebarForContainer)
164182
: super(htmlOptions, packageGraph);
165183

184+
String get sidebarForLibrary => _sidebarForLibrary(library, this);
185+
String get sidebarForContainer => _sidebarForContainer(container, this);
186+
187+
Container get container => clazz;
188+
166189
@override
167190
T get self => clazz;
168191
String get linkedObjectType =>
@@ -199,11 +222,23 @@ class ClassTemplateData<T extends Class> extends TemplateData<T> {
199222
class ExtensionTemplateData<T extends Extension> extends TemplateData<T> {
200223
final T extension;
201224
final Library library;
202-
203-
ExtensionTemplateData(TemplateOptions htmlOptions, PackageGraph packageGraph,
204-
this.library, this.extension)
225+
final ContainerSidebar _sidebarForContainer;
226+
final LibrarySidebar _sidebarForLibrary;
227+
228+
ExtensionTemplateData(
229+
TemplateOptions htmlOptions,
230+
PackageGraph packageGraph,
231+
this.library,
232+
this.extension,
233+
this._sidebarForLibrary,
234+
this._sidebarForContainer)
205235
: super(htmlOptions, packageGraph);
206236

237+
String get sidebarForContainer => _sidebarForContainer(container, this);
238+
String get sidebarForLibrary => _sidebarForLibrary(library, this);
239+
240+
Container get container => extension;
241+
207242
@override
208243
T get self => extension;
209244

@@ -227,11 +262,20 @@ class ConstructorTemplateData extends TemplateData<Constructor> {
227262
final Library library;
228263
final Class clazz;
229264
final Constructor constructor;
230-
231-
ConstructorTemplateData(TemplateOptions htmlOptions,
232-
PackageGraph packageGraph, this.library, this.clazz, this.constructor)
265+
final ContainerSidebar _sidebarForContainer;
266+
267+
ConstructorTemplateData(
268+
TemplateOptions htmlOptions,
269+
PackageGraph packageGraph,
270+
this.library,
271+
this.clazz,
272+
this.constructor,
273+
this._sidebarForContainer)
233274
: super(htmlOptions, packageGraph);
234275

276+
String get sidebarForContainer => _sidebarForContainer(container, this);
277+
278+
Container get container => clazz;
235279
@override
236280
Constructor get self => constructor;
237281
@override
@@ -255,9 +299,15 @@ class ConstructorTemplateData extends TemplateData<Constructor> {
255299
}
256300

257301
class EnumTemplateData extends ClassTemplateData<Enum> {
258-
EnumTemplateData(TemplateOptions htmlOptions, PackageGraph packageGraph,
259-
Library library, Enum eNum)
260-
: super(htmlOptions, packageGraph, library, eNum);
302+
EnumTemplateData(
303+
TemplateOptions htmlOptions,
304+
PackageGraph packageGraph,
305+
Library library,
306+
Enum eNum,
307+
LibrarySidebar _sidebarForLibrary,
308+
ContainerSidebar _sidebarForContainer)
309+
: super(htmlOptions, packageGraph, library, eNum, _sidebarForLibrary,
310+
_sidebarForContainer);
261311

262312
Enum get eNum => clazz;
263313
@override
@@ -267,11 +317,14 @@ class EnumTemplateData extends ClassTemplateData<Enum> {
267317
class FunctionTemplateData extends TemplateData<ModelFunction> {
268318
final ModelFunction function;
269319
final Library library;
320+
final LibrarySidebar _sidebarForLibrary;
270321

271322
FunctionTemplateData(TemplateOptions htmlOptions, PackageGraph packageGraph,
272-
this.library, this.function)
323+
this.library, this.function, this._sidebarForLibrary)
273324
: super(htmlOptions, packageGraph);
274325

326+
String get sidebarForLibrary => _sidebarForLibrary(library, this);
327+
275328
@override
276329
ModelFunction get self => function;
277330
@override
@@ -294,14 +347,18 @@ class MethodTemplateData extends TemplateData<Method> {
294347
final Library library;
295348
final Method method;
296349
final Container container;
350+
final ContainerSidebar _sidebarForContainer;
351+
297352
String containerDesc;
298353

299354
MethodTemplateData(TemplateOptions htmlOptions, PackageGraph packageGraph,
300-
this.library, this.container, this.method)
355+
this.library, this.container, this.method, this._sidebarForContainer)
301356
: super(htmlOptions, packageGraph) {
302357
containerDesc = container.isClass ? 'class' : 'extension';
303358
}
304359

360+
String get sidebarForContainer => _sidebarForContainer(container, this);
361+
305362
@override
306363
Method get self => method;
307364
@override
@@ -327,14 +384,17 @@ class PropertyTemplateData extends TemplateData<Field> {
327384
final Library library;
328385
final Container container;
329386
final Field property;
387+
final ContainerSidebar _sidebarForContainer;
330388
String containerDesc;
331389

332390
PropertyTemplateData(TemplateOptions htmlOptions, PackageGraph packageGraph,
333-
this.library, this.container, this.property)
391+
this.library, this.container, this.property, this._sidebarForContainer)
334392
: super(htmlOptions, packageGraph) {
335393
containerDesc = container.isClass ? 'class' : 'extension';
336394
}
337395

396+
String get sidebarForContainer => _sidebarForContainer(container, this);
397+
338398
@override
339399
Field get self => property;
340400

@@ -360,11 +420,14 @@ class PropertyTemplateData extends TemplateData<Field> {
360420
class TypedefTemplateData extends TemplateData<Typedef> {
361421
final Library library;
362422
final Typedef typeDef;
423+
final LibrarySidebar _sidebarForLibrary;
363424

364425
TypedefTemplateData(TemplateOptions htmlOptions, PackageGraph packageGraph,
365-
this.library, this.typeDef)
426+
this.library, this.typeDef, this._sidebarForLibrary)
366427
: super(htmlOptions, packageGraph);
367428

429+
String get sidebarForLibrary => _sidebarForLibrary(library, this);
430+
368431
@override
369432
Typedef get self => typeDef;
370433

@@ -387,11 +450,18 @@ class TypedefTemplateData extends TemplateData<Typedef> {
387450
class TopLevelPropertyTemplateData extends TemplateData<TopLevelVariable> {
388451
final Library library;
389452
final TopLevelVariable property;
390-
391-
TopLevelPropertyTemplateData(TemplateOptions htmlOptions,
392-
PackageGraph packageGraph, this.library, this.property)
453+
final LibrarySidebar _sidebarForLibrary;
454+
455+
TopLevelPropertyTemplateData(
456+
TemplateOptions htmlOptions,
457+
PackageGraph packageGraph,
458+
this.library,
459+
this.property,
460+
this._sidebarForLibrary)
393461
: super(htmlOptions, packageGraph);
394462

463+
String get sidebarForLibrary => _sidebarForLibrary(library, this);
464+
395465
@override
396466
TopLevelVariable get self => property;
397467

0 commit comments

Comments
 (0)