1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

cgen: add comptime field.name checking (#17318)

This commit is contained in:
Felipe Pena 2023-02-16 06:46:27 -03:00 committed by GitHub
parent cad2cd5583
commit 7f5cba1a38
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 51 additions and 9 deletions

View File

@ -536,11 +536,13 @@ fn (mut g Gen) comptime_if_cond(cond ast.Expr, pkg_exist bool) (bool, bool) {
} }
.eq, .ne { .eq, .ne {
// TODO Implement `$if method.args.len == 1` // TODO Implement `$if method.args.len == 1`
if cond.left is ast.SelectorExpr && g.comptime_for_method.len > 0 if cond.left is ast.SelectorExpr
&& (g.comptime_for_field_var.len > 0 || g.comptime_for_method.len > 0)
&& cond.right is ast.StringLiteral { && cond.right is ast.StringLiteral {
selector := cond.left as ast.SelectorExpr selector := cond.left as ast.SelectorExpr
if selector.expr is ast.Ident if selector.expr is ast.Ident && selector.field_name == 'name' {
&& (selector.expr as ast.Ident).name == g.comptime_for_method_var && selector.field_name == 'name' { if g.comptime_for_method_var.len > 0
&& (selector.expr as ast.Ident).name == g.comptime_for_method_var {
is_equal := g.comptime_for_method == cond.right.val is_equal := g.comptime_for_method == cond.right.val
if is_equal { if is_equal {
g.write('1') g.write('1')
@ -548,6 +550,16 @@ fn (mut g Gen) comptime_if_cond(cond ast.Expr, pkg_exist bool) (bool, bool) {
g.write('0') g.write('0')
} }
return is_equal, true return is_equal, true
} else if g.comptime_for_field_var.len > 0
&& (selector.expr as ast.Ident).name == g.comptime_for_field_var {
is_equal := g.comptime_for_field_value.name == cond.right.val
if is_equal {
g.write('1')
} else {
g.write('0')
}
return is_equal, true
}
} }
} }
if cond.left is ast.SelectorExpr || cond.right is ast.SelectorExpr { if cond.left is ast.SelectorExpr || cond.right is ast.SelectorExpr {

View File

@ -0,0 +1,30 @@
struct User {
name string
age int
}
fn (u User) a() {}
fn (u User) b() {}
fn (u User) c() {}
fn test_method_name() {
mut out := []string{}
$for field in User.methods {
$if field.name == 'b' {
out << 'ok'
}
}
assert out.len == 1
}
fn test_field_name() {
mut out := []string{}
$for field in User.fields {
$if field.name == 'name' {
out << 'ok'
}
}
assert out.len == 1
}