cgen: implement fixed array `.len` property (#6212)
parent
8e4ee54070
commit
479bfa28de
|
@ -106,7 +106,7 @@ pub:
|
|||
pub struct SelectorExpr {
|
||||
pub:
|
||||
pos token.Position
|
||||
expr Expr
|
||||
expr Expr // expr.field_name
|
||||
field_name string
|
||||
pub mut:
|
||||
expr_type table.Type // type of `Foo` in `Foo.bar`
|
||||
|
|
|
@ -1470,7 +1470,7 @@ pub fn (mut c Checker) selector_expr(mut selector_expr ast.SelectorExpr) table.T
|
|||
sym := c.table.get_type_symbol(c.unwrap_generic(typ))
|
||||
field_name := selector_expr.field_name
|
||||
// variadic
|
||||
if typ.has_flag(.variadic) {
|
||||
if typ.has_flag(.variadic) || sym.kind == .array_fixed {
|
||||
if field_name == 'len' {
|
||||
selector_expr.typ = table.int_type
|
||||
return table.int_type
|
||||
|
|
|
@ -2100,6 +2100,13 @@ fn (mut g Gen) expr(node ast.Expr) {
|
|||
g.struct_init(node)
|
||||
}
|
||||
ast.SelectorExpr {
|
||||
sym := g.table.get_type_symbol(node.expr_type)
|
||||
if sym.kind == .array_fixed {
|
||||
assert node.field_name == 'len'
|
||||
info := sym.info as table.ArrayFixed
|
||||
g.write('$info.size')
|
||||
return
|
||||
}
|
||||
g.expr(node.expr)
|
||||
if node.expr_type.is_ptr() {
|
||||
g.write('->')
|
||||
|
|
|
@ -11,7 +11,7 @@ fn test_fixed_array_can_be_assigned() {
|
|||
v = [8]f64{}
|
||||
assert v[1] == 0
|
||||
// test slicing
|
||||
for e in v[0..8] {
|
||||
for e in v[0..v.len] {
|
||||
assert e == 0
|
||||
}
|
||||
v = [8]f64{init: 3.0}
|
||||
|
@ -21,6 +21,7 @@ fn test_fixed_array_can_be_assigned() {
|
|||
fn test_fixed_array_can_be_used_in_declaration() {
|
||||
x := 2.32
|
||||
v := [1.0, x, 3.0,4.0,5.0,6.0,7.0,8.0]!!
|
||||
assert v.len == 8
|
||||
assert v[1] == x
|
||||
}
|
||||
|
||||
|
@ -32,6 +33,7 @@ struct Context {
|
|||
|
||||
fn test_fixed_array_can_be_assigned_to_a_struct_field() {
|
||||
mut ctx := Context{}
|
||||
assert ctx.vb.len == 8
|
||||
x := 2.32
|
||||
ctx.vb = [1.1, x, 3.3, 4.4, 5.0, 6.0, 7.0, 8.9]!!
|
||||
assert ctx.vb[1] == x
|
||||
|
|
Loading…
Reference in New Issue