]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Move Template transformation to the CCodeTransformer
authorLuca Bruno <lucabru@src.gnome.org>
Sat, 1 Feb 2014 11:26:29 +0000 (12:26 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Fri, 19 Apr 2019 13:29:54 +0000 (15:29 +0200)
codegen/valaccodetransformer.vala
vala/valacodetransformer.vala
vala/valatemplate.vala

index f342018eed8b5907cb1879bb561dc65b13c60550..76d0bc2a736a43e18f63e85521da061bf0ef4730 100644 (file)
@@ -366,4 +366,27 @@ public class Vala.CCodeTransformer : CodeTransformer {
 
                base.visit_object_creation_expression (expr);
        }
+
+       public override void visit_template (Template expr) {
+               begin_replace_expression (expr);
+
+               Expression replacement;
+
+               var expression_list = expr.get_expressions ();
+               if (expression_list.size == 0) {
+                       replacement = expression ("\"\"");
+               } else {
+                       replacement = stringify (expression_list[0]);
+                       if (expression_list.size > 1) {
+                               var concat = (MethodCall) expression (@"$replacement.concat()");
+                               for (int i = 1; i < expression_list.size; i++) {
+                                       concat.add_argument (stringify (expression_list[i]));
+                               }
+                               replacement = concat;
+                       }
+               }
+               replacement.target_type = expr.target_type;
+
+               end_replace_expression (replacement);
+       }
 }
index 6a50a576c309b4a57d42eece078ac72fbd9b2bd1..cfb661f646900beb83fd896559a2bdac8faa98f8 100644 (file)
@@ -225,6 +225,14 @@ public class Vala.CodeTransformer : CodeVisitor {
                return (literal != null && !literal.value);
        }
 
+       public Expression stringify (Expression expr) {
+               if (expr.value_type != null && expr.value_type.data_type != null && expr.value_type.data_type.is_subtype_of (context.analyzer.string_type.data_type)) {
+                       return expr;
+               } else {
+                       return expression (@"$expr.to_string ()");
+               }
+       }
+
        public override void visit_addressof_expression (Vala.AddressofExpression expr) {
                expr.accept_children (this);
        }
index 5def6781ba68169a46ffb5f1b0c78121d39db18c..7921d30f6b22cb06e7ca47c1abbcb54181300a61 100644 (file)
@@ -51,12 +51,23 @@ public class Vala.Template : Expression {
                return false;
        }
 
-       Expression stringify (Expression expr) {
-               if (expr is StringLiteral) {
-                       return expr;
-               } else {
-                       return new MethodCall (new MemberAccess (expr, "to_string", expr.source_reference), expr.source_reference);
+       public override string to_string () {
+               var b = new StringBuilder ();
+               b.append ("@\"");
+
+               foreach (var expr in expression_list) {
+                       if (expr is StringLiteral) {
+                               unowned string value = ((StringLiteral) expr).value;
+                               b.append (value.substring (1, (uint) (value.length - 2)));
+                       } else {
+                               b.append ("$(");
+                               b.append (expr.to_string ());
+                               b.append_c (')');
+                       }
                }
+
+               b.append_c ('"');
+               return b.str;
        }
 
        public override void replace_expression (Expression old_node, Expression new_node) {
@@ -74,25 +85,17 @@ public class Vala.Template : Expression {
 
                checked = true;
 
-               Expression expr;
-
-               if (expression_list.size == 0) {
-                       expr = new StringLiteral ("\"\"", source_reference);
-               } else {
-                       expr = stringify (expression_list[0]);
-                       if (expression_list.size > 1) {
-                               var concat = new MethodCall (new MemberAccess (expr, "concat", source_reference), source_reference);
-                               for (int i = 1; i < expression_list.size; i++) {
-                                       concat.add_argument (stringify (expression_list[i]));
-                               }
-                               expr = concat;
+               foreach (var expr in expression_list) {
+                       if (!expr.check (context)) {
+                               error = true;
+                               continue;
                        }
                }
-               expr.target_type = target_type;
 
-               context.analyzer.replaced_nodes.add (this);
-               parent_node.replace_expression (this, expr);
-               return expr.check (context);
+               value_type = context.analyzer.string_type.copy ();
+               value_type.value_owned = true;
+
+               return !error;
        }
 }