Skip to content

Commit 26480a3

Browse files
authored
Add real mustachio annotation, and check in in-progress renderers. (#2430)
Add real mustachio annotation, and check in in-progress renderers. * Add mustachio to build.yaml * Add a class Renderer, meant to be used as an annotation * Add one @Renderer annotation to templates.dart * Add the generated templates.renderers.dart file. While in-progress, this library is valid Dart, and passes static analysis. Checking it in ensures that it will continue to be valid Dart, and pass static analysis. * Remove the abstract `getFields` method; the generated code doesn't implement it yet; this was checked in prematurely. * Remove the templateUri field from the mock Renderer class in the tests; this field won't be needed; template URIs are provided at runtime.
1 parent e9e2cfd commit 26480a3

File tree

9 files changed

+211
-23
lines changed

9 files changed

+211
-23
lines changed

build.yaml

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,28 @@ builders:
55
build_extensions: {'$lib$': ['src/generator/html_resources.g.dart']}
66
build_to: "source"
77
auto_apply: none
8+
mustachio_builder:
9+
import: "tool/mustachio/builder.dart"
10+
builder_factories: ["mustachioBuilder"]
11+
build_extensions: {".dart": [".renderers.dart"]}
12+
build_to: "source"
813

914
targets:
1015
builder:
11-
sources: ["tool/builder.dart"]
16+
sources:
17+
- tool/builder.dart
18+
- tool/mustachio/builder.dart
1219

1320
$default:
1421
sources:
15-
exclude: ["tool/builder.dart"]
22+
exclude:
23+
- tool/builder.dart
24+
- tool/mustachio/builder.dart
1625
builders:
1726
build_version:
1827
enabled: true
1928
dartdoc|resource_builder:
2029
enabled: true
30+
dartdoc|mustachio_builder:
31+
enabled: true
32+
generate_for: ["lib/src/generator/templates.dart"]

lib/src/generator/templates.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,17 @@
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+
// TODO(srawlins): Add Renderer annotations for more types as the mustachio
6+
// implementation matures.
7+
@Renderer(#renderIndex, Context<PackageTemplateData>())
58
library dartdoc.templates;
69

710
import 'dart:io' show File, Directory;
811

912
import 'package:dartdoc/dartdoc.dart';
1013
import 'package:dartdoc/src/generator/resource_loader.dart' as loader;
14+
import 'package:dartdoc/src/generator/template_data.dart';
15+
import 'package:dartdoc/src/mustachio/annotations.dart';
1116
import 'package:mustache/mustache.dart';
1217
import 'package:path/path.dart' as path;
1318

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
// GENERATED CODE. DO NOT EDIT.
2+
//
3+
// To change the contents of this library, make changes to the builder source
4+
// files in the tool/mustachio/ directory.
5+
6+
// ignore_for_file: camel_case_types, unused_element
7+
import 'package:dartdoc/src/generator/template_data.dart';
8+
import 'package:dartdoc/dartdoc.dart';
9+
import 'package:dartdoc/src/mustachio/renderer_base.dart';
10+
import 'package:dartdoc/src/mustachio/parser.dart';
11+
12+
String renderIndex(PackageTemplateData context, List<MustachioNode> ast) {
13+
var renderer = _Renderer_PackageTemplateData(context);
14+
renderer.renderBlock(ast);
15+
return renderer.buffer.toString();
16+
}
17+
18+
class _Renderer_PackageTemplateData extends RendererBase<PackageTemplateData> {
19+
_Renderer_PackageTemplateData(PackageTemplateData context) : super(context);
20+
}
21+
22+
String _render_Package(Package context, List<MustachioNode> ast) {
23+
var renderer = _Renderer_Package(context);
24+
renderer.renderBlock(ast);
25+
return renderer.buffer.toString();
26+
}
27+
28+
class _Renderer_Package extends RendererBase<Package> {
29+
_Renderer_Package(Package context) : super(context);
30+
}
31+
32+
String _render_LibraryContainer(
33+
LibraryContainer context, List<MustachioNode> ast) {
34+
var renderer = _Renderer_LibraryContainer(context);
35+
renderer.renderBlock(ast);
36+
return renderer.buffer.toString();
37+
}
38+
39+
class _Renderer_LibraryContainer extends RendererBase<LibraryContainer> {
40+
_Renderer_LibraryContainer(LibraryContainer context) : super(context);
41+
}
42+
43+
String _render_Object(Object context, List<MustachioNode> ast) {
44+
var renderer = _Renderer_Object(context);
45+
renderer.renderBlock(ast);
46+
return renderer.buffer.toString();
47+
}
48+
49+
class _Renderer_Object extends RendererBase<Object> {
50+
_Renderer_Object(Object context) : super(context);
51+
}
52+
53+
String _render_bool(bool context, List<MustachioNode> ast) {
54+
var renderer = _Renderer_bool(context);
55+
renderer.renderBlock(ast);
56+
return renderer.buffer.toString();
57+
}
58+
59+
class _Renderer_bool extends RendererBase<bool> {
60+
_Renderer_bool(bool context) : super(context);
61+
}
62+
63+
String _render_List<E>(List<E> context, List<MustachioNode> ast) {
64+
var renderer = _Renderer_List(context);
65+
renderer.renderBlock(ast);
66+
return renderer.buffer.toString();
67+
}
68+
69+
class _Renderer_List<E> extends RendererBase<List<E>> {
70+
_Renderer_List(List<E> context) : super(context);
71+
}
72+
73+
String _render_String(String context, List<MustachioNode> ast) {
74+
var renderer = _Renderer_String(context);
75+
renderer.renderBlock(ast);
76+
return renderer.buffer.toString();
77+
}
78+
79+
class _Renderer_String extends RendererBase<String> {
80+
_Renderer_String(String context) : super(context);
81+
}
82+
83+
String _render_TemplateData<T extends Documentable>(
84+
TemplateData<T> context, List<MustachioNode> ast) {
85+
var renderer = _Renderer_TemplateData(context);
86+
renderer.renderBlock(ast);
87+
return renderer.buffer.toString();
88+
}
89+
90+
class _Renderer_TemplateData<T extends Documentable>
91+
extends RendererBase<TemplateData<T>> {
92+
_Renderer_TemplateData(TemplateData<T> context) : super(context);
93+
}
94+
95+
String _render_TemplateOptions(
96+
TemplateOptions context, List<MustachioNode> ast) {
97+
var renderer = _Renderer_TemplateOptions(context);
98+
renderer.renderBlock(ast);
99+
return renderer.buffer.toString();
100+
}
101+
102+
class _Renderer_TemplateOptions extends RendererBase<TemplateOptions> {
103+
_Renderer_TemplateOptions(TemplateOptions context) : super(context);
104+
}
105+
106+
String _render_Documentable(Documentable context, List<MustachioNode> ast) {
107+
var renderer = _Renderer_Documentable(context);
108+
renderer.renderBlock(ast);
109+
return renderer.buffer.toString();
110+
}
111+
112+
class _Renderer_Documentable extends RendererBase<Documentable> {
113+
_Renderer_Documentable(Documentable context) : super(context);
114+
}
115+
116+
String _render_Nameable(Nameable context, List<MustachioNode> ast) {
117+
var renderer = _Renderer_Nameable(context);
118+
renderer.renderBlock(ast);
119+
return renderer.buffer.toString();
120+
}
121+
122+
class _Renderer_Nameable extends RendererBase<Nameable> {
123+
_Renderer_Nameable(Nameable context) : super(context);
124+
}
125+
126+
String _render_int(int context, List<MustachioNode> ast) {
127+
var renderer = _Renderer_int(context);
128+
renderer.renderBlock(ast);
129+
return renderer.buffer.toString();
130+
}
131+
132+
class _Renderer_int extends RendererBase<int> {
133+
_Renderer_int(int context) : super(context);
134+
}
135+
136+
String _render_num(num context, List<MustachioNode> ast) {
137+
var renderer = _Renderer_num(context);
138+
renderer.renderBlock(ast);
139+
return renderer.buffer.toString();
140+
}
141+
142+
class _Renderer_num extends RendererBase<num> {
143+
_Renderer_num(num context) : super(context);
144+
}
145+
146+
String _render_Type(Type context, List<MustachioNode> ast) {
147+
var renderer = _Renderer_Type(context);
148+
renderer.renderBlock(ast);
149+
return renderer.buffer.toString();
150+
}
151+
152+
class _Renderer_Type extends RendererBase<Type> {
153+
_Renderer_Type(Type context) : super(context);
154+
}

lib/src/mustachio/annotations.dart

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/// Specifies information for generating a Mustache renderer for a [context]
2+
/// object, using a Mustache template at [templateUri]
3+
class Renderer {
4+
/// The name of the render function to generate.
5+
final Symbol name;
6+
7+
/// The type of the context type, specified as the [Context] type argument.
8+
final Context context;
9+
10+
const Renderer(this.name, this.context);
11+
}
12+
13+
/// A container for a type, [T], which is the type of a context object,
14+
/// referenced in a `@Renderer` annotation.
15+
///
16+
/// An instance of this class holds zero information, except for [T], a type.
17+
class Context<T> {
18+
const Context();
19+
}

lib/src/mustachio/renderer_base.dart

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@ abstract class RendererBase<T> {
2222
if (node is Text) {
2323
write(node.content);
2424
} else if (node is Variable) {
25-
var content = getFields(node.key);
26-
write(content);
25+
// TODO(srawlins): Implement.
2726
} else if (node is Section) {
2827
section(node);
2928
} else if (node is Partial) {
@@ -39,12 +38,4 @@ abstract class RendererBase<T> {
3938
void partial(Partial node) {
4039
// TODO(srawlins): Implement.
4140
}
42-
43-
/// Resolves [key] into one or more field accesses, returning the result as a
44-
/// String.
45-
///
46-
/// [key] may have multiple dot-separate names, and [key] may not be a valid
47-
/// property of _this_ context type, in which the [parent] renderer is
48-
/// referenced.
49-
String getFields(List<String> names);
5041
}

test/mustachio/builder_test.dart

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,7 @@ class Renderer {
1313
1414
final Context context;
1515
16-
final String templateUri;
17-
18-
const Renderer(this.name, this.context, this.templateUri);
16+
const Renderer(this.name, this.context);
1917
}
2018
2119
class Context<T> {
@@ -25,7 +23,7 @@ class Context<T> {
2523
};
2624

2725
const _libraryFrontMatter = '''
28-
@Renderer(#renderFoo, Context<Foo>(), 'foo.html.mustache')
26+
@Renderer(#renderFoo, Context<Foo>())
2927
library foo;
3028
import 'package:mustachio/annotations.dart';
3129
''';
@@ -118,8 +116,8 @@ class _Renderer_Object extends RendererBase<Object> {
118116
class Foo {}
119117
class Bar {}
120118
''', libraryFrontMatter: '''
121-
@Renderer(#renderFoo, Context<Foo>(), 'foo.html.mustache')
122-
@Renderer(#renderBar, Context<Bar>(), 'bar.html.mustache')
119+
@Renderer(#renderFoo, Context<Foo>())
120+
@Renderer(#renderBar, Context<Bar>())
123121
library foo;
124122
import 'package:mustachio/annotations.dart';
125123
''');

tool/grind.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -940,6 +940,7 @@ Future<void> build() async {
940940
final _generated_files_list = <String>[
941941
'../dartdoc_options.yaml',
942942
'src/generator/html_resources.g.dart',
943+
'src/generator/templates.renderers.dart',
943944
'src/version.dart',
944945
].map((s) => path.joinAll(path.posix.split(s)));
945946

tool/mustachio/builder.dart

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,6 @@ class _RendererGatherer {
8080
var contextFieldType = contextField.type;
8181
assert(contextFieldType.typeArguments.length == 1);
8282
var contextType = contextFieldType.typeArguments.single;
83-
var templateUriField = constantValue.getField('templateUri');
84-
if (templateUriField.isNull) {
85-
throw StateError('@Renderer templateUri must not be null');
86-
}
8783

8884
return RendererSpec(nameField.toSymbolValue(), contextType);
8985
}

tool/mustachio/codegen_runtime_renderer.dart

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,20 @@ class RuntimeRenderersBuilder {
4343
RuntimeRenderersBuilder();
4444

4545
String _buildTemplateRenderers(Set<RendererSpec> specs) {
46+
// TODO(srawlins): There are some private renderer functions that are
47+
// unused. Figure out if we can detect these statically, and then not
48+
// generate them.
49+
// TODO(srawlins): To really get the correct list of imports, we need to use
50+
// the code_builder package.
4651
_buffer.writeln('''
47-
// ignore_for_file: camel_case_types
52+
// GENERATED CODE. DO NOT EDIT.
53+
//
54+
// To change the contents of this library, make changes to the builder source
55+
// files in the tool/mustachio/ directory.
56+
57+
// ignore_for_file: camel_case_types, unused_element
58+
import 'package:dartdoc/src/generator/template_data.dart';
59+
import 'package:dartdoc/dartdoc.dart';
4860
import 'package:dartdoc/src/mustachio/renderer_base.dart';
4961
import 'package:dartdoc/src/mustachio/parser.dart';
5062
''');

0 commit comments

Comments
 (0)