Skip to content

Commit 45d7e76

Browse files
authored
Fix runtime renderers rendering of certain sections (#2674)
Fix runtime renderers rendering of certain sections
1 parent 48f4706 commit 45d7e76

File tree

4 files changed

+34
-3
lines changed

4 files changed

+34
-3
lines changed

lib/src/mustachio/parser.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,6 @@ class MustachioParser {
255255
keySpanEndOffset - lastName.length, keySpanEndOffset);
256256
var section = Section([lastName], children,
257257
invert: invert, span: span, keySpan: lastNameSpan);
258-
//for (var sectionKey in parsedKey.names.reversed.skip(1)) {
259258
for (var i = parsedKey.names.length - 2; i >= 0; i--) {
260259
var sectionKey = parsedKey.names[i];
261260
// To find the start offset of the ith name, take the length of all of

lib/src/mustachio/renderer_base.dart

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,9 @@ abstract class RendererBase<T> {
146146
Template _template;
147147

148148
/// The output buffer into which [context] is rendered, using a template.
149-
final buffer = StringBuffer();
149+
// TODO(srawlins): Pass around a single [StringBuffer], and make this field
150+
// `final`.
151+
StringBuffer buffer = StringBuffer();
150152

151153
final Set<String> _invisibleGetters;
152154

@@ -239,7 +241,7 @@ abstract class RendererBase<T> {
239241
"Failed to resolve '$key' as a property on any types in the "
240242
'current context'));
241243
} else {
242-
return parent.section(node);
244+
return parent.withBuffer(buffer, () => parent.section(node));
243245
}
244246
}
245247

@@ -284,6 +286,16 @@ abstract class RendererBase<T> {
284286
renderBlock(partialTemplate.ast);
285287
_template = outerTemplate;
286288
}
289+
290+
/// Executes [fn] after replacing [buffer] with [newBuffer].
291+
///
292+
/// Replaces the previous buffer as [buffer].
293+
void withBuffer(StringBuffer newBuffer, void Function() fn) {
294+
var previousBuffer = buffer;
295+
buffer = newBuffer;
296+
fn();
297+
buffer = previousBuffer;
298+
}
287299
}
288300

289301
String renderSimple(Object context, List<MustachioNode> ast, Template template,

test/mustachio/aot_compiler_render_test.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,15 @@ void main() {
266266
expect(output, equals('Text Foo: hello'));
267267
});
268268

269+
test('Renderer renders a value section node keyed lower in the stack',
270+
() async {
271+
var output = await renderBar({
272+
'foo|lib/templates/html/bar.html':
273+
'Text {{#foo}}One {{#s2}}Two{{/s2}}{{/foo}}',
274+
}, '_i1.Bar()..foo = _i1.Foo()..s2 = "hello"');
275+
expect(output, equals('Text One Two'));
276+
});
277+
269278
test('Renderer renders a null value section node as blank', () async {
270279
var output = await renderFoo({
271280
'foo|lib/templates/html/foo.html':

test/mustachio/runtime_renderer_render_test.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,17 @@ void main() {
211211
expect(renderBar(bar, barTemplate), equals('Text Foo: hello'));
212212
});
213213

214+
test('Renderer renders a value section node keyed lower in the stack',
215+
() async {
216+
var barTemplateFile = getFile('/project/bar.mustache')
217+
..writeAsStringSync('Text {{#foo}}One {{#s2}}Two{{/s2}}{{/foo}}');
218+
var barTemplate = await Template.parse(barTemplateFile);
219+
var bar = Bar()
220+
..foo = Foo()
221+
..s2 = 'hello';
222+
expect(renderBar(bar, barTemplate), equals('Text One Two'));
223+
});
224+
214225
test('Renderer renders a null value section node as blank', () async {
215226
var fooTemplateFile = getFile('/project/foo.mustache')
216227
..writeAsStringSync('Text {{#s1}}"{{.}}" ({{length}}){{/s1}}');

0 commit comments

Comments
 (0)