struct field check + enable v2 again

pull/3361/head
Alexander Medvednikov 2020-01-07 16:06:37 +01:00
parent 2ab7b40f2f
commit 9861b24bc3
4 changed files with 30 additions and 23 deletions

View File

@ -8,12 +8,10 @@ import (
os.cmdline
strings
filepath
//compiler.x64
// v.gen.x64
//v.types
// v.table
// v.parser
// v.gen
v.gen.x64
v.table
v.parser
v.gen
time
)
@ -382,8 +380,6 @@ pub fn (v mut V) compile() {
v.cc()
}
pub fn (v &V) compile2() {}
/*
pub fn (v mut V) compile2() {
if os.user_os() != 'windows' && v.pref.ccompiler == 'msvc' {
verror('Cannot build with msvc on ${os.user_os()}')
@ -418,10 +414,7 @@ pub fn (v mut V) compile2() {
v.cc()
}
*/
pub fn (v &V) compile_x64() {}
/*
pub fn (v mut V) compile_x64() {
$if !linux {
println('v -x64 can only generate Linux binaries for now')
@ -436,16 +429,7 @@ pub fn (v mut V) compile_x64() {
println('PARSE: ${time.ticks() - ticks}ms')
x64.gen(files, v.out_name)
println('x64 GEN: ${time.ticks() - ticks}ms')
/*
for f in v.files {
v.parse(f, .decl)
}
for f in v.files {
v.parse(f, .main)
}
*/
}
*/
fn (v mut V) generate_init() {
$if js {

View File

@ -4,7 +4,7 @@ import (
strings
v.ast
v.table
v.types
// v.types
term
)

View File

@ -269,6 +269,10 @@ pub fn (p mut Parser) name_expr() (ast.Expr,types.TypeIdent) {
p.next()
p.check(.dot)
}
else if p.tok.lit in ['strings'] {
p.next()
p.check(.dot)
}
// fn call
if p.peek_tok.kind == .lpar {
x,ti2 := p.call_expr() // TODO `node,typ :=` should work
@ -363,7 +367,7 @@ pub fn (p mut Parser) expr(precedence int) (ast.Expr,types.TypeIdent) {
node = p.assign_expr(node)
}
else if p.tok.kind == .dot {
node,ti = p.dot_expr(node)
node,ti = p.dot_expr(node, ti)
}
else if p.tok.kind == .lsbr {
node,ti = p.index_expr(node)
@ -416,9 +420,20 @@ fn (p mut Parser) index_expr(left ast.Expr) (ast.Expr,types.TypeIdent) {
return node,ti
}
fn (p mut Parser) dot_expr(left ast.Expr) (ast.Expr,types.TypeIdent) {
fn (p mut Parser) dot_expr(left ast.Expr, ti types.TypeIdent) (ast.Expr,types.TypeIdent) {
p.next()
field_name := p.check_name()
typ := p.table.types[ti.idx] as types.Struct
mut ok := false
for field in typ.fields {
if field.name == field_name {
ok = true
break
}
}
if !ok {
p.error('type `$typ.name` has no field or method `$field_name`')
}
// Method call
if p.tok.kind == .lpar {
p.next()

View File

@ -227,6 +227,7 @@ pub:
idx int
name string
fields []Field
// methods
}
pub struct Field {
@ -365,6 +366,13 @@ pub fn (t Variadic) str() string {
return 'variadic_$t.ti.kind.str()'
}
/*
pub fn (s &Struct) has_field(name string) bool {
}
*/
pub const (
void_type = Void{}
voidptr_type = Voidptr{}