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

View File

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

View File

@ -269,6 +269,10 @@ pub fn (p mut Parser) name_expr() (ast.Expr,types.TypeIdent) {
p.next() p.next()
p.check(.dot) p.check(.dot)
} }
else if p.tok.lit in ['strings'] {
p.next()
p.check(.dot)
}
// fn call // fn call
if p.peek_tok.kind == .lpar { if p.peek_tok.kind == .lpar {
x,ti2 := p.call_expr() // TODO `node,typ :=` should work 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) node = p.assign_expr(node)
} }
else if p.tok.kind == .dot { 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 { else if p.tok.kind == .lsbr {
node,ti = p.index_expr(node) 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 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() p.next()
field_name := p.check_name() 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 // Method call
if p.tok.kind == .lpar { if p.tok.kind == .lpar {
p.next() p.next()

View File

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