cgen: use overloaded eq op in auto eq method (#9475)
parent
36cc4880a6
commit
6f5259571d
|
@ -68,7 +68,18 @@ fn (mut g Gen) gen_struct_equality_fn(left table.Type) string {
|
|||
info := left_sym.struct_info()
|
||||
g.type_definitions.writeln('static bool ${ptr_typ}_struct_eq($ptr_typ a, $ptr_typ b); // auto')
|
||||
mut fn_builder := strings.new_builder(512)
|
||||
defer {
|
||||
g.auto_fn_definitions << fn_builder.str()
|
||||
}
|
||||
fn_builder.writeln('static bool ${ptr_typ}_struct_eq($ptr_typ a, $ptr_typ b) {')
|
||||
|
||||
// orverloaded
|
||||
if left_sym.has_method('==') {
|
||||
fn_builder.writeln('\treturn ${ptr_typ}__eq(a, b);')
|
||||
fn_builder.writeln('}')
|
||||
return ptr_typ
|
||||
}
|
||||
|
||||
for field in info.fields {
|
||||
sym := g.table.get_type_symbol(field.typ)
|
||||
if sym.kind == .string {
|
||||
|
@ -101,7 +112,6 @@ fn (mut g Gen) gen_struct_equality_fn(left table.Type) string {
|
|||
}
|
||||
fn_builder.writeln('\treturn true;')
|
||||
fn_builder.writeln('}')
|
||||
g.auto_fn_definitions << fn_builder.str()
|
||||
return ptr_typ
|
||||
}
|
||||
|
||||
|
|
|
@ -3301,7 +3301,6 @@ fn (mut g Gen) enum_expr(node ast.Expr) {
|
|||
}
|
||||
|
||||
fn (mut g Gen) infix_gen_equality(node ast.InfixExpr, left_type table.Type, left_sym table.TypeSymbol, right_sym table.TypeSymbol) {
|
||||
has_eq_overloaded := left_sym.has_method('==')
|
||||
if left_sym.kind != right_sym.kind {
|
||||
return
|
||||
}
|
||||
|
@ -3396,15 +3395,6 @@ fn (mut g Gen) infix_gen_equality(node ast.InfixExpr, left_type table.Type, left
|
|||
g.write(')')
|
||||
}
|
||||
.struct_ {
|
||||
if has_eq_overloaded {
|
||||
// Define `==` as negation of Autogenerated `!=`
|
||||
styp := g.typ(left_type)
|
||||
if node.op == .ne {
|
||||
g.write('!${styp}__eq(')
|
||||
} else if node.op == .eq {
|
||||
g.write('${styp}__eq(')
|
||||
}
|
||||
} else {
|
||||
// Auto generate both `==` and `!=`
|
||||
ptr_typ := g.gen_struct_equality_fn(left_type)
|
||||
if node.op == .eq {
|
||||
|
@ -3412,7 +3402,6 @@ fn (mut g Gen) infix_gen_equality(node ast.InfixExpr, left_type table.Type, left
|
|||
} else if node.op == .ne {
|
||||
g.write('!${ptr_typ}_struct_eq(')
|
||||
}
|
||||
}
|
||||
if node.left_type.is_ptr() {
|
||||
g.write('*')
|
||||
}
|
||||
|
|
|
@ -1,11 +1,21 @@
|
|||
struct Company {
|
||||
name string
|
||||
description string
|
||||
}
|
||||
|
||||
fn (lhs Company) == (rhs Company) bool {
|
||||
return lhs.name == rhs.name
|
||||
}
|
||||
|
||||
struct User {
|
||||
name string
|
||||
age int
|
||||
company Company
|
||||
}
|
||||
|
||||
fn test_struct_equality() {
|
||||
mut usr1 := User{'sanath', 28}
|
||||
mut usr2 := User{'sanath', 28}
|
||||
mut usr1 := User{'sanath', 28, Company{'awesome company', 'we are awesome'}}
|
||||
mut usr2 := User{'sanath', 28, Company{'awesome company', 'we are awesome too'}}
|
||||
if usr1 == usr2 {
|
||||
println('Same User')
|
||||
} else {
|
||||
|
|
Loading…
Reference in New Issue