Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(672)

Unified Diff: lib/src/compiler/code_generator.dart

Issue 1989663002: fix #470, string interpolation now respects Dart toString (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: lib/src/compiler/code_generator.dart
diff --git a/lib/src/compiler/code_generator.dart b/lib/src/compiler/code_generator.dart
index 05d603f8de8c428c91f543740d95d541006ad1c7..067c92d076146109c2968c2387076d176f3dfab5 100644
--- a/lib/src/compiler/code_generator.dart
+++ b/lib/src/compiler/code_generator.dart
@@ -4188,11 +4188,41 @@ class CodeGenerator extends GeneralizingAstVisitor
_visitListToBinary(node.strings, '+');
@override
- JS.TemplateString visitStringInterpolation(StringInterpolation node) {
- // Assuming we implement toString() on our objects, we can avoid calling it
- // in most cases. Builtin types may differ though. We could handle this with
- // a tagged template.
- return new JS.TemplateString(_visitList(node.elements));
+ JS.Expression visitStringInterpolation(StringInterpolation node) {
+ var parts = [];
+ bool needsTag = false;
+ for (var interpolatePart in node.elements) {
+ if (!needsTag && interpolatePart is InterpolationExpression) {
+ // If we have something that could be native or null, we need to use
+ // dart.str
+ var expr = interpolatePart.expression;
+ var type = getStaticType(expr);
+
+ // JS template strings will call .toString() by default. This works for
+ // Dart types if we know they are not null or native. But if we have
+ // null, or a native type like List, we need to go through a runtime
+ // helper that will give the correct Dart behavior.
+ needsTag = isNullable(expr) ||
+ type.isDynamic ||
+ type.isObject ||
+ (_extensionTypes.hasNativeSubtype(type) &&
+ type != types.stringType);
+ }
+
+ parts.add(_visit(interpolatePart));
+ }
+
+ // Optimization: '$thing' is a common way to call toString.
sra1 2016/05/17 23:47:58 It is not a synonym. '$thing' will throw if toStr
Jennifer Messerly 2016/05/18 00:23:42 Doh. If we want to support that then all readabili
+ if (parts.length == 3 && parts.first == '' && parts.last == '') {
+ var code = needsTag ? 'dart.toString(#)' : '#.toString()';
+ return js.call(code, parts[1]);
+ }
+
+ var templateStr = new JS.TemplateString(parts);
+ if (needsTag) {
+ return new JS.TaggedTemplate(js.call('dart.str'), templateStr);
+ }
+ return templateStr;
}
@override

Powered by Google App Engine
This is Rietveld 408576698