Method m;
if (!wrapper_method (data_type ("GLib.Variant"), "gvariant_serialize_array "+array_type.to_string(), out m)) {
m.add_parameter (new Parameter ("array", copy_type (array_type, false), b.source_reference));
- b.push_method (m);
+ push_builder (new CodeBuilder.for_subroutine (m));
string[] indices = new string[array_type.rank];
for (int dim=1; dim <= array_type.rank; dim++) {
}
b.add_return (serialize_array_dim (array_type, 1, indices, "array"));
- b.pop_method ();
+ pop_builder ();
check (m);
}
var call = (MethodCall) expression (m.name+"()");
var type = context.analyzer.get_data_type_for_symbol (st);
if (!wrapper_method (data_type ("GLib.Variant"), "gvariant_serialize_struct "+type.to_string(), out m)) {
m.add_parameter (new Parameter ("st", type, b.source_reference));
- b.push_method (m);
+ push_builder (new CodeBuilder.for_subroutine (m));
var builderinit = expression ("new GLib.VariantBuilder (GLib.VariantType.TUPLE)");
var builder = b.add_temp_declaration (null, builderinit);
}
b.add_return (expression (@"$builder.end ()"));
- b.pop_method ();
+ pop_builder ();
check (m);
}
Method m;
if (!wrapper_method (data_type ("GLib.Variant"), "gvariant_serialize_hash_table "+type.to_string(), out m)) {
m.add_parameter (new Parameter ("ht", copy_type (type, false), b.source_reference));
- b.push_method (m);
+ push_builder (new CodeBuilder.for_subroutine (m));
var builderinit = expression (@"new GLib.VariantBuilder (new GLib.VariantType (\"$(get_type_signature (type))\"))");
var builder = b.add_temp_declaration (null, builderinit);
b.add_expression (for_each);
b.add_return (expression (@"$builder.end ()"));
- b.pop_method ();
+ pop_builder ();
check (m);
}
var call = (MethodCall) expression (m.name+"()");
Method m;
if (!wrapper_method (copy_type (array_type, true), "gvariant_deserialize_array "+array_type.to_string(), out m)) {
m.add_parameter (new Parameter ("variant", data_type ("GLib.Variant", false), b.source_reference));
- b.push_method (m);
+ push_builder (new CodeBuilder.for_subroutine (m));
var iterator = b.add_temp_declaration (data_type ("GLib.VariantIter"), expression ("variant.iterator ()"));
deserialize_array_dim (array_type, "variant", indices, 1, array);
b.add_return (expression (array));
- b.pop_method ();
+ pop_builder ();
check (m);
}
var call = (MethodCall) expression (m.name+"()");
type.value_owned = true;
if (!wrapper_method (type, "gvariant_deserialize_struct "+type.to_string(), out m)) {
m.add_parameter (new Parameter ("variant", data_type ("GLib.Variant", false), b.source_reference));
- b.push_method (m);
+ push_builder (new CodeBuilder.for_subroutine (m));
var iterator = b.add_temp_declaration (data_type ("GLib.VariantIter"), expression (@"variant.iterator ()"));
b.add_assignment (expression (@"$result.$(f.name)"), expression (@"($(f.variable_type)) ($iterator.next_value ())"));
}
b.add_return (expression (result));
- b.pop_method ();
+ pop_builder ();
check (m);
}
var call = (MethodCall) expression (m.name+"()");
Method m;
if (!wrapper_method (copy_type (type, true), "gvariant_deserialize_hash_table "+type.to_string(), out m)) {
m.add_parameter (new Parameter ("variant", data_type ("GLib.Variant", false), b.source_reference));
- b.push_method (m);
+ push_builder (new CodeBuilder.for_subroutine (m));
var iterator = b.add_temp_declaration (data_type ("GLib.VariantIter"), expression (@"variant.iterator ()"));
b.close ();
b.add_return (expression (hash_table));
- b.pop_method ();
+ pop_builder ();
check (m);
}
var call = (MethodCall) expression (m.name+"()");
using GLib;
public class Vala.CodeBuilder {
- class BuildContext {
- public Block current_block;
- public Statement insert_statement;
- public Block insert_block;
- public ArrayList<Statement> statement_stack = new ArrayList<Statement> ();
- public ArrayList<CodeNode> check_nodes = new ArrayList<CodeNode> ();
- }
-
- BuildContext build_context;
- ArrayList<BuildContext> context_stack = new ArrayList<BuildContext> ();
+ public Block current_block;
+ public Statement insert_statement;
+ public Block insert_block;
+ public ArrayList<Statement> statement_stack = new ArrayList<Statement> ();
+ public ArrayList<CodeNode> check_nodes = new ArrayList<CodeNode> ();
public SourceReference source_reference;
public CodeBuilder (CodeContext context, Statement insert_statement, SourceReference source_reference) {
- build_context = new BuildContext ();
- build_context.current_block = new Block (source_reference);
- build_context.insert_statement = insert_statement;
- build_context.insert_block = context.analyzer.get_insert_block (insert_statement);
+ current_block = new Block (source_reference);
+ insert_statement = insert_statement;
+ insert_block = context.analyzer.get_insert_block (insert_statement);
this.source_reference = source_reference;
var statement_block = context.analyzer.get_current_block (insert_statement);
- statement_block.insert_before (build_context.insert_statement, build_context.current_block);
- build_context.insert_statement = build_context.current_block;
- build_context.check_nodes.add (build_context.current_block);
+ statement_block.insert_before (insert_statement, current_block);
+ insert_statement = current_block;
+ check_nodes.add (current_block);
}
public CodeBuilder.for_subroutine (Subroutine m) {
source_reference = m.source_reference;
- build_context = new BuildContext ();
- build_context.insert_block = m.body = new Block (source_reference);
- build_context.insert_statement = build_context.current_block = new Block (source_reference);
- m.body.add_statement (build_context.current_block);
+ insert_block = m.body = new Block (source_reference);
+ insert_statement = current_block = new Block (source_reference);
+ m.body.add_statement (current_block);
}
public void check (CodeTransformer transformer) {
- foreach (var node in build_context.check_nodes) {
+ foreach (var node in check_nodes) {
transformer.check (node);
}
}
- public void push_method (Method m) {
- context_stack.add (build_context);
- build_context = new BuildContext ();
- build_context.insert_block = m.body = new Block (source_reference);
- build_context.insert_statement = build_context.current_block = new Block (source_reference);
- m.body.add_statement (build_context.current_block);
- }
-
- public void pop_method () {
- build_context = context_stack[context_stack.size - 1];
- context_stack.remove_at (context_stack.size - 1);
- }
-
public void open_block () {
- build_context.statement_stack.add (build_context.current_block);
- var parent_block = build_context.current_block;
+ statement_stack.add (current_block);
+ var parent_block = current_block;
- build_context.current_block = new Block (source_reference);
+ current_block = new Block (source_reference);
- parent_block.add_statement (build_context.current_block);
+ parent_block.add_statement (current_block);
}
public void open_if (Expression condition) {
- build_context.statement_stack.add (build_context.current_block);
- var parent_block = build_context.current_block;
+ statement_stack.add (current_block);
+ var parent_block = current_block;
- build_context.current_block = new Block (source_reference);
+ current_block = new Block (source_reference);
- var stmt = new IfStatement (condition, build_context.current_block, null, source_reference);
- build_context.statement_stack.add (stmt);
+ var stmt = new IfStatement (condition, current_block, null, source_reference);
+ statement_stack.add (stmt);
parent_block.add_statement (stmt);
}
public void add_else () {
- build_context.current_block = new Block (source_reference);
+ current_block = new Block (source_reference);
- var stmt = (IfStatement) build_context.statement_stack[build_context.statement_stack.size-1];
+ var stmt = (IfStatement) statement_stack[statement_stack.size-1];
assert (stmt.false_statement == null);
- stmt.false_statement = build_context.current_block;
+ stmt.false_statement = current_block;
}
public void else_if (Expression condition) {
- var parent_if = (IfStatement) build_context.statement_stack[build_context.statement_stack.size - 1];
+ var parent_if = (IfStatement) statement_stack[statement_stack.size - 1];
assert (parent_if.false_statement == null);
- build_context.statement_stack.remove_at (build_context.statement_stack.size - 1);
+ statement_stack.remove_at (statement_stack.size - 1);
- build_context.current_block = new Block (source_reference);
+ current_block = new Block (source_reference);
- var stmt = new IfStatement (condition, build_context.current_block, null, source_reference);
+ var stmt = new IfStatement (condition, current_block, null, source_reference);
var block = new Block (source_reference);
block.add_statement (stmt);
parent_if.false_statement = block;
- build_context.statement_stack.add (stmt);
+ statement_stack.add (stmt);
}
public void open_while (Expression condition) {
- build_context.statement_stack.add (build_context.current_block);
- var parent_block = build_context.current_block;
+ statement_stack.add (current_block);
+ var parent_block = current_block;
- build_context.current_block = new Block (source_reference);
+ current_block = new Block (source_reference);
- var stmt = new WhileStatement (condition, build_context.current_block, source_reference);
+ var stmt = new WhileStatement (condition, current_block, source_reference);
parent_block.add_statement (stmt);
}
public void open_for (Expression? initializer, Expression condition, Expression? iterator) {
- build_context.statement_stack.add (build_context.current_block);
- var parent_block = build_context.current_block;
+ statement_stack.add (current_block);
+ var parent_block = current_block;
- build_context.current_block = new Block (source_reference);
+ current_block = new Block (source_reference);
- var stmt = new ForStatement (condition, build_context.current_block, source_reference);
+ var stmt = new ForStatement (condition, current_block, source_reference);
if (initializer != null) {
stmt.add_initializer (initializer);
}
}
public void open_switch (Expression expression, Expression? first_label) {
- var parent_block = build_context.current_block;
+ var parent_block = current_block;
var stmt = new SwitchStatement (expression, source_reference);
- build_context.statement_stack.add (stmt);
+ statement_stack.add (stmt);
var section = new SwitchSection (source_reference);
SwitchLabel label;
label = new SwitchLabel (first_label);
}
section.add_label (label);
- build_context.current_block = section;
- build_context.statement_stack.add (section);
+ current_block = section;
+ statement_stack.add (section);
parent_block.add_statement (stmt);
stmt.add_section (section);
}
public void add_section (Expression? expression) {
- build_context.statement_stack.remove_at (build_context.statement_stack.size - 1);
+ statement_stack.remove_at (statement_stack.size - 1);
- var stmt = (SwitchStatement) build_context.statement_stack[build_context.statement_stack.size - 1];
+ var stmt = (SwitchStatement) statement_stack[statement_stack.size - 1];
var section = new SwitchSection (source_reference);
SwitchLabel label;
if (expression == null) {
label = new SwitchLabel (expression);
}
section.add_label (label);
- build_context.current_block = section;
- build_context.statement_stack.add (section);
+ current_block = section;
+ statement_stack.add (section);
stmt.add_section (section);
}
public void add_label (Expression? expression) {
- var section = (SwitchSection) build_context.statement_stack[build_context.statement_stack.size - 1];
+ var section = (SwitchSection) statement_stack[statement_stack.size - 1];
SwitchLabel label;
if (expression == null) {
label = new SwitchLabel.with_default (source_reference);
}
public void open_try () {
- build_context.statement_stack.add (build_context.current_block);
- var parent_block = build_context.current_block;
+ statement_stack.add (current_block);
+ var parent_block = current_block;
- build_context.current_block = new Block (source_reference);
+ current_block = new Block (source_reference);
- var stmt = new TryStatement (build_context.current_block, null, source_reference);
- build_context.statement_stack.add (stmt);
+ var stmt = new TryStatement (current_block, null, source_reference);
+ statement_stack.add (stmt);
parent_block.add_statement (stmt);
}
public void add_catch (DataType? error_type, string? variable_name) {
- build_context.current_block = new Block (source_reference);
+ current_block = new Block (source_reference);
- var stmt = (TryStatement) build_context.statement_stack[build_context.statement_stack.size-1];
- stmt.add_catch_clause (new CatchClause (error_type, variable_name, build_context.current_block, source_reference));
+ var stmt = (TryStatement) statement_stack[statement_stack.size-1];
+ stmt.add_catch_clause (new CatchClause (error_type, variable_name, current_block, source_reference));
}
public void add_statement (Statement statement) {
- build_context.current_block.add_statement (statement);
+ current_block.add_statement (statement);
}
public void add_expression (Expression expression) {
public string add_temp_declaration (DataType? type, Expression? initializer = null) {
var local = new LocalVariable (type, CodeNode.get_temp_name (), initializer, source_reference);
var stmt = new DeclarationStatement (local, source_reference);
- build_context.insert_block.insert_before (build_context.insert_statement, stmt);
- build_context.check_nodes.insert (0, stmt);
+ insert_block.insert_before (insert_statement, stmt);
+ check_nodes.insert (0, stmt);
return local.name;
}
public void close () {
do {
- var top = build_context.statement_stack[build_context.statement_stack.size - 1];
- build_context.statement_stack.remove_at (build_context.statement_stack.size - 1);
- build_context.current_block = top as Block;
- } while (build_context.current_block == null);
+ var top = statement_stack[statement_stack.size - 1];
+ statement_stack.remove_at (statement_stack.size - 1);
+ current_block = top as Block;
+ } while (current_block == null);
}
}