Browse Source

Update ast.clone

gingerBill 4 years ago
parent
commit
c8360f4fff
1 changed files with 16 additions and 59 deletions
  1. 16 59
      core/odin/ast/clone.odin

+ 16 - 59
core/odin/ast/clone.odin

@@ -74,8 +74,9 @@ clone_node :: proc(node: ^Node) -> ^Node {
 	}
 	mem.copy(res, src, size);
 	res.derived.data = rawptr(res);
+	res.derived.id = node.derived.id;
 
-	switch n in node.derived {
+	switch r in &res.derived {
 	case Bad_Expr:
 	case Ident:
 	case Implicit:
@@ -83,155 +84,132 @@ clone_node :: proc(node: ^Node) -> ^Node {
 	case Basic_Lit:
 
 	case Ellipsis:
-		r := cast(^Ellipsis)res;
 		r.expr = clone(r.expr);
 	case Proc_Lit:
-		r := cast(^Proc_Lit)res;
 		r.type = auto_cast clone(r.type);
 		r.body = clone(r.body);
 	case Comp_Lit:
-		r := cast(^Comp_Lit)res;
 		r.type  = clone(r.type);
 		r.elems = clone(r.elems);
 
 	case Tag_Expr:
-		r := cast(^Tag_Expr)res;
 		r.expr = clone(r.expr);
 	case Unary_Expr:
-		r := cast(^Unary_Expr)res;
 		r.expr = clone(r.expr);
 	case Binary_Expr:
-		r := cast(^Binary_Expr)res;
 		r.left  = clone(r.left);
 		r.right = clone(r.right);
 	case Paren_Expr:
-		r := cast(^Paren_Expr)res;
 		r.expr = clone(r.expr);
 	case Selector_Expr:
-		r := cast(^Selector_Expr)res;
 		r.expr = clone(r.expr);
 		r.field = auto_cast clone(r.field);
+	case Implicit_Selector_Expr:
+		r.field = auto_cast clone(r.field);
+	case Selector_Call_Expr:
+		r.expr = clone(r.expr);
+		r.call = auto_cast clone(r.call);
 	case Index_Expr:
-		r := cast(^Index_Expr)res;
 		r.expr = clone(r.expr);
 		r.index = clone(r.index);
 	case Deref_Expr:
-		r := cast(^Deref_Expr)res;
 		r.expr = clone(r.expr);
 	case Slice_Expr:
-		r := cast(^Slice_Expr)res;
 		r.expr = clone(r.expr);
 		r.low  = clone(r.low);
 		r.high = clone(r.high);
 	case Call_Expr:
-		r := cast(^Call_Expr)res;
 		r.expr = clone(r.expr);
 		r.args = clone(r.args);
 	case Field_Value:
-		r := cast(^Field_Value)res;
 		r.field = clone(r.field);
 		r.value = clone(r.value);
 	case Ternary_Expr:
-		r := cast(^Ternary_Expr)res;
 		r.cond = clone(r.cond);
 		r.x    = clone(r.x);
 		r.y    = clone(r.y);
 	case Ternary_If_Expr:
-		r := cast(^Ternary_If_Expr)res;
 		r.x    = clone(r.x);
 		r.cond = clone(r.cond);
 		r.y    = clone(r.y);
 	case Ternary_When_Expr:
-		r := cast(^Ternary_When_Expr)res;
 		r.x    = clone(r.x);
 		r.cond = clone(r.cond);
 		r.y    = clone(r.y);
 	case Type_Assertion:
-		r := cast(^Type_Assertion)res;
 		r.expr = clone(r.expr);
 		r.type = clone(r.type);
 	case Type_Cast:
-		r := cast(^Type_Cast)res;
 		r.type = clone(r.type);
 		r.expr = clone(r.expr);
 	case Auto_Cast:
-		r := cast(^Auto_Cast)res;
 		r.expr = clone(r.expr);
+	case Inline_Asm_Expr:
+		r.param_types        = clone(r.param_types);
+		r.return_type        = clone(r.return_type);
+		r.constraints_string = clone(r.constraints_string);
+		r.asm_string         = clone(r.asm_string);
 
 	case Bad_Stmt:
+		// empty
 	case Empty_Stmt:
+		// empty
 	case Expr_Stmt:
-		r := cast(^Expr_Stmt)res;
 		r.expr = clone(r.expr);
 	case Tag_Stmt:
-		r := cast(^Expr_Stmt)res;
-		r.expr = clone(r.expr);
+		r.stmt = clone(r.stmt);
 
 	case Assign_Stmt:
-		r := cast(^Assign_Stmt)res;
 		r.lhs = clone(r.lhs);
 		r.rhs = clone(r.rhs);
 	case Block_Stmt:
-		r := cast(^Block_Stmt)res;
 		r.label = auto_cast clone(r.label);
 		r.stmts = clone(r.stmts);
 	case If_Stmt:
-		r := cast(^If_Stmt)res;
 		r.label     = auto_cast clone(r.label);
 		r.init      = clone(r.init);
 		r.cond      = clone(r.cond);
 		r.body      = clone(r.body);
 		r.else_stmt = clone(r.else_stmt);
 	case When_Stmt:
-		r := cast(^When_Stmt)res;
 		r.cond      = clone(r.cond);
 		r.body      = clone(r.body);
 		r.else_stmt = clone(r.else_stmt);
 	case Return_Stmt:
-		r := cast(^Return_Stmt)res;
 		r.results = clone(r.results);
 	case Defer_Stmt:
-		r := cast(^Defer_Stmt)res;
 		r.stmt = clone(r.stmt);
 	case For_Stmt:
-		r := cast(^For_Stmt)res;
 		r.label = auto_cast clone(r.label);
 		r.init = clone(r.init);
 		r.cond = clone(r.cond);
 		r.post = clone(r.post);
 		r.body = clone(r.body);
 	case Range_Stmt:
-		r := cast(^Range_Stmt)res;
 		r.label = auto_cast clone(r.label);
 		r.val0 = clone(r.val0);
 		r.val1 = clone(r.val1);
 		r.expr = clone(r.expr);
 		r.body = clone(r.body);
 	case Case_Clause:
-		r := cast(^Case_Clause)res;
 		r.list = clone(r.list);
 		r.body = clone(r.body);
 	case Switch_Stmt:
-		r := cast(^Switch_Stmt)res;
 		r.label = auto_cast clone(r.label);
 		r.init = clone(r.init);
 		r.cond = clone(r.cond);
 		r.body = clone(r.body);
 	case Type_Switch_Stmt:
-		r := cast(^Type_Switch_Stmt)res;
 		r.label = auto_cast clone(r.label);
 		r.tag  = clone(r.tag);
 		r.expr = clone(r.expr);
 		r.body = clone(r.body);
 	case Branch_Stmt:
-		r := cast(^Branch_Stmt)res;
 		r.label = auto_cast clone(r.label);
 	case Using_Stmt:
-		r := cast(^Using_Stmt)res;
 		r.list = clone(r.list);
 	case Bad_Decl:
 	case Value_Decl:
-		r := cast(^Value_Decl)res;
 		r.attributes = clone(r.attributes);
 		r.names      = clone(r.names);
 		r.type       = clone(r.type);
@@ -239,85 +217,64 @@ clone_node :: proc(node: ^Node) -> ^Node {
 	case Package_Decl:
 	case Import_Decl:
 	case Foreign_Block_Decl:
-		r := cast(^Foreign_Block_Decl)res;
 		r.attributes      = clone(r.attributes);
 		r.foreign_library = clone(r.foreign_library);
 		r.body            = clone(r.body);
 	case Foreign_Import_Decl:
-		r := cast(^Foreign_Import_Decl)res;
 		r.name = auto_cast clone(r.name);
 	case Proc_Group:
-		r := cast(^Proc_Group)res;
 		r.args = clone(r.args);
 	case Attribute:
-		r := cast(^Attribute)res;
 		r.elems = clone(r.elems);
 	case Field:
-		r := cast(^Field)res;
 		r.names         = clone(r.names);
 		r.type          = clone(r.type);
 		r.default_value = clone(r.default_value);
 	case Field_List:
-		r := cast(^Field_List)res;
 		r.list = clone(r.list);
 	case Typeid_Type:
-		r := cast(^Typeid_Type)res;
 		r.specialization = clone(r.specialization);
 	case Helper_Type:
-		r := cast(^Helper_Type)res;
 		r.type = clone(r.type);
 	case Distinct_Type:
-		r := cast(^Distinct_Type)res;
 		r.type = clone(r.type);
 	case Opaque_Type:
-		r := cast(^Opaque_Type)res;
 		r.type = clone(r.type);
 	case Poly_Type:
-		r := cast(^Poly_Type)res;
 		r.type = auto_cast clone(r.type);
 		r.specialization = clone(r.specialization);
 	case Proc_Type:
-		r := cast(^Proc_Type)res;
 		r.params  = auto_cast clone(r.params);
 		r.results = auto_cast clone(r.results);
 	case Pointer_Type:
-		r := cast(^Pointer_Type)res;
 		r.elem = clone(r.elem);
 	case Array_Type:
-		r := cast(^Array_Type)res;
 		r.len  = clone(r.len);
 		r.elem = clone(r.elem);
 	case Dynamic_Array_Type:
-		r := cast(^Dynamic_Array_Type)res;
 		r.elem = clone(r.elem);
 	case Struct_Type:
-		r := cast(^Struct_Type)res;
 		r.poly_params = auto_cast clone(r.poly_params);
 		r.align = clone(r.align);
 		r.fields = auto_cast clone(r.fields);
 	case Union_Type:
-		r := cast(^Union_Type)res;
 		r.poly_params = auto_cast clone(r.poly_params);
 		r.align = clone(r.align);
 		r.variants = clone(r.variants);
 	case Enum_Type:
-		r := cast(^Enum_Type)res;
 		r.base_type = clone(r.base_type);
 		r.fields = clone(r.fields);
 	case Bit_Field_Type:
-		r := cast(^Bit_Field_Type)res;
 		r.fields = clone(r.fields);
 	case Bit_Set_Type:
-		r := cast(^Bit_Set_Type)res;
 		r.elem = clone(r.elem);
 		r.underlying = clone(r.underlying);
 	case Map_Type:
-		r := cast(^Map_Type)res;
 		r.key = clone(r.key);
 		r.value = clone(r.value);
 
 	case:
-		fmt.panicf("Unhandled node kind: %T", n);
+		fmt.panicf("Unhandled node kind: %T", r);
 	}
 
 	return res;