Skip to content

Commit caa8b08

Browse files
committed
Remove Templates.fromContext and as a result, make code more synchronous.
Since "runtime template" support was removed, we could remove the `forceRuntimeTemplates` parameter from `Templates.fromContext`. However, the result of this is that calling `Templates.fromContext` would not need the `DartdocGeneratorOptionContext` parameter either, and is then just an alias for the `HtmlAotTemplates` constructor. So we can remove the function altogether. Since we no longer need to `await` the result of calling this function (which is now a constructor call), we can make more and more functions synchronous (see https://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/): `bin/dartdoc.dart`'s `main`, `Dartdoc.fromContext` (which can new be a factory constructor), `initHtmlGenerator`, `buildDartdoc`, `generatorContextFromArgv`, `createPackageBuilder`. We can also remove some more code that becomes dead: `RuntimeTemplates._create`, ResourceProvider utilities, and some trivial `buildDartdoc` test helpers.
1 parent 8e6a95c commit caa8b08

15 files changed

+57
-316
lines changed

bin/dartdoc.dart

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
import 'dart:async';
6-
75
import 'package:dartdoc/src/dartdoc.dart';
86
import 'package:dartdoc/src/dartdoc_options.dart';
97
import 'package:dartdoc/src/model/model.dart';
@@ -12,7 +10,7 @@ import 'package:dartdoc/src/package_meta.dart';
1210

1311
/// Analyzes Dart files and generates a representation of included libraries,
1412
/// classes, and members. Uses the current directory to look for libraries.
15-
Future<void> main(List<String> arguments) async {
13+
void main(List<String> arguments) {
1614
var config = parseOptions(pubPackageMetaProvider, arguments);
1715
if (config == null) {
1816
// Do not run dartdoc as there was either a fatal error parsing options, or
@@ -23,7 +21,7 @@ Future<void> main(List<String> arguments) async {
2321
final packageBuilder =
2422
PubPackageBuilder(config, pubPackageMetaProvider, packageConfigProvider);
2523
final dartdoc = config.generateDocs
26-
? await Dartdoc.fromContext(config, packageBuilder)
24+
? Dartdoc.fromContext(config, packageBuilder)
2725
: Dartdoc.withEmptyGenerator(config, packageBuilder);
2826
dartdoc.executeGuarded();
2927
}

lib/src/dartdoc.dart

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ class Dartdoc {
145145
set generator(Generator newGenerator) => _generator = newGenerator;
146146

147147
/// Factory method that builds Dartdoc with an empty generator.
148-
static Dartdoc withEmptyGenerator(
148+
factory Dartdoc.withEmptyGenerator(
149149
DartdocOptionContext config,
150150
PackageBuilder packageBuilder,
151151
) {
@@ -157,12 +157,11 @@ class Dartdoc {
157157
);
158158
}
159159

160-
/// Asynchronous factory method that builds Dartdoc with a generator
161-
/// determined by the given context.
162-
static Future<Dartdoc> fromContext(
160+
/// Builds Dartdoc with a generator determined by [context].
161+
factory Dartdoc.fromContext(
163162
DartdocGeneratorOptionContext context,
164163
PackageBuilder packageBuilder,
165-
) async {
164+
) {
166165
var resourceProvider = context.resourceProvider;
167166
var outputPath = resourceProvider.pathContext.absolute(context.output);
168167
var outputDir = resourceProvider.getFolder(outputPath)..create();
@@ -175,7 +174,7 @@ class Dartdoc {
175174
return Dartdoc._(
176175
context,
177176
outputDir,
178-
await initHtmlGenerator(context, writer: writer),
177+
initHtmlGenerator(context, writer: writer),
179178
packageBuilder,
180179
);
181180
}

lib/src/generator/html_generator.dart

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,13 @@ import 'package:dartdoc/src/generator/template_data.dart';
1212
import 'package:dartdoc/src/generator/templates.dart';
1313
import 'package:dartdoc/src/model/model.dart';
1414
import 'package:dartdoc/src/runtime_stats.dart';
15-
import 'package:meta/meta.dart';
1615

1716
/// Creates a [Generator] with an [HtmlGeneratorBackend] backend.
18-
///
19-
/// [forceRuntimeTemplates] should only be given `true` during tests.
20-
Future<Generator> initHtmlGenerator(
17+
Generator initHtmlGenerator(
2118
DartdocGeneratorOptionContext context, {
2219
required FileWriter writer,
23-
@visibleForTesting bool forceRuntimeTemplates = false,
24-
}) async {
25-
var templates = await Templates.fromContext(context,
26-
forceRuntimeTemplates: forceRuntimeTemplates);
20+
}) {
21+
var templates = HtmlAotTemplates();
2722
var options = DartdocGeneratorBackendOptions.fromContext(context);
2823
var backend = HtmlGeneratorBackend(
2924
options, templates, writer, context.resourceProvider);

lib/src/generator/resource_loader.dart

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,33 +5,12 @@
55
/// Make it possible to load resources from the dartdoc code repository.
66
library;
77

8-
import 'dart:convert' show utf8;
98
import 'dart:isolate' show Isolate;
9+
1010
import 'package:analyzer/file_system/file_system.dart';
1111
import 'package:meta/meta.dart';
1212

1313
extension ResourceLoader on ResourceProvider {
14-
/// Loads a `package:` resource as a String.
15-
Future<String> loadResourceAsString(String path) async {
16-
var bytes = await loadResourceAsBytes(path);
17-
18-
return utf8.decode(bytes);
19-
}
20-
21-
/// Loads a `package:` resource as an [List<int>].
22-
Future<List<int>> loadResourceAsBytes(String path) async {
23-
if (!path.startsWith('package:')) {
24-
throw ArgumentError('path must begin with package:');
25-
}
26-
27-
return (await getResourceFile(path)).readAsBytesSync();
28-
}
29-
30-
Future<File> getResourceFile(String path) async {
31-
var uri = await resolveResourceUri(Uri.parse(path));
32-
return getFile(uri.toFilePath());
33-
}
34-
3514
Future<Folder> getResourceFolder(String path) async {
3615
var uri = await resolveResourceUri(Uri.parse(path));
3716
return getFolder(uri.toFilePath());

lib/src/generator/templates.dart

Lines changed: 2 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,7 @@
4242
@Renderer(#renderTypedef, Context<TypedefTemplateData>(), 'typedef')
4343
library;
4444

45-
import 'package:analyzer/file_system/file_system.dart';
46-
import 'package:dartdoc/src/dartdoc_options.dart';
4745
import 'package:dartdoc/src/element_type.dart';
48-
import 'package:dartdoc/src/failure.dart';
49-
import 'package:dartdoc/src/generator/resource_loader.dart';
5046
import 'package:dartdoc/src/generator/template_data.dart';
5147
import 'package:dartdoc/src/generator/templates.aot_renderers_for_html.dart'
5248
as aot_renderers_for_html;
@@ -115,23 +111,6 @@ abstract class Templates {
115111
String renderSidebarForLibrary(TemplateDataWithLibrary<Documentable> context);
116112
String renderTopLevelProperty(TopLevelPropertyTemplateData context);
117113
String renderTypedef(TypedefTemplateData context);
118-
119-
/// Creates a [Templates] instance from the default set of templates.
120-
///
121-
/// [forceRuntimeTemplates] should only be given `true` during tests.
122-
static Future<Templates> fromContext(DartdocGeneratorOptionContext context,
123-
// TODO(srawlins): Remove this option, as runtime templates are no longer
124-
// supported.
125-
{bool forceRuntimeTemplates = false}) async {
126-
if (forceRuntimeTemplates) {
127-
var directory = await context.resourceProvider
128-
.getResourceFolder('package:dartdoc/templates');
129-
return RuntimeTemplates._create(directory,
130-
resourceProvider: context.resourceProvider);
131-
} else {
132-
return HtmlAotTemplates();
133-
}
134-
}
135114
}
136115

137116
/// The [Templates] implementation which uses the render functions generated
@@ -221,6 +200,8 @@ class HtmlAotTemplates implements Templates {
221200
}
222201

223202
/// The collection of [Template] objects parsed at runtime.
203+
// TODO(srawlins): Remove this class, and `templates.runtime_renderers.dart`, as
204+
// runtime templates are no longer supported.
224205
class RuntimeTemplates implements Templates {
225206
@override
226207
String renderCategory(CategoryTemplateData context) =>
@@ -325,59 +306,6 @@ class RuntimeTemplates implements Templates {
325306
final Template _topLevelPropertyTemplate;
326307
final Template _typedefTemplate;
327308

328-
/// Creates a [Templates] from a custom set of template files, found in [dir].
329-
static Future<Templates> _create(Folder dir,
330-
{required ResourceProvider resourceProvider}) async {
331-
Future<Template> loadTemplate(String templatePath) {
332-
var templateFile = dir.getChildAssumingFile('$templatePath.html');
333-
if (!templateFile.exists) {
334-
throw DartdocFailure(
335-
'Missing required template file: $templatePath.html');
336-
}
337-
return Template.parse(templateFile,
338-
partialResolver: (String partialName) async =>
339-
dir.getChildAssumingFile('_$partialName.html'));
340-
}
341-
342-
var indexTemplate = await loadTemplate('index');
343-
var libraryTemplate = await loadTemplate('library');
344-
var searchPageTemplate = await loadTemplate('search');
345-
var sidebarContainerTemplate = await loadTemplate('_sidebar_for_container');
346-
var sidebarLibraryTemplate = await loadTemplate('_sidebar_for_library');
347-
var categoryTemplate = await loadTemplate('category');
348-
var classTemplate = await loadTemplate('class');
349-
var constructorTemplate = await loadTemplate('constructor');
350-
var enumTemplate = await loadTemplate('enum');
351-
var errorTemplate = await loadTemplate('404error');
352-
var extensionTemplate = await loadTemplate('extension');
353-
var functionTemplate = await loadTemplate('function');
354-
var methodTemplate = await loadTemplate('method');
355-
var mixinTemplate = await loadTemplate('mixin');
356-
var propertyTemplate = await loadTemplate('property');
357-
var topLevelPropertyTemplate = await loadTemplate('top_level_property');
358-
var typeDefTemplate = await loadTemplate('typedef');
359-
360-
return RuntimeTemplates._(
361-
categoryTemplate,
362-
libraryTemplate,
363-
classTemplate,
364-
constructorTemplate,
365-
enumTemplate,
366-
errorTemplate,
367-
extensionTemplate,
368-
functionTemplate,
369-
indexTemplate,
370-
methodTemplate,
371-
mixinTemplate,
372-
propertyTemplate,
373-
searchPageTemplate,
374-
sidebarContainerTemplate,
375-
sidebarLibraryTemplate,
376-
topLevelPropertyTemplate,
377-
typeDefTemplate,
378-
);
379-
}
380-
381309
RuntimeTemplates._(
382310
this._categoryTemplate,
383311
this._libraryTemplate,

test/dartdoc_test_base.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,15 +131,15 @@ $libraryContent
131131
.named(libraryName);
132132
}
133133

134-
Future<Dartdoc> buildDartdoc({
134+
Dartdoc buildDartdoc({
135135
List<String> excludeLibraries = const [],
136136
List<String> additionalArguments = const [],
137137
bool skipUnreachableSdkLibraries = true,
138138
bool useJson = false,
139-
}) async {
139+
}) {
140140
final dir = resourceProvider.getFolder(resourceProvider.pathContext
141141
.absolute(resourceProvider.pathContext.normalize(packagePath)));
142-
final context = await generatorContextFromArgv([
142+
final context = generatorContextFromArgv([
143143
'--input',
144144
dir.path,
145145
'--output',
@@ -165,7 +165,7 @@ $libraryContent
165165
outSink: outBuffer,
166166
errSink: errBuffer,
167167
);
168-
return await Dartdoc.fromContext(context, packageBuilder);
168+
return Dartdoc.fromContext(context, packageBuilder);
169169
}
170170

171171
/// The real offset in a library generated with [bootPackageWithLibrary].

test/end2end/dartdoc_test.dart

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
import 'dart:async';
6-
75
import 'package:analyzer/file_system/file_system.dart';
86
import 'package:dartdoc/src/dartdoc.dart' show Dartdoc, DartdocResults;
97
import 'package:dartdoc/src/dartdoc_options.dart';
@@ -63,13 +61,13 @@ void main() {
6361
tempDir.delete();
6462
});
6563

66-
Future<Dartdoc> buildDartdoc(
67-
List<String> argv, Folder packageRoot, Folder tempDir) async {
68-
var context = await generatorContextFromArgv(
64+
Dartdoc buildDartdoc(
65+
List<String> argv, Folder packageRoot, Folder tempDir) {
66+
var context = generatorContextFromArgv(
6967
[...argv, '--input', packageRoot.path, '--output', tempDir.path],
7068
pubPackageMetaProvider);
7169

72-
return await Dartdoc.fromContext(
70+
return Dartdoc.fromContext(
7371
context,
7472
PubPackageBuilder(
7573
context, pubPackageMetaProvider, PhysicalPackageConfigProvider(),
@@ -79,7 +77,7 @@ void main() {
7977

8078
test('errors generate errors even when warnings are off', () async {
8179
var dartdoc =
82-
await buildDartdoc(['--allow-tools'], testPackageToolError, tempDir);
80+
buildDartdoc(['--allow-tools'], testPackageToolError, tempDir);
8381
var results = await dartdoc.generateDocsBase();
8482
var p = results.packageGraph;
8583
var unresolvedToolErrors = p.packageWarningCounter.countedWarnings.values
@@ -93,8 +91,8 @@ void main() {
9391
});
9492

9593
test('basic interlinking test', () async {
96-
var dartdoc = await buildDartdoc(
97-
['--exclude-packages=args'], _testPackageDir, tempDir);
94+
var dartdoc =
95+
buildDartdoc(['--exclude-packages=args'], _testPackageDir, tempDir);
9896
var results = await dartdoc.generateDocs();
9997
var p = results.packageGraph;
10098
var meta = p.publicPackages.firstWhere((p) => p.name == 'meta');
@@ -123,7 +121,7 @@ void main() {
123121

124122
setUpAll(() async {
125123
tempDir = _resourceProvider.createSystemTemp('dartdoc.test.');
126-
var dartdoc = await buildDartdoc([], _testPackageDir, tempDir);
124+
var dartdoc = buildDartdoc([], _testPackageDir, tempDir);
127125
results = await dartdoc.generateDocs();
128126
});
129127

@@ -145,7 +143,7 @@ void main() {
145143
test('generate docs for ${path.basename(_testPackageBadDir.path)} fails',
146144
skip: 'Blocked on getting analysis errors with correct interpretation '
147145
'from analysis_options', () async {
148-
var dartdoc = await buildDartdoc([], _testPackageBadDir, tempDir);
146+
var dartdoc = buildDartdoc([], _testPackageBadDir, tempDir);
149147

150148
try {
151149
await dartdoc.generateDocs();
@@ -156,7 +154,7 @@ void main() {
156154
});
157155

158156
test('generate docs for package with embedder yaml', () async {
159-
var dartdoc = await buildDartdoc([], _testSkyEnginePackage, tempDir);
157+
var dartdoc = buildDartdoc([], _testSkyEnginePackage, tempDir);
160158

161159
var results = await dartdoc.generateDocs();
162160
expect(results.packageGraph, isNotNull);
@@ -188,7 +186,7 @@ void main() {
188186

189187
test('rel canonical prefix does not include base href', () async {
190188
final prefix = 'foo.bar/baz';
191-
var dartdoc = await buildDartdoc(
189+
var dartdoc = buildDartdoc(
192190
['--rel-canonical-prefix', prefix], _testPackageDir, tempDir);
193191
await dartdoc.generateDocsBase();
194192

0 commit comments

Comments
 (0)