Skip to content

Commit

Permalink
feature: Dart 2.x ready, works with reflectable
Browse files Browse the repository at this point in the history
  • Loading branch information
MikeMitterer committed Jun 7, 2018
1 parent feb25a7 commit ab012d3
Show file tree
Hide file tree
Showing 22 changed files with 338 additions and 45 deletions.
15 changes: 15 additions & 0 deletions .analysis_options.yaml
@@ -0,0 +1,15 @@
# ------------------------------------------------------------------------------
# Config for Analyzer
# More: https://pub.dartlang.org/packages/analyzer
#
# Analyzer options:
# https://www.dartlang.org/guides/language/analysis-options
#

analyzer:
strong-mode: true

# Exclude wegen https://github.com/dart-lang/sdk/issues/26420
# und https://github.com/dart-lang/test/issues/436
# exclude:
# - test/**
28 changes: 28 additions & 0 deletions example/basic.reflectable.dart
@@ -0,0 +1,28 @@
// This file has been generated by the reflectable package.
// https://github.com/dart-lang/reflectable.

import "dart:core";
import 'package:mustache/mustache.dart' as prefix0;

// ignore:unused_import
import "package:reflectable/mirrors.dart" as m;
// ignore:unused_import
import "package:reflectable/src/reflectable_transformer_based.dart" as r;
// ignore:unused_import
import "package:reflectable/reflectable.dart" show isTransformed;

final _data = {const prefix0.MustacheMirrorsUsedAnnotation(): new r.ReflectorData(<m.TypeMirror>[], <m.DeclarationMirror>[], <m.ParameterMirror>[], <Type>[], 0, {}, {}, null, [])};


final _memberSymbolMap = null;

initializeReflectable() {
if (!isTransformed) {
throw new UnsupportedError(
"The transformed code is running with the untransformed "
"reflectable package. Remember to set your package-root to "
"'build/.../packages'.");
}
r.data = _data;
r.memberSymbolMap = _memberSymbolMap;
}
13 changes: 4 additions & 9 deletions example/browser/reflection/pubspec.yaml
Expand Up @@ -9,19 +9,14 @@ environment:
sdk: '>=1.0.0 <2.0.0' sdk: '>=1.0.0 <2.0.0'


dependencies: dependencies:
browser: '>=0.10.0 <0.11.0'
dart_to_js_script_rewriter: '^0.1.0'


mustache: mustache:
path: ../../../ path: ../../../


dev_dependencies: dev_dependencies:
reflectable: '^0.5.0'


transformers: build_runner: ^0.8.0
- dart_to_js_script_rewriter build_test: ^0.10.0
build_web_compilers: ^0.4.0



- reflectable:
entry_points:
- web/main.dart # The path to your main file
# formatted: true # Optional.
2 changes: 1 addition & 1 deletion example/browser/reflection/web/index.html
Expand Up @@ -14,7 +14,7 @@
<title>reflection</title> <title>reflection</title>
<link rel="stylesheet" href="styles.css"> <link rel="stylesheet" href="styles.css">
<script async src="main.dart" type="application/dart"></script> <script async src="main.dart" type="application/dart"></script>
<script async src="packages/browser/dart.js"></script> <script defer src="main.dart.js"></script>
</head> </head>


<body> <body>
Expand Down
4 changes: 4 additions & 0 deletions example/browser/reflection/web/main.dart
Expand Up @@ -4,6 +4,8 @@
import 'dart:html' as dom; import 'dart:html' as dom;
import 'package:mustache/mustache.dart'; import 'package:mustache/mustache.dart';


import 'main.reflectable.dart';

@mustache @mustache
class Version { class Version {
final int major; final int major;
Expand All @@ -22,6 +24,8 @@ class DartLang {
} }


void main() { void main() {
initializeReflectable();

final Template template = new Template( final Template template = new Template(
""" """
<div> <div>
Expand Down
29 changes: 29 additions & 0 deletions example/browser/reflection/web/main.reflectable.dart
@@ -0,0 +1,29 @@
// This file has been generated by the reflectable package.
// https://github.com/dart-lang/reflectable.

import "dart:core";
import 'main.dart' as prefix1;
import 'package:mustache/mustache.dart' as prefix0;

// ignore:unused_import
import "package:reflectable/mirrors.dart" as m;
// ignore:unused_import
import "package:reflectable/src/reflectable_transformer_based.dart" as r;
// ignore:unused_import
import "package:reflectable/reflectable.dart" show isTransformed;

final _data = {const prefix0.MustacheMirrorsUsedAnnotation(): new r.ReflectorData(<m.TypeMirror>[new r.NonGenericClassMirrorImpl(r"Version", r".Version", 7, 0, const prefix0.MustacheMirrorsUsedAnnotation(), const <int>[0, 1, 7], const <int>[8, 9, 10, 11, 12, 5, 6], const <int>[], -1, {}, {}, {r"": (b) => (major, minor) => b ? new prefix1.Version(major, minor) : null}, -1, -1, const <int>[-1], null, null), new r.NonGenericClassMirrorImpl(r"DartLang", r".DartLang", 7, 1, const prefix0.MustacheMirrorsUsedAnnotation(), const <int>[2, 3, 4, 16], const <int>[8, 9, 10, 11, 12, 13, 14, 15], const <int>[], -1, {}, {}, {r"": (b) => (name, version, message) => b ? new prefix1.DartLang(name, version, message) : null}, -1, -1, const <int>[-1], null, null)], <m.DeclarationMirror>[new r.VariableMirrorImpl(r"major", 33797, 0, const prefix0.MustacheMirrorsUsedAnnotation(), -1, 2, 2, null), new r.VariableMirrorImpl(r"minor", 33797, 0, const prefix0.MustacheMirrorsUsedAnnotation(), -1, 2, 2, null), new r.VariableMirrorImpl(r"name", 33797, 1, const prefix0.MustacheMirrorsUsedAnnotation(), -1, 3, 3, null), new r.VariableMirrorImpl(r"version", 33797, 1, const prefix0.MustacheMirrorsUsedAnnotation(), 0, 0, 0, null), new r.VariableMirrorImpl(r"message", 33797, 1, const prefix0.MustacheMirrorsUsedAnnotation(), -1, 3, 3, null), new r.ImplicitGetterMirrorImpl(const prefix0.MustacheMirrorsUsedAnnotation(), 0, 2, 2, 5), new r.ImplicitGetterMirrorImpl(const prefix0.MustacheMirrorsUsedAnnotation(), 1, 2, 2, 6), new r.MethodMirrorImpl(r"", 0, 0, -1, 0, 0, const <int>[0, 1], const prefix0.MustacheMirrorsUsedAnnotation(), null), new r.MethodMirrorImpl(r"==", 131074, null, -1, 4, 4, const <int>[2], const prefix0.MustacheMirrorsUsedAnnotation(), null), new r.MethodMirrorImpl(r"toString", 131074, null, -1, 3, 3, const <int>[], const prefix0.MustacheMirrorsUsedAnnotation(), null), new r.MethodMirrorImpl(r"noSuchMethod", 65538, null, null, null, null, const <int>[3], const prefix0.MustacheMirrorsUsedAnnotation(), null), new r.MethodMirrorImpl(r"hashCode", 131075, null, -1, 2, 2, const <int>[], const prefix0.MustacheMirrorsUsedAnnotation(), null), new r.MethodMirrorImpl(r"runtimeType", 131075, null, -1, 5, 5, const <int>[], const prefix0.MustacheMirrorsUsedAnnotation(), null), new r.ImplicitGetterMirrorImpl(const prefix0.MustacheMirrorsUsedAnnotation(), 2, 3, 3, 13), new r.ImplicitGetterMirrorImpl(const prefix0.MustacheMirrorsUsedAnnotation(), 3, 0, 0, 14), new r.ImplicitGetterMirrorImpl(const prefix0.MustacheMirrorsUsedAnnotation(), 4, 3, 3, 15), new r.MethodMirrorImpl(r"", 0, 1, -1, 1, 1, const <int>[4, 5, 6], const prefix0.MustacheMirrorsUsedAnnotation(), null)], <m.ParameterMirror>[new r.ParameterMirrorImpl(r"major", 32774, 7, const prefix0.MustacheMirrorsUsedAnnotation(), -1, 2, 2, null, null, null), new r.ParameterMirrorImpl(r"minor", 32774, 7, const prefix0.MustacheMirrorsUsedAnnotation(), -1, 2, 2, null, null, null), new r.ParameterMirrorImpl(r"other", 16390, 8, const prefix0.MustacheMirrorsUsedAnnotation(), null, null, null, null, null, null), new r.ParameterMirrorImpl(r"invocation", 32774, 10, const prefix0.MustacheMirrorsUsedAnnotation(), -1, 6, 6, null, null, null), new r.ParameterMirrorImpl(r"name", 32774, 16, const prefix0.MustacheMirrorsUsedAnnotation(), -1, 3, 3, null, null, null), new r.ParameterMirrorImpl(r"version", 32774, 16, const prefix0.MustacheMirrorsUsedAnnotation(), 0, 0, 0, null, null, null), new r.ParameterMirrorImpl(r"message", 32774, 16, const prefix0.MustacheMirrorsUsedAnnotation(), -1, 3, 3, null, null, null)], <Type>[prefix1.Version, prefix1.DartLang, int, String, bool, Type, Invocation], 2, {r"==": (dynamic instance) => (x) => instance == x, r"toString": (dynamic instance) => instance.toString, r"noSuchMethod": (dynamic instance) => instance.noSuchMethod, r"hashCode": (dynamic instance) => instance.hashCode, r"runtimeType": (dynamic instance) => instance.runtimeType, r"major": (dynamic instance) => instance.major, r"minor": (dynamic instance) => instance.minor, r"name": (dynamic instance) => instance.name, r"version": (dynamic instance) => instance.version, r"message": (dynamic instance) => instance.message}, {}, null, [])};


final _memberSymbolMap = null;

initializeReflectable() {
if (!isTransformed) {
throw new UnsupportedError(
"The transformed code is running with the untransformed "
"reflectable package. Remember to set your package-root to "
"'build/.../packages'.");
}
r.data = _data;
r.memberSymbolMap = _memberSymbolMap;
}
2 changes: 1 addition & 1 deletion example/lambdas.dart
Expand Up @@ -2,7 +2,7 @@ import 'package:mustache/mustache.dart';


main() { main() {
var t = new Template('{{ foo }}'); var t = new Template('{{ foo }}');
var lambda = (_) => 'bar'; var lambda = (LambdaContext ctx) => 'bar';
var output = t.renderString({'foo': lambda}); // bar var output = t.renderString({'foo': lambda}); // bar
print(output); print(output);


Expand Down
28 changes: 28 additions & 0 deletions example/lambdas.reflectable.dart
@@ -0,0 +1,28 @@
// This file has been generated by the reflectable package.
// https://github.com/dart-lang/reflectable.

import "dart:core";
import 'package:mustache/mustache.dart' as prefix0;

// ignore:unused_import
import "package:reflectable/mirrors.dart" as m;
// ignore:unused_import
import "package:reflectable/src/reflectable_transformer_based.dart" as r;
// ignore:unused_import
import "package:reflectable/reflectable.dart" show isTransformed;

final _data = {const prefix0.MustacheMirrorsUsedAnnotation(): new r.ReflectorData(<m.TypeMirror>[], <m.DeclarationMirror>[], <m.ParameterMirror>[], <Type>[], 0, {}, {}, null, [])};


final _memberSymbolMap = null;

initializeReflectable() {
if (!isTransformed) {
throw new UnsupportedError(
"The transformed code is running with the untransformed "
"reflectable package. Remember to set your package-root to "
"'build/.../packages'.");
}
r.data = _data;
r.memberSymbolMap = _memberSymbolMap;
}
28 changes: 28 additions & 0 deletions example/nested_paths.reflectable.dart
@@ -0,0 +1,28 @@
// This file has been generated by the reflectable package.
// https://github.com/dart-lang/reflectable.

import "dart:core";
import 'package:mustache/mustache.dart' as prefix0;

// ignore:unused_import
import "package:reflectable/mirrors.dart" as m;
// ignore:unused_import
import "package:reflectable/src/reflectable_transformer_based.dart" as r;
// ignore:unused_import
import "package:reflectable/reflectable.dart" show isTransformed;

final _data = {const prefix0.MustacheMirrorsUsedAnnotation(): new r.ReflectorData(<m.TypeMirror>[], <m.DeclarationMirror>[], <m.ParameterMirror>[], <Type>[], 0, {}, {}, null, [])};


final _memberSymbolMap = null;

initializeReflectable() {
if (!isTransformed) {
throw new UnsupportedError(
"The transformed code is running with the untransformed "
"reflectable package. Remember to set your package-root to "
"'build/.../packages'.");
}
r.data = _data;
r.memberSymbolMap = _memberSymbolMap;
}
28 changes: 28 additions & 0 deletions example/partials.reflectable.dart
@@ -0,0 +1,28 @@
// This file has been generated by the reflectable package.
// https://github.com/dart-lang/reflectable.

import "dart:core";
import 'package:mustache/mustache.dart' as prefix0;

// ignore:unused_import
import "package:reflectable/mirrors.dart" as m;
// ignore:unused_import
import "package:reflectable/src/reflectable_transformer_based.dart" as r;
// ignore:unused_import
import "package:reflectable/reflectable.dart" show isTransformed;

final _data = {const prefix0.MustacheMirrorsUsedAnnotation(): new r.ReflectorData(<m.TypeMirror>[], <m.DeclarationMirror>[], <m.ParameterMirror>[], <Type>[], 0, {}, {}, null, [])};


final _memberSymbolMap = null;

initializeReflectable() {
if (!isTransformed) {
throw new UnsupportedError(
"The transformed code is running with the untransformed "
"reflectable package. Remember to set your package-root to "
"'build/.../packages'.");
}
r.data = _data;
r.memberSymbolMap = _memberSymbolMap;
}
19 changes: 10 additions & 9 deletions lib/mustache.dart
Expand Up @@ -5,6 +5,16 @@ library mustache;
import 'package:reflectable/reflectable.dart'; import 'package:reflectable/reflectable.dart';
import 'src/template.dart' as t; import 'src/template.dart' as t;


class MustacheMirrorsUsedAnnotation extends Reflectable {
const MustacheMirrorsUsedAnnotation() : super(
invokingCapability,
reflectedTypeCapability
);
}

const MustacheMirrorsUsedAnnotation mustache = const MustacheMirrorsUsedAnnotation();


/// Use new Template(source) instead. /// Use new Template(source) instead.
@deprecated @deprecated
Template parse(String source, {bool lenient: false}) => Template parse(String source, {bool lenient: false}) =>
Expand Down Expand Up @@ -70,15 +80,6 @@ abstract class LambdaContext {
Object lookup(String variableName); Object lookup(String variableName);
} }


class MustacheMirrorsUsedAnnotation extends Reflectable {
const MustacheMirrorsUsedAnnotation() : super(
invokingCapability,
reflectedTypeCapability
);
}

const MustacheMirrorsUsedAnnotation mustache = const MustacheMirrorsUsedAnnotation();

/// [TemplateException] is used to obtain the line and column numbers /// [TemplateException] is used to obtain the line and column numbers
/// of the token which caused parse or render to fail. /// of the token which caused parse or render to fail.
abstract class TemplateException implements Exception { abstract class TemplateException implements Exception {
Expand Down
2 changes: 1 addition & 1 deletion lib/src/lambda_context.dart
Expand Up @@ -72,7 +72,7 @@ class LambdaContext implements m.LambdaContext {


if (nodes.isEmpty) return ''; if (nodes.isEmpty) return '';


if (nodes.length == 1 && nodes.first is TextNode) return nodes.first.text; if (nodes.length == 1 && nodes.first is TextNode) return (nodes.first as TextNode).text;


return _renderer.source.substring(node.contentStart, node.contentEnd); return _renderer.source.substring(node.contentStart, node.contentEnd);
} }
Expand Down
7 changes: 5 additions & 2 deletions lib/src/parser.dart
Expand Up @@ -147,8 +147,11 @@ class Parser {
children.add(new TextNode(token.value, token.start, token.end)); children.add(new TextNode(token.value, token.start, token.end));
} else { } else {
var last = children.removeLast(); var last = children.removeLast();
var node = new TextNode(last.text + token.value, last.start, token.end); if(last is! TextNode) {
children.add(node); children.add(new TextNode(token.value, token.start, token.end));
} else {
children.add(new TextNode((last as TextNode).text + token.value, last.start, token.end));
}
} }
} }


Expand Down
10 changes: 6 additions & 4 deletions lib/src/renderer.dart
Expand Up @@ -94,13 +94,15 @@ class Renderer extends Visitor {


if (value is Function) { if (value is Function) {
var context = new LambdaContext(node, this, isSection: false); var context = new LambdaContext(node, this, isSection: false);
value = value(context); final Function callback = value;
value = callback(context);
context.close(); context.close();
} }


if (value == noSuchProperty) { if (value == noSuchProperty) {
if (!lenient) throw error( if (!lenient) {
'Value was missing for variable tag: ${node.name}.', node); throw error('Value was missing for variable tag: ${node.name}.', node);
}
} else { } else {
var valueString = (value == null) ? '' : value.toString(); var valueString = (value == null) ? '' : value.toString();
var output = !node.escape || !htmlEscapeValues var output = !node.escape || !htmlEscapeValues
Expand Down Expand Up @@ -290,7 +292,7 @@ class Renderer extends Visitor {
m.TemplateException error(String message, Node node) => m.TemplateException error(String message, Node node) =>
new TemplateException(message, templateName, source, node.start); new TemplateException(message, templateName, source, node.start);


static const Map<String, String> _htmlEscapeMap = const { static const Map<int, String> _htmlEscapeMap = const {
_AMP: '&amp;', _AMP: '&amp;',
_LT: '&lt;', _LT: '&lt;',
_GT: '&gt;', _GT: '&gt;',
Expand Down
8 changes: 6 additions & 2 deletions pubspec.yaml
Expand Up @@ -9,7 +9,11 @@ environment:
sdk: '>=1.8.0 <2.0.0' sdk: '>=1.8.0 <2.0.0'


dependencies: dependencies:
reflectable: '^0.4.0' reflectable: '^2.0.0'


dev_dependencies: dev_dependencies:
unittest: ">=0.9.0 <0.12.0" test: any

build_runner: ^0.8.0
build_test: ^0.10.0
build_web_compilers: ^0.4.0
29 changes: 29 additions & 0 deletions test/all.reflectable.dart
@@ -0,0 +1,29 @@
// This file has been generated by the reflectable package.
// https://github.com/dart-lang/reflectable.

import "dart:core";
import 'mustache_test.dart' as prefix1;
import 'package:mustache/mustache.dart' as prefix0;

// ignore:unused_import
import "package:reflectable/mirrors.dart" as m;
// ignore:unused_import
import "package:reflectable/src/reflectable_transformer_based.dart" as r;
// ignore:unused_import
import "package:reflectable/reflectable.dart" show isTransformed;

final _data = {const prefix0.MustacheMirrorsUsedAnnotation(): new r.ReflectorData(<m.TypeMirror>[new r.NonGenericClassMirrorImpl(r"Foo", r"mustache_test.Foo", 7, 0, const prefix0.MustacheMirrorsUsedAnnotation(), const <int>[0, 1, 2, 7], const <int>[8, 9, 10, 11, 12, 2, 3, 4, 5, 6], const <int>[], -1, {}, {}, {r"": (b) => () => b ? new prefix1.Foo() : null}, -1, -1, const <int>[-1], null, null)], <m.DeclarationMirror>[new r.VariableMirrorImpl(r"bar", 32773, 0, const prefix0.MustacheMirrorsUsedAnnotation(), -1, 1, 1, null), new r.VariableMirrorImpl(r"lambda", 32773, 0, const prefix0.MustacheMirrorsUsedAnnotation(), -1, 2, 2, null), new r.MethodMirrorImpl(r"jim", 65538, 0, null, null, null, const <int>[], const prefix0.MustacheMirrorsUsedAnnotation(), null), new r.ImplicitGetterMirrorImpl(const prefix0.MustacheMirrorsUsedAnnotation(), 0, 1, 1, 3), new r.ImplicitSetterMirrorImpl(const prefix0.MustacheMirrorsUsedAnnotation(), 0, 1, 1, 4), new r.ImplicitGetterMirrorImpl(const prefix0.MustacheMirrorsUsedAnnotation(), 1, 2, 2, 5), new r.ImplicitSetterMirrorImpl(const prefix0.MustacheMirrorsUsedAnnotation(), 1, 2, 2, 6), new r.MethodMirrorImpl(r"", 64, 0, -1, 0, 0, const <int>[], const prefix0.MustacheMirrorsUsedAnnotation(), null), new r.MethodMirrorImpl(r"==", 131074, null, -1, 3, 3, const <int>[2], const prefix0.MustacheMirrorsUsedAnnotation(), null), new r.MethodMirrorImpl(r"toString", 131074, null, -1, 1, 1, const <int>[], const prefix0.MustacheMirrorsUsedAnnotation(), null), new r.MethodMirrorImpl(r"noSuchMethod", 65538, null, null, null, null, const <int>[3], const prefix0.MustacheMirrorsUsedAnnotation(), null), new r.MethodMirrorImpl(r"hashCode", 131075, null, -1, 4, 4, const <int>[], const prefix0.MustacheMirrorsUsedAnnotation(), null), new r.MethodMirrorImpl(r"runtimeType", 131075, null, -1, 5, 5, const <int>[], const prefix0.MustacheMirrorsUsedAnnotation(), null)], <m.ParameterMirror>[new r.ParameterMirrorImpl(r"_bar", 32870, 4, const prefix0.MustacheMirrorsUsedAnnotation(), -1, 1, 1, null, null, null), new r.ParameterMirrorImpl(r"_lambda", 32870, 6, const prefix0.MustacheMirrorsUsedAnnotation(), -1, 2, 2, null, null, null), new r.ParameterMirrorImpl(r"other", 16390, 8, const prefix0.MustacheMirrorsUsedAnnotation(), null, null, null, null, null, null), new r.ParameterMirrorImpl(r"invocation", 32774, 10, const prefix0.MustacheMirrorsUsedAnnotation(), -1, 6, 6, null, null, null)], <Type>[prefix1.Foo, String, Function, bool, int, Type, Invocation], 1, {r"==": (dynamic instance) => (x) => instance == x, r"toString": (dynamic instance) => instance.toString, r"noSuchMethod": (dynamic instance) => instance.noSuchMethod, r"hashCode": (dynamic instance) => instance.hashCode, r"runtimeType": (dynamic instance) => instance.runtimeType, r"jim": (dynamic instance) => instance.jim, r"bar": (dynamic instance) => instance.bar, r"lambda": (dynamic instance) => instance.lambda}, {r"bar=": (dynamic instance, value) => instance.bar = value, r"lambda=": (dynamic instance, value) => instance.lambda = value}, null, [])};


final _memberSymbolMap = null;

initializeReflectable() {
if (!isTransformed) {
throw new UnsupportedError(
"The transformed code is running with the untransformed "
"reflectable package. Remember to set your package-root to "
"'build/.../packages'.");
}
r.data = _data;
r.memberSymbolMap = _memberSymbolMap;
}
12 changes: 9 additions & 3 deletions test/mustache_specs.dart
Expand Up @@ -7,9 +7,12 @@ library mustache_specs;


import 'dart:io'; import 'dart:io';
import 'dart:convert'; import 'dart:convert';
import 'package:unittest/unittest.dart'; import 'package:test/test.dart';

import 'package:mustache/mustache.dart'; import 'package:mustache/mustache.dart';


import 'mustache_specs.reflectable.dart';

String render(source, values, {partial}) { String render(source, values, {partial}) {
var resolver = null; var resolver = null;
resolver = (name) { resolver = (name) {
Expand All @@ -22,6 +25,8 @@ String render(source, values, {partial}) {
} }


main() { main() {
initializeReflectable();

defineTests(); defineTests();
} }


Expand All @@ -46,7 +51,8 @@ _defineGroupFromFile(filename, text) {
//Make sure that we reset the state of the Interpolation - Multiple Calls test //Make sure that we reset the state of the Interpolation - Multiple Calls test
//as for some reason dart can run the group more than once causing the test //as for some reason dart can run the group more than once causing the test
//to fail the second time it runs //to fail the second time it runs
tearDown(() => lambdas['Interpolation - Multiple Calls'].reset());
// tearDown(() => lambdas['Interpolation - Multiple Calls'].reset());


tests.forEach((t) { tests.forEach((t) {
var testDescription = new StringBuffer(t['name']); var testDescription = new StringBuffer(t['name']);
Expand Down Expand Up @@ -104,7 +110,7 @@ class _DummyCallableWithState {
Function wrapLambda(Function f) => Function wrapLambda(Function f) =>
(LambdaContext ctx) => ctx.renderSource(f(ctx.source).toString()); (LambdaContext ctx) => ctx.renderSource(f(ctx.source).toString());


var lambdas = { var lambdas = <String,Function>{
'Interpolation': wrapLambda((t) => 'world'), 'Interpolation': wrapLambda((t) => 'world'),
'Interpolation - Expansion': wrapLambda((t) => '{{planet}}'), 'Interpolation - Expansion': wrapLambda((t) => '{{planet}}'),
'Interpolation - Alternate Delimiters': 'Interpolation - Alternate Delimiters':
Expand Down

0 comments on commit ab012d3

Please sign in to comment.