Skip to content

Commit 64d9427

Browse files
committed
Use Mustachio AOT compiler for default templates
1 parent 2d902c0 commit 64d9427

17 files changed

+1496
-302
lines changed

lib/dartdoc.dart

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ class DartdocFileWriter implements FileWriter {
114114
/// Generates Dart documentation for all public Dart libraries in the given
115115
/// directory.
116116
class Dartdoc {
117-
final Generator generator;
117+
Generator _generator;
118118
final PackageBuilder packageBuilder;
119119
final DartdocOptionContext config;
120120
final Set<String> _writtenFiles = {};
@@ -124,12 +124,23 @@ class Dartdoc {
124124
final StreamController<String> _onCheckProgress =
125125
StreamController(sync: true);
126126

127-
Dartdoc._(this.config, this.generator, this.packageBuilder) {
127+
Dartdoc._(this.config, this._generator, this.packageBuilder) {
128128
_outputDir = config.resourceProvider
129129
.getFolder(config.resourceProvider.pathContext.absolute(config.output))
130130
..create();
131131
}
132132

133+
// TODO(srawlins): Remove when https://github.com/dart-lang/linter/issues/2706
134+
// is fixed.
135+
// ignore: unnecessary_getters_setters
136+
Generator get generator => _generator;
137+
138+
@visibleForTesting
139+
// TODO(srawlins): Remove when https://github.com/dart-lang/linter/issues/2706
140+
// is fixed.
141+
// ignore: unnecessary_getters_setters
142+
set generator(Generator newGenerator) => _generator = newGenerator;
143+
133144
/// An asynchronous factory method that builds Dartdoc's file writers
134145
/// and returns a Dartdoc object with them.
135146
@Deprecated('Prefer fromContext() instead')
@@ -158,10 +169,8 @@ class Dartdoc {
158169

159170
/// Asynchronous factory method that builds Dartdoc with a generator
160171
/// determined by the given context.
161-
static Future<Dartdoc> fromContext(
162-
DartdocGeneratorOptionContext context,
163-
PackageBuilder packageBuilder,
164-
) async {
172+
static Future<Dartdoc> fromContext(DartdocGeneratorOptionContext context,
173+
PackageBuilder packageBuilder) async {
165174
Generator generator;
166175
switch (context.format) {
167176
case 'html':
@@ -194,18 +203,15 @@ class Dartdoc {
194203
'in ${seconds.toStringAsFixed(1)} seconds');
195204
stopwatch.reset();
196205

197-
var generator = this.generator;
198-
if (generator != null) {
199-
// Create the out directory.
200-
if (!_outputDir.exists) _outputDir.create();
206+
// Create the out directory.
207+
if (!_outputDir.exists) _outputDir.create();
201208

202-
var writer = DartdocFileWriter(_outputDir.path, config.resourceProvider);
203-
await generator.generate(packageGraph, writer);
209+
var writer = DartdocFileWriter(_outputDir.path, config.resourceProvider);
210+
await generator.generate(packageGraph, writer);
204211

205-
_writtenFiles.addAll(writer.writtenFiles);
206-
if (config.validateLinks && _writtenFiles.isNotEmpty) {
207-
_validateLinks(packageGraph, _outputDir.path);
208-
}
212+
_writtenFiles.addAll(writer.writtenFiles);
213+
if (config.validateLinks && _writtenFiles.isNotEmpty) {
214+
_validateLinks(packageGraph, _outputDir.path);
209215
}
210216

211217
var warnings = packageGraph.packageWarningCounter.warningCount;

lib/options.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class DartdocGeneratorOptionContext extends DartdocOptionContext {
4444
String get relCanonicalPrefix =>
4545
optionSet['relCanonicalPrefix'].valueAt(context);
4646

47+
/// The 'templatesDir' Dartdoc option if one was specified; otherwise `null`.
4748
String get templatesDir => optionSet['templatesDir'].valueAt(context);
4849

4950
// TODO(jdkoren): duplicated temporarily so that GeneratorContext is enough for configuration.

lib/src/generator/dartdoc_generator_backend.dart

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ import 'package:dartdoc/src/generator/generator_frontend.dart';
88
import 'package:dartdoc/src/generator/generator_utils.dart' as generator_util;
99
import 'package:dartdoc/src/generator/template_data.dart';
1010
import 'package:dartdoc/src/generator/templates.dart';
11-
import 'package:dartdoc/src/generator/templates.runtime_renderers.dart';
12-
import 'package:dartdoc/src/mustachio/renderer_base.dart';
1311
import 'package:dartdoc/src/warnings.dart';
1412
import 'package:path/path.dart' as path show Context;
1513

@@ -60,16 +58,15 @@ class DartdocGeneratorBackendOptions implements TemplateOptions {
6058
}
6159

6260
class SidebarGenerator<T extends TemplateData> {
63-
final Template template;
64-
final RenderFunction<T> renderFunction;
61+
final String Function(T context) renderFunction;
6562
final Map<Documentable, String> _renderCache = {};
6663

67-
SidebarGenerator(this.template, this.renderFunction);
64+
SidebarGenerator(this.renderFunction);
6865

6966
// Retrieve the render for a specific key, or generate it using the given
7067
// template data if you need.
7168
String getRenderFor(Documentable key, T templateData) {
72-
return _renderCache[key] ??= renderFunction(templateData, template);
69+
return _renderCache[key] ??= renderFunction(templateData);
7370
}
7471
}
7572

@@ -86,10 +83,9 @@ abstract class DartdocGeneratorBackend implements GeneratorBackend {
8683
DartdocGeneratorBackend(
8784
DartdocGeneratorBackendOptions options, this.templates, this._pathContext)
8885
: options = options ?? DartdocGeneratorBackendOptions._defaults(),
89-
sidebarForLibrary = SidebarGenerator(
90-
templates.sidebarLibraryTemplate, renderSidebarForLibrary),
91-
sidebarForContainer = SidebarGenerator(
92-
templates.sidebarContainerTemplate, renderSidebarForContainer);
86+
sidebarForLibrary = SidebarGenerator(templates.renderSidebarForLibrary),
87+
sidebarForContainer =
88+
SidebarGenerator(templates.renderSidebarForContainer);
9389

9490
/// Helper method to bind template data and emit the content to the writer.
9591
void write(
@@ -129,15 +125,15 @@ abstract class DartdocGeneratorBackend implements GeneratorBackend {
129125
@override
130126
void generatePackage(FileWriter writer, PackageGraph graph, Package package) {
131127
TemplateData data = PackageTemplateData(options, graph, package);
132-
var content = renderIndex(data, templates.indexTemplate);
128+
var content = templates.renderIndex(data);
133129
write(writer, package.filePath, data, content);
134130
}
135131

136132
@override
137133
void generateCategory(
138134
FileWriter writer, PackageGraph packageGraph, Category category) {
139135
TemplateData data = CategoryTemplateData(options, packageGraph, category);
140-
var content = renderCategory(data, templates.categoryTemplate);
136+
var content = templates.renderCategory(data);
141137
write(writer, category.filePath, data, content);
142138
}
143139

@@ -146,7 +142,7 @@ abstract class DartdocGeneratorBackend implements GeneratorBackend {
146142
FileWriter writer, PackageGraph packageGraph, Library lib) {
147143
TemplateData data = LibraryTemplateData(
148144
options, packageGraph, lib, sidebarForLibrary.getRenderFor);
149-
var content = renderLibrary(data, templates.libraryTemplate);
145+
var content = templates.renderLibrary(data);
150146
write(writer, lib.filePath, data, content);
151147
}
152148

@@ -155,7 +151,7 @@ abstract class DartdocGeneratorBackend implements GeneratorBackend {
155151
FileWriter writer, PackageGraph packageGraph, Library lib, Class clazz) {
156152
TemplateData data = ClassTemplateData(options, packageGraph, lib, clazz,
157153
sidebarForLibrary.getRenderFor, sidebarForContainer.getRenderFor);
158-
var content = renderClass(data, templates.classTemplate);
154+
var content = templates.renderClass(data);
159155
write(writer, clazz.filePath, data, content);
160156
}
161157

@@ -169,7 +165,7 @@ abstract class DartdocGeneratorBackend implements GeneratorBackend {
169165
extension,
170166
sidebarForLibrary.getRenderFor,
171167
sidebarForContainer.getRenderFor);
172-
var content = renderExtension(data, templates.extensionTemplate);
168+
var content = templates.renderExtension(data);
173169
write(writer, extension.filePath, data, content);
174170
}
175171

@@ -178,7 +174,7 @@ abstract class DartdocGeneratorBackend implements GeneratorBackend {
178174
FileWriter writer, PackageGraph packageGraph, Library lib, Mixin mixin) {
179175
TemplateData data = MixinTemplateData(options, packageGraph, lib, mixin,
180176
sidebarForLibrary.getRenderFor, sidebarForContainer.getRenderFor);
181-
var content = renderMixin(data, templates.mixinTemplate);
177+
var content = templates.renderMixin(data);
182178
write(writer, mixin.filePath, data, content);
183179
}
184180

@@ -187,7 +183,7 @@ abstract class DartdocGeneratorBackend implements GeneratorBackend {
187183
Library lib, Class clazz, Constructor constructor) {
188184
TemplateData data = ConstructorTemplateData(options, packageGraph, lib,
189185
clazz, constructor, sidebarForContainer.getRenderFor);
190-
var content = renderConstructor(data, templates.constructorTemplate);
186+
var content = templates.renderConstructor(data);
191187
write(writer, constructor.filePath, data, content);
192188
}
193189

@@ -196,7 +192,7 @@ abstract class DartdocGeneratorBackend implements GeneratorBackend {
196192
FileWriter writer, PackageGraph packageGraph, Library lib, Enum eNum) {
197193
TemplateData data = EnumTemplateData(options, packageGraph, lib, eNum,
198194
sidebarForLibrary.getRenderFor, sidebarForContainer.getRenderFor);
199-
var content = renderEnum(data, templates.enumTemplate);
195+
var content = templates.renderEnum(data);
200196
write(writer, eNum.filePath, data, content);
201197
}
202198

@@ -205,7 +201,7 @@ abstract class DartdocGeneratorBackend implements GeneratorBackend {
205201
Library lib, ModelFunction function) {
206202
TemplateData data = FunctionTemplateData(
207203
options, packageGraph, lib, function, sidebarForLibrary.getRenderFor);
208-
var content = renderFunction(data, templates.functionTemplate);
204+
var content = templates.renderFunction(data);
209205
write(writer, function.filePath, data, content);
210206
}
211207

@@ -214,7 +210,7 @@ abstract class DartdocGeneratorBackend implements GeneratorBackend {
214210
Container clazz, Method method) {
215211
TemplateData data = MethodTemplateData(options, packageGraph, lib, clazz,
216212
method, sidebarForContainer.getRenderFor);
217-
var content = renderMethod(data, templates.methodTemplate);
213+
var content = templates.renderMethod(data);
218214
write(writer, method.filePath, data, content);
219215
}
220216

@@ -228,7 +224,7 @@ abstract class DartdocGeneratorBackend implements GeneratorBackend {
228224
Library lib, Container clazz, Field property) {
229225
TemplateData data = PropertyTemplateData(options, packageGraph, lib, clazz,
230226
property, sidebarForContainer.getRenderFor);
231-
var content = renderProperty(data, templates.propertyTemplate);
227+
var content = templates.renderProperty(data);
232228
write(writer, property.filePath, data, content);
233229
}
234230

@@ -237,8 +233,7 @@ abstract class DartdocGeneratorBackend implements GeneratorBackend {
237233
Library lib, TopLevelVariable property) {
238234
TemplateData data = TopLevelPropertyTemplateData(
239235
options, packageGraph, lib, property, sidebarForLibrary.getRenderFor);
240-
var content =
241-
renderTopLevelProperty(data, templates.topLevelPropertyTemplate);
236+
var content = templates.renderTopLevelProperty(data);
242237
write(writer, property.filePath, data, content);
243238
}
244239

@@ -252,7 +247,7 @@ abstract class DartdocGeneratorBackend implements GeneratorBackend {
252247
Library lib, Typedef typeDef) {
253248
TemplateData data = TypedefTemplateData(
254249
options, packageGraph, lib, typeDef, sidebarForLibrary.getRenderFor);
255-
var content = renderTypedef(data, templates.typeDefTemplate);
250+
var content = templates.renderTypedef(data);
256251
write(writer, typeDef.filePath, data, content);
257252
}
258253

lib/src/generator/generator_frontend.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ class GeneratorFrontEnd implements Generator {
2929
_generatorBackend.generateSearchIndex(writer, indexElements);
3030
}
3131

32-
// Traverses the package graph and collects elements for the search index.
32+
/// Traverses the package graph and generates documentation for all contained
33+
/// elements.
3334
void _generateDocs(PackageGraph packageGraph, FileWriter writer,
3435
List<Indexable> indexAccumulator) {
3536
if (packageGraph == null) return;

lib/src/generator/html_generator.dart

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
library dartdoc.html_generator;
66

7+
import 'package:analyzer/file_system/file_system.dart';
78
import 'package:dartdoc/options.dart';
89
import 'package:dartdoc/src/generator/dartdoc_generator_backend.dart';
910
import 'package:dartdoc/src/generator/generator.dart';
@@ -12,14 +13,17 @@ import 'package:dartdoc/src/generator/html_resources.g.dart' as resources;
1213
import 'package:dartdoc/src/generator/resource_loader.dart';
1314
import 'package:dartdoc/src/generator/template_data.dart';
1415
import 'package:dartdoc/src/generator/templates.dart';
15-
import 'package:dartdoc/src/generator/templates.runtime_renderers.dart';
1616
import 'package:dartdoc/src/model/package.dart';
1717
import 'package:dartdoc/src/model/package_graph.dart';
1818
import 'package:path/path.dart' as path show Context;
1919

20-
Future<Generator> initHtmlGenerator(
21-
DartdocGeneratorOptionContext context) async {
22-
var templates = await Templates.fromContext(context);
20+
/// Creates a [Generator] with an [HtmlGeneratorBackend] backend.
21+
///
22+
/// [forceRuntimeTemplates] should only be given [true] during tests.
23+
Future<Generator> initHtmlGenerator(DartdocGeneratorOptionContext context,
24+
{bool forceRuntimeTemplates = false}) async {
25+
var templates = await Templates.fromContext(context,
26+
forceRuntimeTemplates: forceRuntimeTemplates);
2327
var options = DartdocGeneratorBackendOptions.fromContext(context);
2428
var backend = HtmlGeneratorBackend(
2529
options, templates, context.resourceProvider.pathContext);
@@ -37,14 +41,14 @@ class HtmlGeneratorBackend extends DartdocGeneratorBackend {
3741
super.generatePackage(writer, graph, package);
3842
// We have to construct the data again. This only happens once per package.
3943
TemplateData data = PackageTemplateData(options, graph, package);
40-
var content = renderError(data, templates.errorTemplate);
44+
var content = templates.renderError(data);
4145
write(writer, '__404error.html', data, content);
4246
}
4347

4448
@override
4549
Future<void> generateAdditionalFiles(
4650
FileWriter writer, PackageGraph graph) async {
47-
await _copyResources(writer);
51+
await _copyResources(writer, graph.resourceProvider);
4852
if (options.favicon != null) {
4953
// Allow overwrite of favicon.
5054
var bytes =
@@ -57,17 +61,18 @@ class HtmlGeneratorBackend extends DartdocGeneratorBackend {
5761
}
5862
}
5963

60-
Future<void> _copyResources(FileWriter writer) async {
64+
Future<void> _copyResources(
65+
FileWriter writer, ResourceProvider resourceProvider) async {
6166
for (var resourcePath in resources.resource_names) {
6267
if (!resourcePath.startsWith(_dartdocResourcePrefix)) {
6368
throw StateError('Resource paths must start with '
6469
'$_dartdocResourcePrefix, encountered $resourcePath');
6570
}
6671
var destFileName = resourcePath.substring(_dartdocResourcePrefix.length);
67-
var destFilePath = writer.resourceProvider.pathContext
68-
.join('static-assets', destFileName);
72+
var destFilePath =
73+
resourceProvider.pathContext.join('static-assets', destFileName);
6974
writer.writeBytes(destFilePath,
70-
await writer.resourceProvider.loadResourceAsBytes(resourcePath));
75+
await resourceProvider.loadResourceAsBytes(resourcePath));
7176
}
7277
}
7378

lib/src/generator/markdown_generator.dart

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@ import 'package:dartdoc/src/generator/generator.dart';
88
import 'package:dartdoc/src/generator/generator_frontend.dart';
99
import 'package:dartdoc/src/generator/template_data.dart';
1010
import 'package:dartdoc/src/generator/templates.dart';
11-
import 'package:dartdoc/src/generator/templates.runtime_renderers.dart';
1211
import 'package:dartdoc/src/model/package.dart';
1312
import 'package:dartdoc/src/model/package_graph.dart';
1413
import 'package:path/path.dart' as path show Context;
1514

16-
Future<Generator> initMarkdownGenerator(
17-
DartdocGeneratorOptionContext context) async {
15+
/// Creates a [Generator] with an [MarkdownGeneratorBackend] backend.
16+
///
17+
/// [forceRuntimeTemplates] should only be given [true] during tests.
18+
Future<Generator> initMarkdownGenerator(DartdocGeneratorOptionContext context,
19+
{bool forceRuntimeTemplates = false}) async {
1820
var templates = await Templates.fromContext(context);
1921
var options = DartdocGeneratorBackendOptions.fromContext(context);
2022
var backend = MarkdownGeneratorBackend(
@@ -33,7 +35,7 @@ class MarkdownGeneratorBackend extends DartdocGeneratorBackend {
3335
super.generatePackage(writer, graph, package);
3436
// We have to construct the data again. This only happens once per package.
3537
TemplateData data = PackageTemplateData(options, graph, package);
36-
var content = renderError(data, templates.errorTemplate);
38+
var content = templates.renderError(data);
3739
write(writer, '__404error.md', data, content);
3840
}
3941
}

lib/src/generator/resource_loader.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ extension ResourceLoader on ResourceProvider {
3232
return getFile(uri.toFilePath());
3333
}
3434

35+
Future<Folder> getResourceFolder(String path) async {
36+
var uri = await resolveResourceUri(Uri.parse(path));
37+
return getFolder(uri.toFilePath());
38+
}
39+
3540
/// Helper function for resolving to a non-relative, non-package URI.
3641
@visibleForTesting
3742
Future<Uri> resolveResourceUri(Uri uri) {

0 commit comments

Comments
 (0)