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);
+ }
}
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);
}
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) {
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;
}
}