v2: start to fix index expr for map/array/fixed array

pull/3779/head
joe-conigliaro 2020-02-19 21:45:06 +11:00
parent 42399d24d9
commit 69634c60b3
1 changed files with 19 additions and 20 deletions

View File

@ -544,31 +544,30 @@ pub fn (c mut Checker) index_expr(node ast.IndexExpr) table.Type {
} }
else {} else {}
} }
index_type := c.expr(node.index)
// if index_type.typ.kind != .int {
if table.type_idx(index_type) != table.int_type_idx {
index_type_sym := c.table.get_type_symbol(index_type)
c.error('non-integer index (type `$index_type_sym.name`)', node.pos)
}
typ_sym := c.table.get_type_symbol(typ) typ_sym := c.table.get_type_symbol(typ)
if typ_sym.kind == .array { if !is_range {
if is_range {} // `x[start..end]` has the same type as `x` index_type := c.expr(node.index)
else { // if index_type.typ.kind != .int {
if table.type_idx(index_type) != table.int_type_idx {
index_type_sym := c.table.get_type_symbol(index_type)
c.error('non-integer index (type `$index_type_sym.name`)', node.pos)
}
if typ_sym.kind == .array {
// Check index type // Check index type
info := typ_sym.info as table.Array info := typ_sym.info as table.Array
return info.elem_type return info.elem_type
} }
} if typ_sym.kind == .array_fixed {
if typ_sym.kind == .array_fixed { info := typ_sym.info as table.ArrayFixed
info := typ_sym.info as table.ArrayFixed return info.elem_type
return info.elem_type }
} else if typ_sym.kind == .map {
else if typ_sym.kind == .map { info := typ_sym.info as table.Map
info := typ_sym.info as table.Map return info.value_type
return info.value_type }
} else {
else { typ = table.int_type
typ = table.int_type }
} }
return typ return typ
} }