mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
v2: clean up IndexExpr type check
This commit is contained in:
parent
e5f5117a7e
commit
6489b48c9c
|
@ -249,7 +249,7 @@ pub:
|
||||||
pos token.Position
|
pos token.Position
|
||||||
left Expr
|
left Expr
|
||||||
index Expr // [0], [start..end] etc
|
index Expr // [0], [start..end] etc
|
||||||
typ table.Type
|
// typ table.Type
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct IfExpr {
|
pub struct IfExpr {
|
||||||
|
|
|
@ -199,11 +199,9 @@ fn (c &Checker) stmt(node ast.Stmt) {
|
||||||
typ := c.expr(it.expr)
|
typ := c.expr(it.expr)
|
||||||
// it.typ = typ
|
// it.typ = typ
|
||||||
// println('checker: var decl $typ.name it.typ=$it.typ.name $it.pos.line_nr')
|
// println('checker: var decl $typ.name it.typ=$it.typ.name $it.pos.line_nr')
|
||||||
/*
|
|
||||||
if typ.kind != .void {
|
if typ.kind != .void {
|
||||||
it.typ = typ
|
it.typ = typ
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
// if it.typ.kind == .unresolved {
|
// if it.typ.kind == .unresolved {
|
||||||
// it.ti = typ
|
// it.ti = typ
|
||||||
// println('unresolved var')
|
// println('unresolved var')
|
||||||
|
@ -313,7 +311,19 @@ pub fn (c &Checker) expr(node ast.Expr) table.Type {
|
||||||
|
|
||||||
pub fn (c &Checker) index_expr(node ast.IndexExpr) table.Type {
|
pub fn (c &Checker) index_expr(node ast.IndexExpr) table.Type {
|
||||||
mut typ := c.expr(node.left)
|
mut typ := c.expr(node.left)
|
||||||
|
mut is_range := false // TODO is_range := node.index is ast.RangeExpr
|
||||||
|
match node.index {
|
||||||
|
ast.RangeExpr {
|
||||||
|
is_range = true
|
||||||
|
}
|
||||||
|
else {}
|
||||||
|
}
|
||||||
|
// TODO
|
||||||
|
// info := ti.info as table.Array
|
||||||
|
// ti = p.table.types[info.elem_type_idx]
|
||||||
if typ.name.starts_with('array_') {
|
if typ.name.starts_with('array_') {
|
||||||
|
if is_range {} // `x[start..end]` has the same type as `x`
|
||||||
|
else {
|
||||||
elm_typ := typ.name[6..]
|
elm_typ := typ.name[6..]
|
||||||
// TODO `typ = ... or ...`
|
// TODO `typ = ... or ...`
|
||||||
x := c.table.find_type(elm_typ) or {
|
x := c.table.find_type(elm_typ) or {
|
||||||
|
@ -321,6 +331,12 @@ pub fn (c &Checker) index_expr(node ast.IndexExpr) table.Type {
|
||||||
exit(0)
|
exit(0)
|
||||||
}
|
}
|
||||||
typ = x
|
typ = x
|
||||||
|
// Check index type
|
||||||
|
index_type := c.expr(node.index)
|
||||||
|
if index_type.kind != .int {
|
||||||
|
c.error('non-integer index (type `$index_type.name`)', node.pos)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
typ = table.int_type
|
typ = table.int_type
|
||||||
|
|
|
@ -491,7 +491,7 @@ pub fn (p mut Parser) expr(precedence int) (ast.Expr,table.Type) {
|
||||||
node,typ = p.dot_expr(node, typ)
|
node,typ = p.dot_expr(node, typ)
|
||||||
}
|
}
|
||||||
else if p.tok.kind == .lsbr {
|
else if p.tok.kind == .lsbr {
|
||||||
node,typ = p.index_expr(node, typ)
|
node = p.index_expr(node) // , typ)
|
||||||
}
|
}
|
||||||
else if p.tok.kind.is_infix() {
|
else if p.tok.kind.is_infix() {
|
||||||
node,typ = p.infix_expr(node)
|
node,typ = p.infix_expr(node)
|
||||||
|
@ -524,38 +524,20 @@ fn (p mut Parser) prefix_expr() (ast.Expr,table.Type) {
|
||||||
return expr,ti
|
return expr,ti
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (p mut Parser) index_expr(left ast.Expr, typ_ table.Type) (ast.Expr,table.Type) {
|
// fn (p mut Parser) index_expr(left ast.Expr, typ_ table.Type) (ast.Expr,table.Type) {
|
||||||
mut typ := typ_
|
fn (p mut Parser) index_expr(left ast.Expr) ast.Expr {
|
||||||
// TODO
|
// mut typ := typ_
|
||||||
// info := ti.info as table.Array
|
|
||||||
// ti = p.table.types[info.elem_type_idx]
|
|
||||||
if typ.name.starts_with('array_') {
|
|
||||||
elm_typ := typ.name[6..]
|
|
||||||
// TODO `typ = ... or ...`
|
|
||||||
x := p.table.find_type(elm_typ) or {
|
|
||||||
p.error(elm_typ)
|
|
||||||
exit(0)
|
|
||||||
}
|
|
||||||
typ = x
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
typ = table.int_type
|
|
||||||
}
|
|
||||||
// println('index expr$p.tok.str() line=$p.tok.line_nr')
|
// println('index expr$p.tok.str() line=$p.tok.line_nr')
|
||||||
p.next() // [
|
p.next() // [
|
||||||
// `numbers[..end]`
|
|
||||||
mut index_expr := ast.Expr{}
|
mut index_expr := ast.Expr{}
|
||||||
if p.tok.kind == .dotdot {
|
if p.tok.kind == .dotdot {
|
||||||
|
// `numbers[..end]`
|
||||||
index_expr = p.range_expr(left)
|
index_expr = p.range_expr(left)
|
||||||
typ = typ_ // set the type back to array
|
// typ = typ_ // set the type back to array
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// println('start index expr')
|
// println('start index expr')
|
||||||
mut index_type := table.Type{}
|
index_expr,_ = p.expr(0)
|
||||||
index_expr,index_type = p.expr(0)
|
|
||||||
if index_type.kind != .int {
|
|
||||||
p.error('non-integer index (type `$typ.name`)')
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// println('end expr typ=$typ.name')
|
// println('end expr typ=$typ.name')
|
||||||
p.check(.rsbr)
|
p.check(.rsbr)
|
||||||
|
@ -565,10 +547,12 @@ fn (p mut Parser) index_expr(left ast.Expr, typ_ table.Type) (ast.Expr,table.Typ
|
||||||
node = ast.IndexExpr{
|
node = ast.IndexExpr{
|
||||||
left: left
|
left: left
|
||||||
index: index_expr
|
index: index_expr
|
||||||
typ: typ
|
pos: p.tok.position()
|
||||||
|
// typ: typ
|
||||||
|
|
||||||
}
|
}
|
||||||
// return node
|
return node
|
||||||
return node,typ
|
// return node,typ
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (p mut Parser) dot_expr(left ast.Expr, left_ti &table.Type) (ast.Expr,table.Type) {
|
fn (p mut Parser) dot_expr(left ast.Expr, left_ti &table.Type) (ast.Expr,table.Type) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user