[vala/emit: 1/2] Use emit instead of accept and accept_children in code generator



commit 533361f4197d868f5d46fc853fc88656deba049c
Author: Jürg Billeter <j bitron ch>
Date:   Sat Aug 7 16:50:40 2010 +0200

    Use emit instead of accept and accept_children in code generator

 codegen/valaccodearraymodule.vala         |   12 +----
 codegen/valaccodeassignmentmodule.vala    |    4 +-
 codegen/valaccodebasemodule.vala          |   85 +++++++++++------------------
 codegen/valaccodecontrolflowmodule.vala   |   24 ++-------
 codegen/valaccodememberaccessmodule.vala  |   16 +++++-
 codegen/valaccodemethodcallmodule.vala    |    2 -
 codegen/valaccodemethodmodule.vala        |   24 ++++++++-
 codegen/valadbusclientmodule.vala         |   20 ++++----
 codegen/valadbusservermodule.vala         |    2 -
 codegen/valadovaarraymodule.vala          |    4 --
 codegen/valadovaassignmentmodule.vala     |    2 -
 codegen/valadovabasemodule.vala           |   57 ++++++++-----------
 codegen/valadovacontrolflowmodule.vala    |   16 ++----
 codegen/valadovaerrormodule.vala          |   14 +----
 codegen/valadovamemberaccessmodule.vala   |    2 -
 codegen/valadovamethodcallmodule.vala     |    2 -
 codegen/valadovaobjectmodule.vala         |   30 ++++++++++-
 codegen/valadovavaluemodule.vala          |    8 ---
 codegen/valagasyncmodule.vala             |    2 -
 codegen/valagdbusclientmodule.vala        |    8 ++--
 codegen/valagdbusservermodule.vala        |    2 -
 codegen/valagerrormodule.vala             |   18 ++-----
 codegen/valagobjectmodule.vala            |    2 +-
 codegen/valagsignalmodule.vala            |   10 +---
 vala/valaaddressofexpression.vala         |   10 +++-
 vala/valaarraycreationexpression.vala     |   14 +++++
 vala/valaassignment.vala                  |   31 +++++++++++
 vala/valabaseaccess.vala                  |    6 ++
 vala/valabinaryexpression.vala            |   11 ++++
 vala/valablock.vala                       |   13 +++++
 vala/valabooleanliteral.vala              |    8 +++-
 vala/valabreakstatement.vala              |    6 ++-
 vala/valacastexpression.vala              |    8 +++
 vala/valacatchclause.vala                 |   12 ++++-
 vala/valacharacterliteral.vala            |    6 ++
 vala/valacodegenerator.vala               |    6 +-
 vala/valacodenode.vala                    |    3 +
 vala/valacontinuestatement.vala           |    6 ++-
 vala/valadeclarationstatement.vala        |    6 ++-
 vala/valadeletestatement.vala             |   10 +++-
 vala/valaelementaccess.vala               |   11 ++++
 vala/valaemptystatement.vala              |    6 ++-
 vala/valaexpressionstatement.vala         |    6 ++
 vala/valaforeachstatement.vala            |   22 ++++++++
 vala/valaifstatement.vala                 |   13 +++++
 vala/valainitializerlist.vala             |   10 +++-
 vala/valaintegerliteral.vala              |    6 ++
 vala/valalambdaexpression.vala            |    6 ++
 vala/valalistliteral.vala                 |   10 ++++
 vala/valalockstatement.vala               |   11 ++++-
 vala/valaloop.vala                        |    8 +++-
 vala/valamapliteral.vala                  |   11 ++++
 vala/valamemberaccess.vala                |   10 ++++
 vala/valamemberinitializer.vala           |    6 ++-
 vala/valamethodcall.vala                  |   19 +++++++
 vala/valanamedargument.vala               |    8 +++
 vala/valanullliteral.vala                 |    8 +++-
 vala/valaobjectcreationexpression.vala    |   14 +++++
 vala/valapointerindirection.vala          |   10 +++-
 vala/valapostfixexpression.vala           |   10 +++-
 vala/valarealliteral.vala                 |    6 ++
 vala/valareferencetransferexpression.vala |   10 +++-
 vala/valaregexliteral.vala                |    7 +++
 vala/valareturnstatement.vala             |   12 ++++-
 vala/valasetliteral.vala                  |   10 ++++
 vala/valasizeofexpression.vala            |    8 +++-
 vala/valasliceexpression.vala             |   13 ++++-
 vala/valastatementlist.vala               |    8 +++-
 vala/valastringliteral.vala               |    6 ++
 vala/valaswitchlabel.vala                 |    6 ++-
 vala/valaswitchsection.vala               |    8 +++
 vala/valaswitchstatement.vala             |   12 ++++
 vala/valathrowstatement.vala              |   10 ++++
 vala/valatrystatement.vala                |    4 ++
 vala/valatuple.vala                       |   10 ++++
 vala/valatypecheck.vala                   |   10 +++-
 vala/valatypeofexpression.vala            |    8 +++-
 vala/valaunaryexpression.vala             |    8 +++
 vala/valaunlockstatement.vala             |    8 +++-
 vala/valayieldstatement.vala              |   12 ++++-
 80 files changed, 664 insertions(+), 239 deletions(-)
---
diff --git a/codegen/valaccodearraymodule.vala b/codegen/valaccodearraymodule.vala
index 5d429e0..942ba18 100644
--- a/codegen/valaccodearraymodule.vala
+++ b/codegen/valaccodearraymodule.vala
@@ -1,6 +1,6 @@
 /* valaccodearraymodule.vala
  *
- * Copyright (C) 2006-2009  Jürg Billeter
+ * Copyright (C) 2006-2010  Jürg Billeter
  * Copyright (C) 2006-2008  Raffaele Sandrini
  *
  * This library is free software; you can redistribute it and/or
@@ -43,8 +43,6 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
 	}
 
 	public override void visit_array_creation_expression (ArrayCreationExpression expr) {
-		expr.accept_children (codegen);
-
 		var array_type = expr.target_type as ArrayType;
 		if (array_type != null && array_type.fixed_length) {
 			// no heap allocation for fixed-length arrays
@@ -416,8 +414,6 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
 	}
 
 	public override void visit_element_access (ElementAccess expr) {
-		expr.accept_children (codegen);
-
 		List<Expression> indices = expr.get_indices ();
 		int rank = indices.size;
 
@@ -458,8 +454,6 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
 	}
 
 	public override void visit_slice_expression (SliceExpression expr) {
-		expr.accept_children (codegen);
-
 		var ccontainer = (CCodeExpression) expr.container.ccodenode;
 		var cstart = (CCodeExpression) expr.start.ccodenode;
 		var cstop = (CCodeExpression) expr.stop.ccodenode;
@@ -1020,10 +1014,6 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
 		var array_type = (ArrayType) array.value_type;
 		var element = binary.right;
 
-		array.accept (codegen);
-		element.target_type = array_type.element_type.copy ();
-		element.accept (codegen);
-
 		var value_param = new FormalParameter ("value", element.target_type);
 
 		var ccall = new CCodeFunctionCall (new CCodeIdentifier (generate_array_add_wrapper (array_type)));
diff --git a/codegen/valaccodeassignmentmodule.vala b/codegen/valaccodeassignmentmodule.vala
index a4054de..1a9dca1 100644
--- a/codegen/valaccodeassignmentmodule.vala
+++ b/codegen/valaccodeassignmentmodule.vala
@@ -1,6 +1,6 @@
 /* valaccodeassignmentmodule.vala
  *
- * Copyright (C) 2006-2009  Jürg Billeter
+ * Copyright (C) 2006-2010  Jürg Billeter
  * Copyright (C) 2006-2008  Raffaele Sandrini
  *
  * This library is free software; you can redistribute it and/or
@@ -232,8 +232,6 @@ public class Vala.CCodeAssignmentModule : CCodeMemberAccessModule {
 	}
 
 	public override void visit_assignment (Assignment assignment) {
-		assignment.right.accept (codegen);
-
 		if (assignment.left.error || assignment.right.error) {
 			assignment.error = true;
 			return;
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 71137b5..76a0c4a 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -30,7 +30,16 @@ public class Vala.CCodeBaseModule : CCodeModule {
 	public CodeContext context { get; set; }
 
 	public Symbol root_symbol;
-	public Symbol current_symbol;
+
+	public Symbol current_symbol {
+		get {
+			return codegen.current_symbol;
+		}
+		set {
+			codegen.current_symbol = value;
+		}
+	}
+
 	public TryStatement current_try;
 
 	public TypeSymbol? current_type_symbol {
@@ -691,7 +700,7 @@ public class Vala.CCodeBaseModule : CCodeModule {
 					flag_shift += 1;
 				}
 			} else {
-				ev.value.accept (codegen);
+				ev.value.emit (codegen);
 				c_ev = new CCodeEnumValue (ev.get_cname (), (CCodeExpression) ev.value.ccodenode);
 			}
 			c_ev.deprecated = ev.deprecated;
@@ -780,11 +789,11 @@ public class Vala.CCodeBaseModule : CCodeModule {
 			return;
 		}
 
-		c.accept_children (codegen);
-
 		if (!c.external) {
 			generate_type_declaration (c.type_reference, decl_space);
 
+			c.value.emit (codegen);
+
 			var initializer_list = c.value as InitializerList;
 			if (initializer_list != null) {
 				var cdecl = new CCodeDeclaration (c.type_reference.get_const_cname ());
@@ -914,7 +923,9 @@ public class Vala.CCodeBaseModule : CCodeModule {
 
 		check_type (f.variable_type);
 
-		f.accept_children (codegen);
+		if (f.initializer != null) {
+			f.initializer.emit (codegen);
+		}
 
 		var cl = f.parent_symbol as Class;
 		bool is_gtypeinstance = (cl != null && !cl.is_compact);
@@ -1364,7 +1375,13 @@ public class Vala.CCodeBaseModule : CCodeModule {
 
 		bool returns_real_struct = acc.readable && prop.property_type.is_real_non_null_struct_type ();
 
-		acc.accept_children (codegen);
+		if (acc.result_var != null) {
+			acc.result_var.accept (codegen);
+		}
+
+		if (acc.body != null) {
+			acc.body.emit (codegen);
+		}
 
 		var t = (TypeSymbol) prop.parent_symbol;
 
@@ -1610,7 +1627,7 @@ public class Vala.CCodeBaseModule : CCodeModule {
 		bool old_method_inner_error = current_method_inner_error;
 		current_method_inner_error = false;
 
-		d.accept_children (codegen);
+		d.body.emit (codegen);
 
 		if (d.binding == MemberBinding.STATIC && !in_plugin) {
 			Report.error (d.source_reference, "static destructors are only supported for dynamic types");
@@ -1702,11 +1719,6 @@ public class Vala.CCodeBaseModule : CCodeModule {
 	}
 
 	public override void visit_block (Block b) {
-		var old_symbol = current_symbol;
-		current_symbol = b;
-
-		b.accept_children (codegen);
-
 		var local_vars = b.get_local_variables ();
 		foreach (LocalVariable local in local_vars) {
 			local.active = false;
@@ -1931,8 +1943,6 @@ public class Vala.CCodeBaseModule : CCodeModule {
 		}
 
 		b.ccodenode = cblock;
-
-		current_symbol = old_symbol;
 	}
 
 	public override void visit_empty_statement (EmptyStatement stmt) {
@@ -2001,7 +2011,11 @@ public class Vala.CCodeBaseModule : CCodeModule {
 	public override void visit_local_variable (LocalVariable local) {
 		check_type (local.variable_type);
 
-		local.accept_children (codegen);
+		if (local.initializer != null) {
+			local.initializer.emit (codegen);
+
+			visit_end_full_expression (local.initializer);
+		}
 
 		generate_type_declaration (local.variable_type, source_declarations);
 
@@ -2210,8 +2224,6 @@ public class Vala.CCodeBaseModule : CCodeModule {
 	}
 
 	public override void visit_initializer_list (InitializerList list) {
-		list.accept_children (codegen);
-
 		if (list.target_type.data_type is Struct) {
 			/* initializer is used as struct initializer */
 			var st = (Struct) list.target_type.data_type;
@@ -3134,8 +3146,6 @@ public class Vala.CCodeBaseModule : CCodeModule {
 	}
 
 	public override void visit_expression_statement (ExpressionStatement stmt) {
-		stmt.accept_children (codegen);
-
 		if (stmt.expression.error) {
 			stmt.error = true;
 			return;
@@ -3287,7 +3297,7 @@ public class Vala.CCodeBaseModule : CCodeModule {
 		stmt.ccodenode = cfrag;
 	}
 
-	public virtual bool variable_accessible_in_finally (LocalVariable local) {
+	public bool variable_accessible_in_finally (LocalVariable local) {
 		if (current_try == null) {
 			return false;
 		}
@@ -3308,23 +3318,6 @@ public class Vala.CCodeBaseModule : CCodeModule {
 	}
 
 	public override void visit_return_statement (ReturnStatement stmt) {
-		// avoid unnecessary ref/unref pair
-		if (stmt.return_expression != null) {
-			var local = stmt.return_expression.symbol_reference as LocalVariable;
-			if (current_return_type.value_owned
-			    && local != null && local.variable_type.value_owned
-			    && !local.captured
-			    && !variable_accessible_in_finally (local)) {
-				/* return expression is local variable taking ownership and
-				 * current method is transferring ownership */
-
-				// don't ref expression
-				stmt.return_expression.value_type.value_owned = true;
-			}
-		}
-
-		stmt.accept_children (codegen);
-
 		Symbol return_expression_symbol = null;
 
 		if (stmt.return_expression != null) {
@@ -3337,9 +3330,7 @@ public class Vala.CCodeBaseModule : CCodeModule {
 				/* return expression is local variable taking ownership and
 				 * current method is transferring ownership */
 
-				// don't unref variable
 				return_expression_symbol = local;
-				return_expression_symbol.active = false;
 			}
 		}
 
@@ -3510,8 +3501,6 @@ public class Vala.CCodeBaseModule : CCodeModule {
 	}
 
 	public override void visit_delete_statement (DeleteStatement stmt) {
-		stmt.accept_children (codegen);
-
 		var pointer_type = (PointerType) stmt.expression.value_type;
 		DataType type = pointer_type;
 		if (pointer_type.base_type.data_type != null && pointer_type.base_type.data_type.is_reference_type ()) {
@@ -4110,8 +4099,6 @@ public class Vala.CCodeBaseModule : CCodeModule {
 	}
 
 	public override void visit_object_creation_expression (ObjectCreationExpression expr) {
-		expr.accept_children (codegen);
-
 		CCodeExpression instance = null;
 		CCodeExpression creation_expr = null;
 
@@ -4268,7 +4255,7 @@ public class Vala.CCodeBaseModule : CCodeModule {
 				/* evaluate default expression here as the code
 				 * generator might not have visited the formal
 				 * parameter yet */
-				param.initializer.accept (codegen);
+				param.initializer.emit (codegen);
 			
 				carg_map.set (get_param_pos (param.cparameter_position), (CCodeExpression) param.initializer.ccodenode);
 				i++;
@@ -4453,8 +4440,6 @@ public class Vala.CCodeBaseModule : CCodeModule {
 	}
 
 	public override void visit_unary_expression (UnaryExpression expr) {
-		expr.accept_children (codegen);
-
 		CCodeUnaryOperator op;
 		if (expr.operator == UnaryOperator.PLUS) {
 			op = CCodeUnaryOperator.PLUS;
@@ -4645,8 +4630,6 @@ public class Vala.CCodeBaseModule : CCodeModule {
 	}
 	
 	public override void visit_named_argument (NamedArgument expr) {
-		expr.accept_children (codegen);
-
 		expr.ccodenode = expr.inner.ccodenode;
 	}
 
@@ -4667,8 +4650,6 @@ public class Vala.CCodeBaseModule : CCodeModule {
 	}
 
 	public override void visit_reference_transfer_expression (ReferenceTransferExpression expr) {
-		expr.accept_children (codegen);
-
 		/* (tmp = var, var = null, tmp) */
 		var ccomma = new CCodeCommaExpression ();
 		var temp_decl = get_temp_variable (expr.value_type, true, expr, false);
@@ -4682,8 +4663,6 @@ public class Vala.CCodeBaseModule : CCodeModule {
 	}
 
 	public override void visit_binary_expression (BinaryExpression expr) {
-		expr.accept_children (codegen);
-
 		var cleft = (CCodeExpression) expr.left.ccodenode;
 		var cright = (CCodeExpression) expr.right.ccodenode;
 
@@ -5557,7 +5536,7 @@ public class Vala.CCodeBaseModule : CCodeModule {
 
 	public CCodeNode? get_ccodenode (CodeNode node) {
 		if (node.ccodenode == null) {
-			node.accept (codegen);
+			node.emit (codegen);
 		}
 		return node.ccodenode;
 	}
diff --git a/codegen/valaccodecontrolflowmodule.vala b/codegen/valaccodecontrolflowmodule.vala
index 8132c9d..641893d 100644
--- a/codegen/valaccodecontrolflowmodule.vala
+++ b/codegen/valaccodecontrolflowmodule.vala
@@ -30,8 +30,6 @@ public class Vala.CCodeControlFlowModule : CCodeMethodModule {
 	}
 
 	public override void visit_if_statement (IfStatement stmt) {
-		stmt.accept_children (codegen);
-
 		if (stmt.false_statement != null) {
 			stmt.ccodenode = new CCodeIfStatement ((CCodeExpression) stmt.condition.ccodenode, (CCodeStatement) stmt.true_statement.ccodenode, (CCodeStatement) stmt.false_statement.ccodenode);
 		} else {
@@ -189,8 +187,6 @@ public class Vala.CCodeControlFlowModule : CCodeMethodModule {
 	}
 
 	public override void visit_switch_statement (SwitchStatement stmt) {
-		stmt.accept_children (codegen);
-
 		if (stmt.expression.value_type.compatible (string_type)) {
 			visit_string_switch_statement (stmt);
 			return;
@@ -220,17 +216,15 @@ public class Vala.CCodeControlFlowModule : CCodeMethodModule {
 		create_temp_decl (stmt, stmt.expression.temp_vars);
 	}
 
-	public override void visit_switch_section (SwitchSection section) {
-		visit_block (section);
-	}
-
 	public override void visit_switch_label (SwitchLabel label) {
-		label.accept_children (codegen);
+		if (label.expression != null) {
+			label.expression.emit (codegen);
+
+			codegen.visit_end_full_expression (label.expression);
+		}
 	}
 
 	public override void visit_loop (Loop stmt) {
-		stmt.accept_children (codegen);
-
 		if (context.profile == Profile.GOBJECT) {
 			stmt.ccodenode = new CCodeWhileStatement (new CCodeConstant ("TRUE"), (CCodeStatement) stmt.body.ccodenode);
 		} else {
@@ -240,14 +234,6 @@ public class Vala.CCodeControlFlowModule : CCodeMethodModule {
 	}
 
 	public override void visit_foreach_statement (ForeachStatement stmt) {
-		stmt.element_variable.active = true;
-		stmt.collection_variable.active = true;
-		if (stmt.iterator_variable != null) {
-			stmt.iterator_variable.active = true;
-		}
-
-		visit_block (stmt);
-
 		var cblock = new CCodeBlock ();
 		// sets #line
 		stmt.ccodenode = cblock;
diff --git a/codegen/valaccodememberaccessmodule.vala b/codegen/valaccodememberaccessmodule.vala
index 52ea34d..6e8ff0c 100644
--- a/codegen/valaccodememberaccessmodule.vala
+++ b/codegen/valaccodememberaccessmodule.vala
@@ -30,8 +30,6 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
 	}
 
 	public override void visit_member_access (MemberAccess expr) {
-		expr.accept_children (codegen);
-
 		CCodeExpression pub_inst = null;
 		DataType base_type = null;
 	
@@ -368,6 +366,20 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
 				expr.ccodenode = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_variable_cname (local.name));
 			} else {
 				expr.ccodenode = get_variable_cexpression (local.name);
+
+				if (expr.parent_node is ReturnStatement &&
+				    current_return_type.value_owned &&
+				    local.variable_type.value_owned &&
+				    !variable_accessible_in_finally (local)) {
+					/* return expression is local variable taking ownership and
+					 * current method is transferring ownership */
+
+					// don't ref expression
+					expr.value_type.value_owned = true;
+
+					// don't unref variable
+					local.active = false;
+				}
 			}
 		} else if (expr.symbol_reference is FormalParameter) {
 			var p = (FormalParameter) expr.symbol_reference;
diff --git a/codegen/valaccodemethodcallmodule.vala b/codegen/valaccodemethodcallmodule.vala
index 2f2306b..c118700 100644
--- a/codegen/valaccodemethodcallmodule.vala
+++ b/codegen/valaccodemethodcallmodule.vala
@@ -30,8 +30,6 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
 	}
 
 	public override void visit_method_call (MethodCall expr) {
-		expr.accept_children (codegen);
-
 		// the bare function call
 		var ccall = new CCodeFunctionCall ((CCodeExpression) expr.call.ccodenode);
 
diff --git a/codegen/valaccodemethodmodule.vala b/codegen/valaccodemethodmodule.vala
index 0b35b99..77cc3f8 100644
--- a/codegen/valaccodemethodmodule.vala
+++ b/codegen/valaccodemethodmodule.vala
@@ -316,7 +316,29 @@ public class Vala.CCodeMethodModule : CCodeStructModule {
 		if (m.binding == MemberBinding.CLASS || m.binding == MemberBinding.STATIC) {
 			in_static_or_class_context = true;
 		}
-		m.accept_children (codegen);
+
+
+		foreach (FormalParameter param in m.get_parameters ()) {
+			param.accept (codegen);
+		}
+
+		if (m.result_var != null) {
+			m.result_var.accept (codegen);
+		}
+
+		foreach (Expression precondition in m.get_preconditions ()) {
+			precondition.emit (codegen);
+		}
+
+		foreach (Expression postcondition in m.get_postconditions ()) {
+			postcondition.emit (codegen);
+		}
+
+		if (m.body != null) {
+			m.body.emit (codegen);
+		}
+
+
 		in_static_or_class_context = false;
 
 		if (m is CreationMethod) {
diff --git a/codegen/valadbusclientmodule.vala b/codegen/valadbusclientmodule.vala
index cb9ff5d..9593ff6 100644
--- a/codegen/valadbusclientmodule.vala
+++ b/codegen/valadbusclientmodule.vala
@@ -927,11 +927,11 @@ public class Vala.DBusClientModule : DBusModule {
 		Expression object_path = args.get (1);
 
 		var ccall = new CCodeFunctionCall (new CCodeIdentifier (type.type_symbol.get_lower_case_cprefix () + "dbus_proxy_new"));
-		connection.accept (codegen);
+		connection.emit (codegen);
 		ccall.add_argument ((CCodeExpression) connection.ccodenode);
-		bus_name.accept (codegen);
+		bus_name.emit (codegen);
 		ccall.add_argument ((CCodeExpression) bus_name.ccodenode);
-		object_path.accept (codegen);
+		object_path.emit (codegen);
 		ccall.add_argument ((CCodeExpression) object_path.ccodenode);
 		expr.ccodenode = ccall;
 	}
@@ -1413,11 +1413,11 @@ public class Vala.DBusClientModule : DBusModule {
 		if (proxy_get_all) {
 			var ma = expr.call as MemberAccess;
 			var instance = ma.inner;
-			instance.accept (codegen);
+			instance.emit (codegen);
 
 			var args = expr.get_argument_list ();
 			Expression interface_name = args.get (0);
-			interface_name.accept (codegen);
+			interface_name.emit (codegen);
 
 			var ccall = new CCodeFunctionCall (new CCodeIdentifier (generate_get_all_function (mtype.method_symbol)));
 			ccall.add_argument ((CCodeExpression) instance.ccodenode);
@@ -1441,7 +1441,7 @@ public class Vala.DBusClientModule : DBusModule {
 		quark_call.add_argument (new CCodeConstant ("\"ValaDBusInterfaceProxyType\""));
 
 		var qdata_call = new CCodeFunctionCall (new CCodeIdentifier ("g_type_get_qdata"));
-		type.accept (codegen);
+		type.emit (codegen);
 		qdata_call.add_argument ((CCodeExpression) type.ccodenode);
 		qdata_call.add_argument (quark_call);
 
@@ -1450,16 +1450,16 @@ public class Vala.DBusClientModule : DBusModule {
 		var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_object_new"));
 		ccall.add_argument (get_type_call);
 		ccall.add_argument (new CCodeConstant ("\"connection\""));
-		connection.accept (codegen);
+		connection.emit (codegen);
 		ccall.add_argument ((CCodeExpression) connection.ccodenode);
 		ccall.add_argument (new CCodeConstant ("\"name\""));
-		bus_name.accept (codegen);
+		bus_name.emit (codegen);
 		ccall.add_argument ((CCodeExpression) bus_name.ccodenode);
 		ccall.add_argument (new CCodeConstant ("\"path\""));
-		object_path.accept (codegen);
+		object_path.emit (codegen);
 		ccall.add_argument ((CCodeExpression) object_path.ccodenode);
 		ccall.add_argument (new CCodeConstant ("\"interface\""));
-		interface_name.accept (codegen);
+		interface_name.emit (codegen);
 		ccall.add_argument ((CCodeExpression) interface_name.ccodenode);
 		ccall.add_argument (new CCodeConstant ("NULL"));
 		expr.ccodenode = ccall;
diff --git a/codegen/valadbusservermodule.vala b/codegen/valadbusservermodule.vala
index 54f6474..a872303 100644
--- a/codegen/valadbusservermodule.vala
+++ b/codegen/valadbusservermodule.vala
@@ -1637,8 +1637,6 @@ public class Vala.DBusServerModule : DBusClientModule {
 
 		add_dbus_helpers ();
 
-		expr.accept_children (codegen);
-
 		var ma = (MemberAccess) expr.call;
 
 		var raw_conn = new CCodeFunctionCall (new CCodeIdentifier ("dbus_g_connection_get_connection"));
diff --git a/codegen/valadovaarraymodule.vala b/codegen/valadovaarraymodule.vala
index d8b4e51..c532d17 100644
--- a/codegen/valadovaarraymodule.vala
+++ b/codegen/valadovaarraymodule.vala
@@ -33,8 +33,6 @@ internal class Vala.DovaArrayModule : DovaMethodCallModule {
 	}
 
 	public override void visit_array_creation_expression (ArrayCreationExpression expr) {
-		expr.accept_children (codegen);
-
 		var array_type = expr.target_type as ArrayType;
 		if (array_type != null && array_type.fixed_length) {
 			// no heap allocation for fixed-length arrays
@@ -67,8 +65,6 @@ internal class Vala.DovaArrayModule : DovaMethodCallModule {
 	}
 
 	public override void visit_element_access (ElementAccess expr) {
-		expr.accept_children (codegen);
-
 		List<Expression> indices = expr.get_indices ();
 
 		var ccontainer = (CCodeExpression) expr.container.ccodenode;
diff --git a/codegen/valadovaassignmentmodule.vala b/codegen/valadovaassignmentmodule.vala
index 17fcfc5..f1667de 100644
--- a/codegen/valadovaassignmentmodule.vala
+++ b/codegen/valadovaassignmentmodule.vala
@@ -175,8 +175,6 @@ internal class Vala.DovaAssignmentModule : DovaMemberAccessModule {
 	}
 
 	public override void visit_assignment (Assignment assignment) {
-		assignment.right.accept (codegen);
-
 		if (assignment.left.error || assignment.right.error) {
 			assignment.error = true;
 			return;
diff --git a/codegen/valadovabasemodule.vala b/codegen/valadovabasemodule.vala
index 79a8198..37cd42c 100644
--- a/codegen/valadovabasemodule.vala
+++ b/codegen/valadovabasemodule.vala
@@ -29,7 +29,16 @@ internal class Vala.DovaBaseModule : CCodeModule {
 	public CodeContext context { get; set; }
 
 	public Symbol root_symbol;
-	public Symbol current_symbol;
+
+	public Symbol current_symbol {
+		get {
+			return codegen.current_symbol;
+		}
+		set {
+			codegen.current_symbol = value;
+		}
+	}
+
 	public TryStatement current_try;
 
 	public TypeSymbol? current_type_symbol {
@@ -376,7 +385,7 @@ internal class Vala.DovaBaseModule : CCodeModule {
 			if (ev.value == null) {
 				cenum.add_value (new CCodeEnumValue (ev.get_cname ()));
 			} else {
-				ev.value.accept (codegen);
+				ev.value.emit (codegen);
 				cenum.add_value (new CCodeEnumValue (ev.get_cname (), (CCodeExpression) ev.value.ccodenode));
 			}
 		}
@@ -400,9 +409,9 @@ internal class Vala.DovaBaseModule : CCodeModule {
 			return;
 		}
 
-		c.accept_children (codegen);
-
 		if (!c.external) {
+			c.value.emit (codegen);
+
 			if (c.value is InitializerList) {
 				var cdecl = new CCodeDeclaration (c.type_reference.get_const_cname ());
 				var arr = "";
@@ -456,7 +465,9 @@ internal class Vala.DovaBaseModule : CCodeModule {
 	}
 
 	public override void visit_field (Field f) {
-		f.accept_children (codegen);
+		if (f.initializer != null) {
+			f.initializer.emit (codegen);
+		}
 
 		var cl = f.parent_symbol as Class;
 
@@ -591,7 +602,6 @@ internal class Vala.DovaBaseModule : CCodeModule {
 	}
 
 	public override void visit_formal_parameter (FormalParameter p) {
-		p.accept_children (codegen);
 	}
 
 	public override void visit_property (Property prop) {
@@ -656,7 +666,7 @@ internal class Vala.DovaBaseModule : CCodeModule {
 	}
 
 	public override void visit_destructor (Destructor d) {
-		d.accept_children (codegen);
+		d.body.emit (codegen);
 
 		CCodeFragment cfrag = new CCodeFragment ();
 
@@ -704,11 +714,6 @@ internal class Vala.DovaBaseModule : CCodeModule {
 	}
 
 	public override void visit_block (Block b) {
-		var old_symbol = current_symbol;
-		current_symbol = b;
-
-		b.accept_children (codegen);
-
 		var local_vars = b.get_local_variables ();
 		foreach (LocalVariable local in local_vars) {
 			local.active = false;
@@ -912,8 +917,6 @@ internal class Vala.DovaBaseModule : CCodeModule {
 		}
 
 		b.ccodenode = cblock;
-
-		current_symbol = old_symbol;
 	}
 
 	public override void visit_empty_statement (EmptyStatement stmt) {
@@ -954,7 +957,11 @@ internal class Vala.DovaBaseModule : CCodeModule {
 	}
 
 	public override void visit_local_variable (LocalVariable local) {
-		local.accept_children (codegen);
+		if (local.initializer != null) {
+			local.initializer.emit (codegen);
+
+			visit_end_full_expression (local.initializer);
+		}
 
 		generate_type_declaration (local.variable_type, source_declarations);
 
@@ -999,8 +1006,6 @@ internal class Vala.DovaBaseModule : CCodeModule {
 	}
 
 	public override void visit_initializer_list (InitializerList list) {
-		list.accept_children (codegen);
-
 		if (list.target_type.data_type is Struct) {
 			/* initializer is used as struct initializer */
 			var st = (Struct) list.target_type.data_type;
@@ -1310,8 +1315,6 @@ internal class Vala.DovaBaseModule : CCodeModule {
 	}
 
 	public override void visit_expression_statement (ExpressionStatement stmt) {
-		stmt.accept_children (codegen);
-
 		if (stmt.expression.error) {
 			stmt.error = true;
 			return;
@@ -1467,8 +1470,6 @@ internal class Vala.DovaBaseModule : CCodeModule {
 	}
 
 	public override void visit_return_statement (ReturnStatement stmt) {
-		stmt.accept_children (codegen);
-
 		var cfrag = new CCodeFragment ();
 
 		// free local variables
@@ -1480,8 +1481,6 @@ internal class Vala.DovaBaseModule : CCodeModule {
 	}
 
 	public override void visit_delete_statement (DeleteStatement stmt) {
-		stmt.accept_children (codegen);
-
 		var pointer_type = (PointerType) stmt.expression.value_type;
 		DataType type = pointer_type;
 		if (pointer_type.base_type.data_type != null && pointer_type.base_type.data_type.is_reference_type ()) {
@@ -1744,8 +1743,6 @@ internal class Vala.DovaBaseModule : CCodeModule {
 	}
 
 	public override void visit_object_creation_expression (ObjectCreationExpression expr) {
-		expr.accept_children (codegen);
-
 		CCodeExpression instance = null;
 		CCodeExpression creation_expr = null;
 
@@ -1837,7 +1834,7 @@ internal class Vala.DovaBaseModule : CCodeModule {
 				/* evaluate default expression here as the code
 				 * generator might not have visited the formal
 				 * parameter yet */
-				param.initializer.accept (codegen);
+				param.initializer.emit (codegen);
 
 				creation_call.add_argument ((CCodeExpression) param.initializer.ccodenode);
 				i++;
@@ -1944,8 +1941,6 @@ internal class Vala.DovaBaseModule : CCodeModule {
 	}
 
 	public override void visit_unary_expression (UnaryExpression expr) {
-		expr.accept_children (codegen);
-
 		CCodeUnaryOperator op;
 		if (expr.operator == UnaryOperator.PLUS) {
 			op = CCodeUnaryOperator.PLUS;
@@ -2036,8 +2031,6 @@ internal class Vala.DovaBaseModule : CCodeModule {
 	}
 
 	public override void visit_reference_transfer_expression (ReferenceTransferExpression expr) {
-		expr.accept_children (codegen);
-
 		/* (tmp = var, var = null, tmp) */
 		var ccomma = new CCodeCommaExpression ();
 		var temp_decl = get_temp_variable (expr.value_type, true, expr);
@@ -2051,8 +2044,6 @@ internal class Vala.DovaBaseModule : CCodeModule {
 	}
 
 	public override void visit_binary_expression (BinaryExpression expr) {
-		expr.accept_children (codegen);
-
 		var cleft = (CCodeExpression) expr.left.ccodenode;
 		var cright = (CCodeExpression) expr.right.ccodenode;
 
@@ -2441,7 +2432,7 @@ internal class Vala.DovaBaseModule : CCodeModule {
 
 	public CCodeNode? get_ccodenode (CodeNode node) {
 		if (node.ccodenode == null) {
-			node.accept (codegen);
+			node.emit (codegen);
 		}
 		return node.ccodenode;
 	}
diff --git a/codegen/valadovacontrolflowmodule.vala b/codegen/valadovacontrolflowmodule.vala
index ab142cb..cbf08d3 100644
--- a/codegen/valadovacontrolflowmodule.vala
+++ b/codegen/valadovacontrolflowmodule.vala
@@ -26,8 +26,6 @@ internal class Vala.DovaControlFlowModule : DovaMethodModule {
 	}
 
 	public override void visit_if_statement (IfStatement stmt) {
-		stmt.accept_children (codegen);
-
 		if (stmt.false_statement != null) {
 			stmt.ccodenode = new CCodeIfStatement ((CCodeExpression) stmt.condition.ccodenode, (CCodeStatement) stmt.true_statement.ccodenode, (CCodeStatement) stmt.false_statement.ccodenode);
 		} else {
@@ -38,8 +36,6 @@ internal class Vala.DovaControlFlowModule : DovaMethodModule {
 	}
 
 	public override void visit_switch_statement (SwitchStatement stmt) {
-		stmt.accept_children (codegen);
-
 		var cswitch = new CCodeSwitchStatement ((CCodeExpression) stmt.expression.ccodenode);
 		stmt.ccodenode = cswitch;
 
@@ -68,17 +64,15 @@ internal class Vala.DovaControlFlowModule : DovaMethodModule {
 		create_temp_decl (stmt, stmt.expression.temp_vars);
 	}
 
-	public override void visit_switch_section (SwitchSection section) {
-		visit_block (section);
-	}
-
 	public override void visit_switch_label (SwitchLabel label) {
-		label.accept_children (codegen);
+		if (label.expression != null) {
+			label.expression.emit (codegen);
+
+			codegen.visit_end_full_expression (label.expression);
+		}
 	}
 
 	public override void visit_loop (Loop stmt) {
-		stmt.accept_children (codegen);
-
 		stmt.ccodenode = new CCodeWhileStatement (new CCodeConstant ("true"), (CCodeStatement) stmt.body.ccodenode);
 	}
 
diff --git a/codegen/valadovaerrormodule.vala b/codegen/valadovaerrormodule.vala
index 13c6936..e122756 100644
--- a/codegen/valadovaerrormodule.vala
+++ b/codegen/valadovaerrormodule.vala
@@ -33,8 +33,6 @@ internal class Vala.DovaErrorModule : DovaDelegateModule {
 	}
 
 	public override void visit_throw_statement (ThrowStatement stmt) {
-		stmt.accept_children (codegen);
-
 		var cfrag = new CCodeFragment ();
 
 		// method will fail
@@ -242,15 +240,15 @@ internal class Vala.DovaErrorModule : DovaDelegateModule {
 		}
 
 		if (stmt.finally_body != null) {
-			stmt.finally_body.accept (codegen);
+			stmt.finally_body.emit (codegen);
 		}
 
 		is_in_catch = false;
-		stmt.body.accept (codegen);
+		stmt.body.emit (codegen);
 		is_in_catch = true;
 
 		foreach (CatchClause clause in stmt.get_catch_clauses ()) {
-			clause.accept (codegen);
+			clause.emit (codegen);
 		}
 
 		current_try = old_try;
@@ -278,14 +276,8 @@ internal class Vala.DovaErrorModule : DovaDelegateModule {
 	}
 
 	public override void visit_catch_clause (CatchClause clause) {
-		if (clause.error_variable != null) {
-			clause.error_variable.active = true;
-		}
-
 		generate_type_declaration (clause.error_type, source_declarations);
 
-		clause.accept_children (codegen);
-
 		var cfrag = new CCodeFragment ();
 		cfrag.append (new CCodeLabel (clause.clabel_name));
 
diff --git a/codegen/valadovamemberaccessmodule.vala b/codegen/valadovamemberaccessmodule.vala
index 3785932..58fb664 100644
--- a/codegen/valadovamemberaccessmodule.vala
+++ b/codegen/valadovamemberaccessmodule.vala
@@ -28,8 +28,6 @@ internal class Vala.DovaMemberAccessModule : DovaControlFlowModule {
 	}
 
 	public override void visit_member_access (MemberAccess expr) {
-		expr.accept_children (codegen);
-
 		CCodeExpression pub_inst = null;
 		DataType base_type = null;
 
diff --git a/codegen/valadovamethodcallmodule.vala b/codegen/valadovamethodcallmodule.vala
index ed4d571..aab0f3b 100644
--- a/codegen/valadovamethodcallmodule.vala
+++ b/codegen/valadovamethodcallmodule.vala
@@ -26,8 +26,6 @@ internal class Vala.DovaMethodCallModule : DovaAssignmentModule {
 	}
 
 	public override void visit_method_call (MethodCall expr) {
-		expr.accept_children (codegen);
-
 		// the bare function call
 		var ccall = new CCodeFunctionCall ((CCodeExpression) expr.call.ccodenode);
 
diff --git a/codegen/valadovaobjectmodule.vala b/codegen/valadovaobjectmodule.vala
index 175a176..ed1f933 100644
--- a/codegen/valadovaobjectmodule.vala
+++ b/codegen/valadovaobjectmodule.vala
@@ -1144,7 +1144,13 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
 
 		var prop = (Property) acc.prop;
 
-		acc.accept_children (codegen);
+		if (acc.result_var != null) {
+			acc.result_var.accept (codegen);
+		}
+
+		if (acc.body != null) {
+			acc.body.emit (codegen);
+		}
 
 		// do not declare overriding properties and interface implementations
 		if (prop.is_abstract || prop.is_virtual
@@ -1383,7 +1389,27 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
 		variable_name_map = new HashMap<string,string> (str_hash, str_equal);
 		current_try = null;
 
-		m.accept_children (codegen);
+
+		foreach (FormalParameter param in m.get_parameters ()) {
+			param.accept (codegen);
+		}
+
+		if (m.result_var != null) {
+			m.result_var.accept (codegen);
+		}
+
+		foreach (Expression precondition in m.get_preconditions ()) {
+			precondition.emit (codegen);
+		}
+
+		foreach (Expression postcondition in m.get_postconditions ()) {
+			postcondition.emit (codegen);
+		}
+
+		if (m.body != null) {
+			m.body.emit (codegen);
+		}
+
 
 		current_symbol = old_symbol;
 		next_temp_var_id = old_next_temp_var_id;
diff --git a/codegen/valadovavaluemodule.vala b/codegen/valadovavaluemodule.vala
index cabf73b..ac3b614 100644
--- a/codegen/valadovavaluemodule.vala
+++ b/codegen/valadovavaluemodule.vala
@@ -539,8 +539,6 @@ internal class Vala.DovaValueModule : DovaObjectModule {
 	}
 
 	public override void visit_list_literal (ListLiteral expr) {
-		expr.accept_children (codegen);
-
 		var ce = new CCodeCommaExpression ();
 		int length = expr.get_expressions ().size;
 
@@ -575,8 +573,6 @@ internal class Vala.DovaValueModule : DovaObjectModule {
 	}
 
 	public override void visit_set_literal (SetLiteral expr) {
-		expr.accept_children (codegen);
-
 		var ce = new CCodeCommaExpression ();
 		int length = expr.get_expressions ().size;
 
@@ -611,8 +607,6 @@ internal class Vala.DovaValueModule : DovaObjectModule {
 	}
 
 	public override void visit_map_literal (MapLiteral expr) {
-		expr.accept_children (codegen);
-
 		var key_ce = new CCodeCommaExpression ();
 		var value_ce = new CCodeCommaExpression ();
 		int length = expr.get_keys ().size;
@@ -661,8 +655,6 @@ internal class Vala.DovaValueModule : DovaObjectModule {
 	}
 
 	public override void visit_tuple (Tuple tuple) {
-		tuple.accept_children (codegen);
-
 		var type_array_type = new ArrayType (new PointerType (new VoidType ()), 1, tuple.source_reference);
 		type_array_type.inline_allocated = true;
 		type_array_type.fixed_length = true;
diff --git a/codegen/valagasyncmodule.vala b/codegen/valagasyncmodule.vala
index c406b4b..80ba5d9 100644
--- a/codegen/valagasyncmodule.vala
+++ b/codegen/valagasyncmodule.vala
@@ -568,8 +568,6 @@ public class Vala.GAsyncModule : GSignalModule {
 			return;
 		}
 
-		stmt.accept_children (codegen);
-
 		if (stmt.yield_expression.error) {
 			stmt.error = true;
 			return;
diff --git a/codegen/valagdbusclientmodule.vala b/codegen/valagdbusclientmodule.vala
index cd4a0ff..6e19674 100644
--- a/codegen/valagdbusclientmodule.vala
+++ b/codegen/valagdbusclientmodule.vala
@@ -263,19 +263,19 @@ public class Vala.GDBusClientModule : GDBusModule {
 
 		var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_initable_new"));
 		ccall.add_argument (new CCodeIdentifier ("%s_PROXY".printf (iface.get_type_id ())));
-		cancellable.accept (codegen);
+		cancellable.emit (codegen);
 		ccall.add_argument ((CCodeExpression) cancellable.ccodenode);
 		ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_variable_cexpression ("_inner_error_")));
 		ccall.add_argument (new CCodeConstant ("\"g-flags\""));
 		ccall.add_argument (new CCodeConstant ("G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES"));
 		ccall.add_argument (new CCodeConstant ("\"g-name\""));
-		name.accept (codegen);
+		name.emit (codegen);
 		ccall.add_argument ((CCodeExpression) name.ccodenode);
 		ccall.add_argument (new CCodeConstant ("\"g-bus-type\""));
-		bus_type.accept (codegen);
+		bus_type.emit (codegen);
 		ccall.add_argument ((CCodeExpression) bus_type.ccodenode);
 		ccall.add_argument (new CCodeConstant ("\"g-object-path\""));
-		object_path.accept (codegen);
+		object_path.emit (codegen);
 		ccall.add_argument ((CCodeExpression) object_path.ccodenode);
 		ccall.add_argument (new CCodeConstant ("\"g-interface-name\""));
 		ccall.add_argument (new CCodeConstant ("\"%s\"".printf (get_dbus_name (iface))));
diff --git a/codegen/valagdbusservermodule.vala b/codegen/valagdbusservermodule.vala
index 2680a86..a5760e7 100644
--- a/codegen/valagdbusservermodule.vala
+++ b/codegen/valagdbusservermodule.vala
@@ -1030,8 +1030,6 @@ public class Vala.GDBusServerModule : GDBusClientModule {
 			return;
 		}
 
-		expr.accept_children (codegen);
-
 		var ma = (MemberAccess) expr.call;
 		var type_arg = (ObjectType) ma.get_type_arguments ().get (0);
 
diff --git a/codegen/valagerrormodule.vala b/codegen/valagerrormodule.vala
index b86cfa6..3333c6c 100644
--- a/codegen/valagerrormodule.vala
+++ b/codegen/valagerrormodule.vala
@@ -1,6 +1,6 @@
 /* valagerrormodule.vala
  *
- * Copyright (C) 2008-2009  Jürg Billeter
+ * Copyright (C) 2008-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -43,7 +43,7 @@ public class Vala.GErrorModule : CCodeDelegateModule {
 			if (ecode.value == null) {
 				cenum.add_value (new CCodeEnumValue (ecode.get_cname ()));
 			} else {
-				ecode.value.accept (codegen);
+				ecode.value.emit (codegen);
 				cenum.add_value (new CCodeEnumValue (ecode.get_cname (), (CCodeExpression) ecode.value.ccodenode));
 			}
 		}
@@ -85,8 +85,6 @@ public class Vala.GErrorModule : CCodeDelegateModule {
 	}
 
 	public override void visit_throw_statement (ThrowStatement stmt) {
-		stmt.accept_children (codegen);
-
 		var cfrag = new CCodeFragment ();
 
 		// method will fail
@@ -333,15 +331,15 @@ public class Vala.GErrorModule : CCodeDelegateModule {
 		}
 
 		if (stmt.finally_body != null) {
-			stmt.finally_body.accept (codegen);
+			stmt.finally_body.emit (codegen);
 		}
 
 		is_in_catch = false;
-		stmt.body.accept (codegen);
+		stmt.body.emit (codegen);
 		is_in_catch = true;
 
 		foreach (CatchClause clause in stmt.get_catch_clauses ()) {
-			clause.accept (codegen);
+			clause.emit (codegen);
 		}
 
 		current_try = old_try;
@@ -369,10 +367,6 @@ public class Vala.GErrorModule : CCodeDelegateModule {
 	}
 
 	public override void visit_catch_clause (CatchClause clause) {
-		if (clause.error_variable != null) {
-			clause.error_variable.active = true;
-		}
-
 		current_method_inner_error = true;
 
 		var error_type = (ErrorType) clause.error_type;
@@ -380,8 +374,6 @@ public class Vala.GErrorModule : CCodeDelegateModule {
 			generate_error_domain_declaration (error_type.error_domain, source_declarations);
 		}
 
-		clause.accept_children (codegen);
-
 		var cfrag = new CCodeFragment ();
 		cfrag.append (new CCodeLabel (clause.clabel_name));
 
diff --git a/codegen/valagobjectmodule.vala b/codegen/valagobjectmodule.vala
index d1c2eea..d6ce29d 100644
--- a/codegen/valagobjectmodule.vala
+++ b/codegen/valagobjectmodule.vala
@@ -458,7 +458,7 @@ public class Vala.GObjectModule : GTypeModule {
 		} else {
 			in_constructor = true;
 		}
-		c.accept_children (codegen);
+		c.body.emit (codegen);
 		in_static_or_class_context = false;
 
 		in_constructor = false;
diff --git a/codegen/valagsignalmodule.vala b/codegen/valagsignalmodule.vala
index d62b30d..8d09f30 100644
--- a/codegen/valagsignalmodule.vala
+++ b/codegen/valagsignalmodule.vala
@@ -1,6 +1,6 @@
 /* valagsignalmodule.vala
  *
- * Copyright (C) 2006-2009  Jürg Billeter
+ * Copyright (C) 2006-2010  Jürg Billeter
  * Copyright (C) 2006-2008  Raffaele Sandrini
  *
  * This library is free software; you can redistribute it and/or
@@ -460,7 +460,6 @@ public class Vala.GSignalModule : GObjectModule {
 			// detailed signal emission
 			var sig = (Signal) expr.symbol_reference;
 			var ma = (MemberAccess) expr.container;
-			expr.accept_children (codegen);
 
 			var detail_expr = expr.get_indices ().get (0) as StringLiteral;
 			string signal_detail = detail_expr.eval ();
@@ -504,8 +503,6 @@ public class Vala.GSignalModule : GObjectModule {
 
 	public override void visit_assignment (Assignment assignment) {
 		if (assignment.left.symbol_reference is Signal) {
-			assignment.right.accept (codegen);
-
 			if (assignment.left.error || assignment.right.error) {
 				assignment.error = true;
 				return;
@@ -519,8 +516,6 @@ public class Vala.GSignalModule : GObjectModule {
 
 	public override void visit_member_access (MemberAccess expr) {
 		if (expr.symbol_reference is Signal) {
-			expr.accept_children (codegen);
-
 			CCodeExpression pub_inst = null;
 	
 			if (expr.inner != null) {
@@ -571,9 +566,6 @@ public class Vala.GSignalModule : GObjectModule {
 		var signal_access = ((MemberAccess) expr.call).inner;
 		var handler = expr.get_argument_list ().get (0);
 
-		signal_access.accept (codegen);
-		handler.accept (codegen);
-
 		bool disconnect = (method_type.method_symbol.name == "disconnect");
 		bool after = (method_type.method_symbol.name == "connect_after");
 
diff --git a/vala/valaaddressofexpression.vala b/vala/valaaddressofexpression.vala
index ad00968..c6804d6 100644
--- a/vala/valaaddressofexpression.vala
+++ b/vala/valaaddressofexpression.vala
@@ -1,6 +1,6 @@
 /* valaaddressofexpression.vala
  *
- * Copyright (C) 2007-2008  Jürg Billeter
+ * Copyright (C) 2007-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -98,4 +98,12 @@ public class Vala.AddressofExpression : Expression {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		inner.emit (codegen);
+
+		codegen.visit_addressof_expression (this);
+
+		codegen.visit_expression (this);
+	}
 }
diff --git a/vala/valaarraycreationexpression.vala b/vala/valaarraycreationexpression.vala
index 80f4367..d8d0f2c 100644
--- a/vala/valaarraycreationexpression.vala
+++ b/vala/valaarraycreationexpression.vala
@@ -244,4 +244,18 @@ public class Vala.ArrayCreationExpression : Expression {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		foreach (Expression e in sizes) {
+			e.emit (codegen);
+		}
+
+		if (initializer_list != null) {
+			initializer_list.emit (codegen);
+		}
+
+		codegen.visit_array_creation_expression (this);
+
+		codegen.visit_expression (this);
+	}
 }
diff --git a/vala/valaassignment.vala b/vala/valaassignment.vala
index 0e381fe..219faac 100644
--- a/vala/valaassignment.vala
+++ b/vala/valaassignment.vala
@@ -442,6 +442,37 @@ public class Vala.Assignment : Expression {
 		return !error;
 	}
 
+	public override void emit (CodeGenerator codegen) {
+		var ma = left as MemberAccess;
+		var ea = left as ElementAccess;
+		var pi = left as PointerIndirection;
+		if (ma != null) {
+			var field = ma.symbol_reference as Field;
+			var property = ma.symbol_reference as Property;
+
+			bool instance = (field != null && field.binding == MemberBinding.INSTANCE)
+				|| (property != null && property.binding == MemberBinding.INSTANCE);
+
+			if (instance) {
+				ma.inner.emit (codegen);
+			}
+		} else if (ea != null) {
+			ea.container.emit (codegen);
+
+			foreach (var index in ea.get_indices ()) {
+				index.emit (codegen);
+			}
+		} else if (pi != null) {
+			pi.inner.emit (codegen);
+		}
+
+		right.emit (codegen);
+
+		codegen.visit_assignment (this);
+
+		codegen.visit_expression (this);
+	}
+
 	public override void get_defined_variables (Collection<LocalVariable> collection) {
 		right.get_defined_variables (collection);
 		left.get_defined_variables (collection);
diff --git a/vala/valabaseaccess.vala b/vala/valabaseaccess.vala
index b434f56..e03baf7 100644
--- a/vala/valabaseaccess.vala
+++ b/vala/valabaseaccess.vala
@@ -90,4 +90,10 @@ public class Vala.BaseAccess : Expression {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		codegen.visit_base_access (this);
+
+		codegen.visit_expression (this);
+	}
 }
diff --git a/vala/valabinaryexpression.vala b/vala/valabinaryexpression.vala
index f2652f9..ccbdf07 100644
--- a/vala/valabinaryexpression.vala
+++ b/vala/valabinaryexpression.vala
@@ -306,6 +306,8 @@ public class Vala.BinaryExpression : Expression {
 				return false;
 			}
 
+			right.target_type = array_type.element_type.copy ();
+
 			value_type = array_type.copy ();
 			value_type.value_owned = true;
 		} else if (operator == BinaryOperator.PLUS
@@ -486,6 +488,15 @@ public class Vala.BinaryExpression : Expression {
 		return !error;
 	}
 
+	public override void emit (CodeGenerator codegen) {
+		left.emit (codegen);
+		right.emit (codegen);
+
+		codegen.visit_binary_expression (this);
+
+		codegen.visit_expression (this);
+	}
+
 	public override void get_defined_variables (Collection<LocalVariable> collection) {
 		left.get_defined_variables (collection);
 		right.get_defined_variables (collection);
diff --git a/vala/valablock.vala b/vala/valablock.vala
index 5b570a7..a5effd8 100644
--- a/vala/valablock.vala
+++ b/vala/valablock.vala
@@ -154,6 +154,19 @@ public class Vala.Block : Symbol, Statement {
 		return !error;
 	}
 
+	public override void emit (CodeGenerator codegen) {
+		var old_symbol = codegen.current_symbol;
+		codegen.current_symbol = this;
+
+		foreach (Statement stmt in statement_list) {
+			stmt.emit (codegen);
+		}
+
+		codegen.visit_block (this);
+
+		codegen.current_symbol = old_symbol;
+	}
+
 	public void insert_before (Statement stmt, Statement new_stmt) {
 		for (int i = 0; i < statement_list.size; i++) {
 			var stmt_list = statement_list[i] as StatementList;
diff --git a/vala/valabooleanliteral.vala b/vala/valabooleanliteral.vala
index bf0842f..e027944 100644
--- a/vala/valabooleanliteral.vala
+++ b/vala/valabooleanliteral.vala
@@ -1,6 +1,6 @@
 /* valabooleanliteral.vala
  *
- * Copyright (C) 2006-2008  Jürg Billeter
+ * Copyright (C) 2006-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -72,4 +72,10 @@ public class Vala.BooleanLiteral : Literal {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		codegen.visit_boolean_literal (this);
+
+		codegen.visit_expression (this);
+	}
 }
diff --git a/vala/valabreakstatement.vala b/vala/valabreakstatement.vala
index 97e93df..3f69c85 100644
--- a/vala/valabreakstatement.vala
+++ b/vala/valabreakstatement.vala
@@ -1,6 +1,6 @@
 /* valabreakstatement.vala
  *
- * Copyright (C) 2006-2007  Jürg Billeter
+ * Copyright (C) 2006-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -39,4 +39,8 @@ public class Vala.BreakStatement : CodeNode, Statement {
 	public override void accept (CodeVisitor visitor) {
 		visitor.visit_break_statement (this);
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		codegen.visit_break_statement (this);
+	}
 }
diff --git a/vala/valacastexpression.vala b/vala/valacastexpression.vala
index a17f09f..536fe14 100644
--- a/vala/valacastexpression.vala
+++ b/vala/valacastexpression.vala
@@ -147,6 +147,14 @@ public class Vala.CastExpression : Expression {
 		return !error;
 	}
 
+	public override void emit (CodeGenerator codegen) {
+		inner.emit (codegen);
+
+		codegen.visit_cast_expression (this);
+
+		codegen.visit_expression (this);
+	}
+
 	public override void get_defined_variables (Collection<LocalVariable> collection) {
 		inner.get_defined_variables (collection);
 	}
diff --git a/vala/valacatchclause.vala b/vala/valacatchclause.vala
index efe71d0..094c8a2 100644
--- a/vala/valacatchclause.vala
+++ b/vala/valacatchclause.vala
@@ -1,6 +1,6 @@
 /* valacatchclause.vala
  *
- * Copyright (C) 2007-2009  Jürg Billeter
+ * Copyright (C) 2007-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -139,6 +139,16 @@ public class Vala.CatchClause : CodeNode {
 		return !error;
 	}
 
+	public override void emit (CodeGenerator codegen) {
+		if (error_variable != null) {
+			error_variable.active = true;
+		}
+
+		body.emit (codegen);
+
+		codegen.visit_catch_clause (this);
+	}
+
 	public override void get_defined_variables (Collection<LocalVariable> collection) {
 		if (error_variable != null) {
 			collection.add (error_variable);
diff --git a/vala/valacharacterliteral.vala b/vala/valacharacterliteral.vala
index c69eeb5..0de9918 100644
--- a/vala/valacharacterliteral.vala
+++ b/vala/valacharacterliteral.vala
@@ -102,4 +102,10 @@ public class Vala.CharacterLiteral : Literal {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		codegen.visit_character_literal (this);
+
+		codegen.visit_expression (this);
+	}
 }
diff --git a/vala/valacodegenerator.vala b/vala/valacodegenerator.vala
index 43ce901..1fdb497 100644
--- a/vala/valacodegenerator.vala
+++ b/vala/valacodegenerator.vala
@@ -1,6 +1,6 @@
 /* valacodegenerator.vala
  *
- * Copyright (C) 2007-2008  Jürg Billeter
+ * Copyright (C) 2007-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -20,12 +20,12 @@
  * 	Jürg Billeter <j bitron ch>
  */
 
-using GLib;
-
 /**
  * Abstract code visitor generating code.
  */
 public class Vala.CodeGenerator : CodeVisitor {
+	public Symbol current_symbol;
+
 	/**
 	 * Generate and emit C code for the specified code context.
 	 *
diff --git a/vala/valacodenode.vala b/vala/valacodenode.vala
index f3ae4a4..4b0584d 100644
--- a/vala/valacodenode.vala
+++ b/vala/valacodenode.vala
@@ -145,6 +145,9 @@ public abstract class Vala.CodeNode {
 		return true;
 	}
 
+	public virtual void emit (CodeGenerator codegen) {
+	}
+
 	public virtual void replace_type (DataType old_type, DataType new_type) {
 	}
 
diff --git a/vala/valacontinuestatement.vala b/vala/valacontinuestatement.vala
index 8ca4111..1de109d 100644
--- a/vala/valacontinuestatement.vala
+++ b/vala/valacontinuestatement.vala
@@ -1,6 +1,6 @@
 /* valacontinuestatement.vala
  *
- * Copyright (C) 2006-2007  Jürg Billeter
+ * Copyright (C) 2006-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -39,4 +39,8 @@ public class Vala.ContinueStatement : CodeNode, Statement {
 	public override void accept (CodeVisitor visitor) {
 		visitor.visit_continue_statement (this);
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		codegen.visit_continue_statement (this);
+	}
 }
diff --git a/vala/valadeclarationstatement.vala b/vala/valadeclarationstatement.vala
index 344000e..51d80fc 100644
--- a/vala/valadeclarationstatement.vala
+++ b/vala/valadeclarationstatement.vala
@@ -1,6 +1,6 @@
 /* valadeclarationstatement.vala
  *
- * Copyright (C) 2006-2009  Jürg Billeter
+ * Copyright (C) 2006-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -85,6 +85,10 @@ public class Vala.DeclarationStatement : CodeNode, Statement {
 		return !error;
 	}
 
+	public override void emit (CodeGenerator codegen) {
+		codegen.visit_declaration_statement (this);
+	}
+
 	public override void get_defined_variables (Collection<LocalVariable> collection) {
 		var local = declaration as LocalVariable;
 		if (local != null) {
diff --git a/vala/valadeletestatement.vala b/vala/valadeletestatement.vala
index e984084..ce76bfd 100644
--- a/vala/valadeletestatement.vala
+++ b/vala/valadeletestatement.vala
@@ -1,6 +1,6 @@
 /* valadeletestatement.vala
  *
- * Copyright (C) 2008  Jürg Billeter
+ * Copyright (C) 2008-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -20,8 +20,6 @@
  * 	Jürg Billeter <j bitron ch>
  */
 
-using GLib;
-
 /**
  * Represents a delete statement e.g. "delete a".
  */
@@ -63,4 +61,10 @@ public class Vala.DeleteStatement : CodeNode, Statement {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		expression.emit (codegen);
+
+		codegen.visit_delete_statement (this);
+	}
 }
diff --git a/vala/valaelementaccess.vala b/vala/valaelementaccess.vala
index 3622a1d..42c386f 100644
--- a/vala/valaelementaccess.vala
+++ b/vala/valaelementaccess.vala
@@ -234,6 +234,17 @@ public class Vala.ElementAccess : Expression {
 		return !error;
 	}
 
+	public override void emit (CodeGenerator codegen) {
+		container.emit (codegen);
+		foreach (Expression e in indices) {
+			e.emit (codegen);
+		}
+
+		codegen.visit_element_access (this);
+
+		codegen.visit_expression (this);
+	}
+
 	public override void get_defined_variables (Collection<LocalVariable> collection) {
 		container.get_defined_variables (collection);
 		foreach (Expression index in indices) {
diff --git a/vala/valaemptystatement.vala b/vala/valaemptystatement.vala
index 8b6826d..1cc6ae0 100644
--- a/vala/valaemptystatement.vala
+++ b/vala/valaemptystatement.vala
@@ -1,6 +1,6 @@
 /* valaemptystatement.vala
  *
- * Copyright (C) 2006-2007  Jürg Billeter
+ * Copyright (C) 2006-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -39,4 +39,8 @@ public class Vala.EmptyStatement : CodeNode, Statement {
 	public override void accept (CodeVisitor visitor) {
 		visitor.visit_empty_statement (this);
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		codegen.visit_empty_statement (this);
+	}
 }
diff --git a/vala/valaexpressionstatement.vala b/vala/valaexpressionstatement.vala
index 75f6bab..026ed4f 100644
--- a/vala/valaexpressionstatement.vala
+++ b/vala/valaexpressionstatement.vala
@@ -105,6 +105,12 @@ public class Vala.ExpressionStatement : CodeNode, Statement {
 		return !error;
 	}
 
+	public override void emit (CodeGenerator codegen) {
+		expression.emit (codegen);
+
+		codegen.visit_expression_statement (this);
+	}
+
 	public override void get_defined_variables (Collection<LocalVariable> collection) {
 		expression.get_defined_variables (collection);
 	}
diff --git a/vala/valaforeachstatement.vala b/vala/valaforeachstatement.vala
index 07a38db..30f44af 100644
--- a/vala/valaforeachstatement.vala
+++ b/vala/valaforeachstatement.vala
@@ -348,6 +348,28 @@ public class Vala.ForeachStatement : Block {
 		return !error;
 	}
 
+	public override void emit (CodeGenerator codegen) {
+		if (use_iterator) {
+			base.emit (codegen);
+			return;
+		}
+
+		collection.emit (codegen);
+		codegen.visit_end_full_expression (collection);
+
+		element_variable.active = true;
+		collection_variable.active = true;
+		if (iterator_variable != null) {
+			iterator_variable.active = true;
+		}
+
+		base.emit (codegen);
+
+		body.emit (codegen);
+
+		codegen.visit_foreach_statement (this);
+	}
+
 	public override void get_defined_variables (Collection<LocalVariable> collection) {
 		collection.add (element_variable);
 	}
diff --git a/vala/valaifstatement.vala b/vala/valaifstatement.vala
index 0804bb4..add70fb 100644
--- a/vala/valaifstatement.vala
+++ b/vala/valaifstatement.vala
@@ -139,4 +139,17 @@ public class Vala.IfStatement : CodeNode, Statement {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		condition.emit (codegen);
+
+		codegen.visit_end_full_expression (condition);
+
+		true_statement.emit (codegen);
+		if (false_statement != null) {
+			false_statement.emit (codegen);
+		}
+
+		codegen.visit_if_statement (this);
+	}
 }
diff --git a/vala/valainitializerlist.vala b/vala/valainitializerlist.vala
index c415ff2..5028caf 100644
--- a/vala/valainitializerlist.vala
+++ b/vala/valainitializerlist.vala
@@ -1,6 +1,6 @@
 /* valainitializerlist.vala
  *
- * Copyright (C) 2006-2009  Jürg Billeter
+ * Copyright (C) 2006-2010  Jürg Billeter
  * Copyright (C) 2006-2008  Raffaele Sandrini
  *
  * This library is free software; you can redistribute it and/or
@@ -198,4 +198,12 @@ public class Vala.InitializerList : Expression {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		foreach (Expression expr in initializers) {
+			expr.emit (codegen);
+		}
+
+		codegen.visit_initializer_list (this);
+	}
 }
diff --git a/vala/valaintegerliteral.vala b/vala/valaintegerliteral.vala
index 815c4e3..297eb3e 100644
--- a/vala/valaintegerliteral.vala
+++ b/vala/valaintegerliteral.vala
@@ -131,4 +131,10 @@ public class Vala.IntegerLiteral : Literal {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		codegen.visit_integer_literal (this);
+
+		codegen.visit_expression (this);
+	}
 }
diff --git a/vala/valalambdaexpression.vala b/vala/valalambdaexpression.vala
index 34130d4..d71c4b5 100644
--- a/vala/valalambdaexpression.vala
+++ b/vala/valalambdaexpression.vala
@@ -235,6 +235,12 @@ public class Vala.LambdaExpression : Expression {
 		return !error;
 	}
 
+	public override void emit (CodeGenerator codegen) {
+		codegen.visit_lambda_expression (this);
+
+		codegen.visit_expression (this);
+	}
+
 	public override void get_used_variables (Collection<LocalVariable> collection) {
 		// require captured variables to be initialized
 		if (method.closure) {
diff --git a/vala/valalistliteral.vala b/vala/valalistliteral.vala
index bee7431..f816550 100644
--- a/vala/valalistliteral.vala
+++ b/vala/valalistliteral.vala
@@ -115,4 +115,14 @@ public class Vala.ListLiteral : Literal {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		foreach (Expression expr in expression_list) {
+			expr.emit (codegen);
+		}
+
+		codegen.visit_list_literal (this);
+
+		codegen.visit_expression (this);
+	}
 }
diff --git a/vala/valalockstatement.vala b/vala/valalockstatement.vala
index da9a0be..b70b6bf 100644
--- a/vala/valalockstatement.vala
+++ b/vala/valalockstatement.vala
@@ -1,7 +1,8 @@
 /* valalockstatement.vala
  *
  * Copyright (C) 2009  JiÅ?í Zárevúcky
- * Copyright (C) 2006-2007  Raffaele Sandrini, Jürg Billeter
+ * Copyright (C) 2006-2010  Jürg Billeter
+ * Copyright (C) 2006-2007  Raffaele Sandrini
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -100,4 +101,12 @@ public class Vala.LockStatement : CodeNode, Statement {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		resource.emit (codegen);
+		if (body != null) {
+			body.emit (codegen);
+		}
+		codegen.visit_lock_statement (this);
+	}
 }
diff --git a/vala/valaloop.vala b/vala/valaloop.vala
index a0281e9..091c579 100644
--- a/vala/valaloop.vala
+++ b/vala/valaloop.vala
@@ -1,6 +1,6 @@
 /* valaloop.vala
  *
- * Copyright (C) 2009  Jürg Billeter
+ * Copyright (C) 2009-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -74,5 +74,11 @@ public class Vala.Loop : CodeNode, Statement {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		body.emit (codegen);
+
+		codegen.visit_loop (this);
+	}
 }
 
diff --git a/vala/valamapliteral.vala b/vala/valamapliteral.vala
index 677a5db..9d4fe10 100644
--- a/vala/valamapliteral.vala
+++ b/vala/valamapliteral.vala
@@ -125,4 +125,15 @@ public class Vala.MapLiteral : Literal {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		for (int i = 0; i < keys.size; i++) {
+			keys[i].emit (codegen);
+			values[i].emit (codegen);
+		}
+
+		codegen.visit_map_literal (this);
+
+		codegen.visit_expression (this);
+	}
 }
diff --git a/vala/valamemberaccess.vala b/vala/valamemberaccess.vala
index bc9717f..443e67b 100644
--- a/vala/valamemberaccess.vala
+++ b/vala/valamemberaccess.vala
@@ -784,6 +784,16 @@ public class Vala.MemberAccess : Expression {
 		return !error;
 	}
 
+	public override void emit (CodeGenerator codegen) {
+		if (inner != null) {
+			inner.emit (codegen);
+		}
+
+		codegen.visit_member_access (this);
+
+		codegen.visit_expression (this);
+	}
+
 	public override void get_defined_variables (Collection<LocalVariable> collection) {
 		if (inner != null) {
 			inner.get_defined_variables (collection);
diff --git a/vala/valamemberinitializer.vala b/vala/valamemberinitializer.vala
index 2057e31..afcb230 100644
--- a/vala/valamemberinitializer.vala
+++ b/vala/valamemberinitializer.vala
@@ -1,6 +1,6 @@
 /* valamemberinitializer.vala
  *
- * Copyright (C) 2007-2009  Jürg Billeter
+ * Copyright (C) 2007-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -72,6 +72,10 @@ public class Vala.MemberInitializer : CodeNode {
 		return initializer.check (analyzer);
 	}
 
+	public override void emit (CodeGenerator codegen) {
+		initializer.emit (codegen);
+	}
+
 	public override void replace_expression (Expression old_node, Expression new_node) {
 		if (initializer == old_node) {
 			initializer = new_node;
diff --git a/vala/valamethodcall.vala b/vala/valamethodcall.vala
index af41a66..a493c56 100644
--- a/vala/valamethodcall.vala
+++ b/vala/valamethodcall.vala
@@ -706,6 +706,25 @@ public class Vala.MethodCall : Expression {
 		return !error;
 	}
 
+	public override void emit (CodeGenerator codegen) {
+		var method_type = call.value_type as MethodType;
+
+		if (method_type != null && method_type.method_symbol.parent_symbol is Signal) {
+			var signal_access = ((MemberAccess) call).inner;
+			signal_access.emit (codegen);
+		} else {
+			call.emit (codegen);
+		}
+
+		foreach (Expression expr in argument_list) {
+			expr.emit (codegen);
+		}
+
+		codegen.visit_method_call (this);
+
+		codegen.visit_expression (this);
+	}
+
 	public override void get_defined_variables (Collection<LocalVariable> collection) {
 		call.get_defined_variables (collection);
 
diff --git a/vala/valanamedargument.vala b/vala/valanamedargument.vala
index f758fbb..6b67649 100644
--- a/vala/valanamedargument.vala
+++ b/vala/valanamedargument.vala
@@ -81,6 +81,14 @@ public class Vala.NamedArgument : Expression {
 		return !error;
 	}
 
+	public override void emit (CodeGenerator codegen) {
+		inner.emit (codegen);
+
+		codegen.visit_named_argument (this);
+
+		codegen.visit_expression (this);
+	}
+
 	public override void get_defined_variables (Collection<LocalVariable> collection) {
 		inner.get_defined_variables (collection);
 	}
diff --git a/vala/valanullliteral.vala b/vala/valanullliteral.vala
index a82217d..94be504 100644
--- a/vala/valanullliteral.vala
+++ b/vala/valanullliteral.vala
@@ -1,6 +1,6 @@
 /* valanullliteral.vala
  *
- * Copyright (C) 2006-2008  Jürg Billeter
+ * Copyright (C) 2006-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -61,4 +61,10 @@ public class Vala.NullLiteral : Literal {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		codegen.visit_null_literal (this);
+
+		codegen.visit_expression (this);
+	}
 }
diff --git a/vala/valaobjectcreationexpression.vala b/vala/valaobjectcreationexpression.vala
index 1a3ecc7..d7cc008 100644
--- a/vala/valaobjectcreationexpression.vala
+++ b/vala/valaobjectcreationexpression.vala
@@ -429,6 +429,20 @@ public class Vala.ObjectCreationExpression : Expression {
 		return !error;
 	}
 
+	public override void emit (CodeGenerator codegen) {
+		foreach (Expression arg in argument_list) {
+			arg.emit (codegen);
+		}
+
+		foreach (MemberInitializer init in object_initializer) {
+			init.emit (codegen);
+		}
+
+		codegen.visit_object_creation_expression (this);
+
+		codegen.visit_expression (this);
+	}
+
 	public override void get_defined_variables (Collection<LocalVariable> collection) {
 		foreach (Expression arg in argument_list) {
 			arg.get_defined_variables (collection);
diff --git a/vala/valapointerindirection.vala b/vala/valapointerindirection.vala
index fa5b759..17295e4 100644
--- a/vala/valapointerindirection.vala
+++ b/vala/valapointerindirection.vala
@@ -1,6 +1,6 @@
 /* valapointerindirection.vala
  *
- * Copyright (C) 2007-2008  Jürg Billeter
+ * Copyright (C) 2007-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -101,6 +101,14 @@ public class Vala.PointerIndirection : Expression {
 		return !error;
 	}
 
+	public override void emit (CodeGenerator codegen) {
+		inner.emit (codegen);
+
+		codegen.visit_pointer_indirection (this);
+
+		codegen.visit_expression (this);
+	}
+
 	public override void get_defined_variables (Collection<LocalVariable> collection) {
 		inner.get_defined_variables (collection);
 	}
diff --git a/vala/valapostfixexpression.vala b/vala/valapostfixexpression.vala
index b9d6af1..ee53151 100644
--- a/vala/valapostfixexpression.vala
+++ b/vala/valapostfixexpression.vala
@@ -1,6 +1,6 @@
 /* valapostfixexpression.vala
  *
- * Copyright (C) 2006-2009  Jürg Billeter
+ * Copyright (C) 2006-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -125,4 +125,12 @@ public class Vala.PostfixExpression : Expression {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		inner.emit (codegen);
+
+		codegen.visit_postfix_expression (this);
+
+		codegen.visit_expression (this);
+	}
 }
diff --git a/vala/valarealliteral.vala b/vala/valarealliteral.vala
index bd4c19a..f45560f 100644
--- a/vala/valarealliteral.vala
+++ b/vala/valarealliteral.vala
@@ -85,4 +85,10 @@ public class Vala.RealLiteral : Literal {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		codegen.visit_real_literal (this);
+
+		codegen.visit_expression (this);
+	}
 }
diff --git a/vala/valareferencetransferexpression.vala b/vala/valareferencetransferexpression.vala
index e09d06b..945593f 100644
--- a/vala/valareferencetransferexpression.vala
+++ b/vala/valareferencetransferexpression.vala
@@ -1,6 +1,6 @@
 /* valareferencetransferexpression.vala
  *
- * Copyright (C) 2007-2008  Jürg Billeter
+ * Copyright (C) 2007-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -115,6 +115,14 @@ public class Vala.ReferenceTransferExpression : Expression {
 		return !error;
 	}
 
+	public override void emit (CodeGenerator codegen) {
+		inner.emit (codegen);
+
+		codegen.visit_reference_transfer_expression (this);
+
+		codegen.visit_expression (this);
+	}
+
 	public override void get_defined_variables (Collection<LocalVariable> collection) {
 		inner.get_defined_variables (collection);
 	}
diff --git a/vala/valaregexliteral.vala b/vala/valaregexliteral.vala
index eb1edd5..8e4cdc6 100644
--- a/vala/valaregexliteral.vala
+++ b/vala/valaregexliteral.vala
@@ -1,6 +1,7 @@
 /* valaregexliteral.vala
  *
  * Copyright (C) 2010  Jukka-Pekka Iivonen
+ * Copyright (C) 2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -85,5 +86,11 @@ public class Vala.RegexLiteral : Literal {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		codegen.visit_regex_literal (this);
+
+		codegen.visit_expression (this);
+	}
 }
 
diff --git a/vala/valareturnstatement.vala b/vala/valareturnstatement.vala
index 399ca69..b8b2e83 100644
--- a/vala/valareturnstatement.vala
+++ b/vala/valareturnstatement.vala
@@ -1,6 +1,6 @@
 /* valareturnstatement.vala
  *
- * Copyright (C) 2006-2009  Jürg Billeter
+ * Copyright (C) 2006-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -148,6 +148,16 @@ public class Vala.ReturnStatement : CodeNode, Statement {
 		return !error;
 	}
 
+	public override void emit (CodeGenerator codegen) {
+		if (return_expression != null) {
+			return_expression.emit (codegen);
+
+			codegen.visit_end_full_expression (return_expression);
+		}
+
+		codegen.visit_return_statement (this);
+	}
+
 	public override void get_defined_variables (Collection<LocalVariable> collection) {
 		if (return_expression != null) {
 			return_expression.get_defined_variables (collection);
diff --git a/vala/valasetliteral.vala b/vala/valasetliteral.vala
index fdbb44f..42be178 100644
--- a/vala/valasetliteral.vala
+++ b/vala/valasetliteral.vala
@@ -99,4 +99,14 @@ public class Vala.SetLiteral : Literal {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		foreach (Expression expr in expression_list) {
+			expr.emit (codegen);
+		}
+
+		codegen.visit_set_literal (this);
+
+		codegen.visit_expression (this);
+	}
 }
diff --git a/vala/valasizeofexpression.vala b/vala/valasizeofexpression.vala
index 57866e3..d7b2c04 100644
--- a/vala/valasizeofexpression.vala
+++ b/vala/valasizeofexpression.vala
@@ -1,6 +1,6 @@
 /* valasizeofexpression.vala
  *
- * Copyright (C) 2006-2009  Jürg Billeter
+ * Copyright (C) 2006-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -82,4 +82,10 @@ public class Vala.SizeofExpression : Expression {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		codegen.visit_sizeof_expression (this);
+
+		codegen.visit_expression (this);
+	}
 }
diff --git a/vala/valasliceexpression.vala b/vala/valasliceexpression.vala
index 7713f73..77c5743 100644
--- a/vala/valasliceexpression.vala
+++ b/vala/valasliceexpression.vala
@@ -1,7 +1,7 @@
 /* valasliceexpression.vala
  *
  * Copyright (C) 2009 Robin Sonefors
- * Copyright (C) 2009 Jürg Billeter
+ * Copyright (C) 2009-2010 Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -163,6 +163,17 @@ public class Vala.SliceExpression : Expression {
 		return !error;
 	}
 
+	public override void emit (CodeGenerator codegen) {
+		container.emit (codegen);
+
+		start.emit (codegen);
+		stop.emit (codegen);
+
+		codegen.visit_slice_expression (this);
+
+		codegen.visit_expression (this);
+	}
+
 	public override void get_defined_variables (Collection<LocalVariable> collection) {
 		container.get_defined_variables (collection);
 		start.get_defined_variables (collection);
diff --git a/vala/valastatementlist.vala b/vala/valastatementlist.vala
index 91d9d93..934227a 100644
--- a/vala/valastatementlist.vala
+++ b/vala/valastatementlist.vala
@@ -1,6 +1,6 @@
 /* valastatementlist.vala
  *
- * Copyright (C) 2008  Jürg Billeter
+ * Copyright (C) 2008-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -53,4 +53,10 @@ public class Vala.StatementList : CodeNode, Statement {
 			stmt.accept (visitor);
 		}
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		foreach (Statement stmt in list) {
+			stmt.emit (codegen);
+		}
+	}
 }
diff --git a/vala/valastringliteral.vala b/vala/valastringliteral.vala
index 318c218..2a1cbc7 100644
--- a/vala/valastringliteral.vala
+++ b/vala/valastringliteral.vala
@@ -88,4 +88,10 @@ public class Vala.StringLiteral : Literal {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		codegen.visit_string_literal (this);
+
+		codegen.visit_expression (this);
+	}
 }
diff --git a/vala/valaswitchlabel.vala b/vala/valaswitchlabel.vala
index 67fcdc2..2a15d96 100644
--- a/vala/valaswitchlabel.vala
+++ b/vala/valaswitchlabel.vala
@@ -1,6 +1,6 @@
 /* valaswitchlabel.vala
  *
- * Copyright (C) 2006-2009  Jürg Billeter
+ * Copyright (C) 2006-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -86,4 +86,8 @@ public class Vala.SwitchLabel : CodeNode {
 
 		return true;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		codegen.visit_switch_label (this);
+	}
 }
diff --git a/vala/valaswitchsection.vala b/vala/valaswitchsection.vala
index 944035c..c8faae5 100644
--- a/vala/valaswitchsection.vala
+++ b/vala/valaswitchsection.vala
@@ -117,4 +117,12 @@ public class Vala.SwitchSection : Block {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		foreach (SwitchLabel label in labels) {
+			label.emit (codegen);
+		}
+
+		base.emit (codegen);
+	}
 }
diff --git a/vala/valaswitchstatement.vala b/vala/valaswitchstatement.vala
index be38a29..9770d56 100644
--- a/vala/valaswitchstatement.vala
+++ b/vala/valaswitchstatement.vala
@@ -140,4 +140,16 @@ public class Vala.SwitchStatement : CodeNode, Statement {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		expression.emit (codegen);
+
+		codegen.visit_end_full_expression (expression);
+
+		foreach (SwitchSection section in sections) {
+			section.emit (codegen);
+		}
+
+		codegen.visit_switch_statement (this);
+	}
 }
diff --git a/vala/valathrowstatement.vala b/vala/valathrowstatement.vala
index f946540..444df3c 100644
--- a/vala/valathrowstatement.vala
+++ b/vala/valathrowstatement.vala
@@ -113,6 +113,16 @@ public class Vala.ThrowStatement : CodeNode, Statement {
 		return !error;
 	}
 
+	public override void emit (CodeGenerator codegen) {
+		if (error_expression != null) {
+			error_expression.emit (codegen);
+
+			codegen.visit_end_full_expression (error_expression);
+		}
+
+		codegen.visit_throw_statement (this);
+	}
+
 	public override void get_defined_variables (Collection<LocalVariable> collection) {
 		error_expression.get_defined_variables (collection);
 	}
diff --git a/vala/valatrystatement.vala b/vala/valatrystatement.vala
index 540af3e..e5d3b2e 100644
--- a/vala/valatrystatement.vala
+++ b/vala/valatrystatement.vala
@@ -147,4 +147,8 @@ public class Vala.TryStatement : CodeNode, Statement {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		codegen.visit_try_statement (this);
+	}
 }
diff --git a/vala/valatuple.vala b/vala/valatuple.vala
index 75d22c4..2fcc45d 100644
--- a/vala/valatuple.vala
+++ b/vala/valatuple.vala
@@ -89,4 +89,14 @@ public class Vala.Tuple : Expression {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		foreach (Expression expr in expression_list) {
+			expr.emit (codegen);
+		}
+
+		codegen.visit_tuple (this);
+
+		codegen.visit_expression (this);
+	}
 }
diff --git a/vala/valatypecheck.vala b/vala/valatypecheck.vala
index 7097ab8..4e002dc 100644
--- a/vala/valatypecheck.vala
+++ b/vala/valatypecheck.vala
@@ -1,6 +1,6 @@
 /* valatypecheck.vala
  *
- * Copyright (C) 2006-2009  Jürg Billeter
+ * Copyright (C) 2006-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -112,4 +112,12 @@ public class Vala.TypeCheck : Expression {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		expression.emit (codegen);
+
+		codegen.visit_type_check (this);
+
+		codegen.visit_expression (this);
+	}
 }
diff --git a/vala/valatypeofexpression.vala b/vala/valatypeofexpression.vala
index 99d9145..2a31ec0 100644
--- a/vala/valatypeofexpression.vala
+++ b/vala/valatypeofexpression.vala
@@ -1,6 +1,6 @@
 /* valatypeofexpression.vala
  *
- * Copyright (C) 2006-2009  Jürg Billeter
+ * Copyright (C) 2006-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -82,4 +82,10 @@ public class Vala.TypeofExpression : Expression {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		codegen.visit_typeof_expression (this);
+
+		codegen.visit_expression (this);
+	}
 }
diff --git a/vala/valaunaryexpression.vala b/vala/valaunaryexpression.vala
index d2d38dd..c137cb2 100644
--- a/vala/valaunaryexpression.vala
+++ b/vala/valaunaryexpression.vala
@@ -234,6 +234,14 @@ public class Vala.UnaryExpression : Expression {
 		return !error;
 	}
 
+	public override void emit (CodeGenerator codegen) {
+		inner.emit (codegen);
+
+		codegen.visit_unary_expression (this);
+
+		codegen.visit_expression (this);
+	}
+
 	public override void get_defined_variables (Collection<LocalVariable> collection) {
 		inner.get_defined_variables (collection);
 		if (operator == UnaryOperator.OUT || operator == UnaryOperator.REF) {
diff --git a/vala/valaunlockstatement.vala b/vala/valaunlockstatement.vala
index e0ae1a0..f862955 100644
--- a/vala/valaunlockstatement.vala
+++ b/vala/valaunlockstatement.vala
@@ -1,6 +1,7 @@
 /* valaunlockstatement.vala
  *
- * Copyright (C) 2009  JiÅ?í Zárevúcky, Jürg Billeter
+ * Copyright (C) 2009-2010  Jürg Billeter
+ * Copyright (C) 2009  JiÅ?í Zárevúcky
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -67,4 +68,9 @@ public class Vala.UnlockStatement : CodeNode, Statement {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		resource.emit (codegen);
+		codegen.visit_unlock_statement (this);
+	}
 }
diff --git a/vala/valayieldstatement.vala b/vala/valayieldstatement.vala
index ca4d0d6..be526a1 100644
--- a/vala/valayieldstatement.vala
+++ b/vala/valayieldstatement.vala
@@ -1,6 +1,6 @@
 /* valayieldstatement.vala
  *
- * Copyright (C) 2008  Jürg Billeter
+ * Copyright (C) 2008-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -77,5 +77,15 @@ public class Vala.YieldStatement : CodeNode, Statement {
 
 		return !error;
 	}
+
+	public override void emit (CodeGenerator codegen) {
+		if (yield_expression != null) {
+			yield_expression.emit (codegen);
+
+			codegen.visit_end_full_expression (yield_expression);
+		}
+
+		codegen.visit_yield_statement (this);
+	}
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]