parser: do not allow duplicate methods; builder: cleaning up
parent
8d150d427a
commit
b7560fe4bf
|
@ -11,59 +11,6 @@ import (
|
|||
strings
|
||||
)
|
||||
|
||||
/*
|
||||
pub struct V {
|
||||
pub mut:
|
||||
mod_file_cacher &builder.ModFileCacher // used during lookup for v.mod to support @VROOT
|
||||
out_name_c string // name of the temporary C file
|
||||
files []string // all V files that need to be parsed and compiled
|
||||
compiled_dir string // contains os.real_path() of the dir of the final file beeing compiled, or the dir itself when doing `v .`
|
||||
pref &pref.Preferences // all the preferences and settings extracted to a struct for reusability
|
||||
vgen_buf strings.Builder // temporary buffer for generated V code (.str() etc)
|
||||
file_parser_idx map[string]int // map absolute file path to v.parsers index
|
||||
gen_parser_idx map[string]int
|
||||
cached_mods []string
|
||||
module_lookup_paths []string
|
||||
|
||||
v_fmt_all bool // << input set by cmd/tools/vfmt.v
|
||||
v_fmt_file string // << file given by the user from cmd/tools/vfmt.v
|
||||
v_fmt_file_result string // >> file with formatted output generated by vlib/compiler/vfmt.v
|
||||
}
|
||||
|
||||
pub fn new_v(pref &pref.Preferences) &V {
|
||||
rdir := os.real_path(pref.path)
|
||||
|
||||
mut out_name_c := get_vtmp_filename(pref.out_name, '.tmp.c')
|
||||
if pref.is_so {
|
||||
out_name_c = get_vtmp_filename(pref.out_name, '.tmp.so.c')
|
||||
}
|
||||
|
||||
mut vgen_buf := strings.new_builder(1000)
|
||||
vgen_buf.writeln('module vgen\nimport strings')
|
||||
compiled_dir:=if os.is_dir(rdir) { rdir } else { os.dir(rdir) }
|
||||
|
||||
return &V{
|
||||
mod_file_cacher: builder.new_mod_file_cacher()
|
||||
compiled_dir:compiled_dir// if os.is_dir(rdir) { rdir } else { os.dir(rdir) }
|
||||
out_name_c: out_name_c
|
||||
pref: pref
|
||||
vgen_buf: vgen_buf
|
||||
}
|
||||
}
|
||||
*/
|
||||
/*
|
||||
// make v2 from v1
|
||||
fn (v &V) new_v2() builder.Builder {
|
||||
mut b := builder.new_builder(v.pref)
|
||||
b = { b|
|
||||
os: v.pref.os,
|
||||
module_path: pref.default_module_path,
|
||||
compiled_dir: v.compiled_dir,
|
||||
module_search_paths: v.module_lookup_paths
|
||||
}
|
||||
return b
|
||||
}
|
||||
*/
|
||||
fn get_vtmp_folder() string {
|
||||
vtmp := os.join_path(os.temp_dir(), 'v')
|
||||
if !os.is_dir(vtmp) {
|
||||
|
@ -76,8 +23,7 @@ fn get_vtmp_folder() string {
|
|||
|
||||
fn get_vtmp_filename(base_file_name, postfix string) string {
|
||||
vtmp := get_vtmp_folder()
|
||||
return os.real_path(os.join_path(vtmp, os.file_name(os.real_path(base_file_name)) +
|
||||
postfix))
|
||||
return os.real_path(os.join_path(vtmp, os.file_name(os.real_path(base_file_name)) + postfix))
|
||||
}
|
||||
|
||||
pub fn compile(command string, pref &pref.Preferences) {
|
||||
|
@ -109,7 +55,7 @@ pub fn compile(command string, pref &pref.Preferences) {
|
|||
// v.add_v_files_to_compile()
|
||||
// v.files << v.dir
|
||||
// v2 compiler
|
||||
//b.set_module_lookup_paths()
|
||||
// b.set_module_lookup_paths()
|
||||
files << b.get_builtin_files()
|
||||
files << b.get_user_files()
|
||||
b.set_module_lookup_paths()
|
||||
|
@ -117,7 +63,7 @@ pub fn compile(command string, pref &pref.Preferences) {
|
|||
println('all .v files:')
|
||||
println(files)
|
||||
}
|
||||
//b.build_c(files, b.out_name_c) // v.pref.out_name + '.c')
|
||||
// b.build_c(files, b.out_name_c) // v.pref.out_name + '.c')
|
||||
b.build_c(files, pref.out_name + '.c')
|
||||
b.cc()
|
||||
}
|
||||
|
@ -196,9 +142,9 @@ fn (v mut Builder) set_module_lookup_paths() {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn (v &Builder) get_builtin_files() []string {
|
||||
//println('get_builtin_files() lookuppath:')
|
||||
//println(v.pref.lookup_path)
|
||||
pub fn (v Builder) get_builtin_files() []string {
|
||||
// println('get_builtin_files() lookuppath:')
|
||||
// println(v.pref.lookup_path)
|
||||
// Lookup for built-in folder in lookup path.
|
||||
// Assumption: `builtin/` folder implies usable implementation of builtin
|
||||
for location in v.pref.lookup_path {
|
||||
|
@ -219,7 +165,7 @@ Did you forget to add vlib to the path? (Use @vlib for default vlib)')
|
|||
panic('Unreachable code reached.')
|
||||
}
|
||||
|
||||
pub fn (v &Builder) get_user_files() []string {
|
||||
pub fn (v Builder) get_user_files() []string {
|
||||
mut dir := v.pref.path
|
||||
v.log('get_v_files($dir)')
|
||||
// Need to store user files separately, because they have to be added after
|
||||
|
@ -297,4 +243,3 @@ pub fn (v &Builder) get_user_files() []string {
|
|||
}
|
||||
return user_files
|
||||
}
|
||||
|
||||
|
|
|
@ -652,6 +652,12 @@ fn (c mut Checker) stmt(node ast.Stmt) {
|
|||
c.expected_type = table.void_type
|
||||
}
|
||||
ast.FnDecl {
|
||||
//if it.is_method {
|
||||
//sym := c.table.get_type_symbol(it.receiver.typ)
|
||||
//if sym.has_method(it.name) {
|
||||
//c.warn('duplicate method `$it.name`', it.pos)
|
||||
//}
|
||||
//}
|
||||
c.expected_type = table.void_type
|
||||
c.fn_return_type = it.return_type
|
||||
c.stmts(it.stmts)
|
||||
|
|
|
@ -12,7 +12,13 @@ import (
|
|||
pub fn (p mut Parser) call_expr(is_c bool, mod string) ast.CallExpr {
|
||||
tok := p.tok
|
||||
name := p.check_name()
|
||||
fn_name := if is_c { 'C.$name' } else if mod.len > 0 { '${mod}.$name' } else { name }
|
||||
fn_name := if is_c {
|
||||
'C.$name'
|
||||
} else if mod.len > 0 {
|
||||
'${mod}.$name'
|
||||
} else {
|
||||
name
|
||||
}
|
||||
p.check(.lpar)
|
||||
args := p.call_args()
|
||||
mut or_stmts := []ast.Stmt
|
||||
|
@ -33,13 +39,12 @@ pub fn (p mut Parser) call_expr(is_c bool, mod string) ast.CallExpr {
|
|||
node := ast.CallExpr{
|
||||
name: fn_name
|
||||
args: args
|
||||
// tok: tok
|
||||
mod: p.mod
|
||||
pos: tok.position()
|
||||
is_c: is_c
|
||||
or_block: ast.OrExpr{
|
||||
stmts: or_stmts
|
||||
}
|
||||
stmts: or_stmts
|
||||
}
|
||||
}
|
||||
return node
|
||||
}
|
||||
|
@ -111,9 +116,12 @@ fn (p mut Parser) fn_decl() ast.FnDecl {
|
|||
if !is_c && !p.pref.translated && scanner.contains_capital(name) {
|
||||
p.error('function names cannot contain uppercase letters, use snake_case instead')
|
||||
}
|
||||
if is_method && p.table.get_type_symbol(rec_type).has_method(name) {
|
||||
p.warn('duplicate method `$name`')
|
||||
}
|
||||
}
|
||||
if p.tok.kind in [.plus, .minus, .mul, .div, .mod] {
|
||||
name = p.tok.kind.str() // op_to_fn_name()
|
||||
name = p.tok.kind.str() // op_to_fn_name()
|
||||
p.next()
|
||||
}
|
||||
// <T>
|
||||
|
@ -123,7 +131,7 @@ fn (p mut Parser) fn_decl() ast.FnDecl {
|
|||
p.check(.gt)
|
||||
}
|
||||
// Args
|
||||
args2,is_variadic := p.fn_args()
|
||||
args2, is_variadic := p.fn_args()
|
||||
args << args2
|
||||
for arg in args {
|
||||
p.scope.register(arg.name, ast.Var{
|
||||
|
@ -146,12 +154,10 @@ fn (p mut Parser) fn_decl() ast.FnDecl {
|
|||
return_type: return_type
|
||||
is_variadic: is_variadic
|
||||
})
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
if is_c {
|
||||
name = 'C.$name'
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
name = p.prepend_mod(name)
|
||||
}
|
||||
p.table.register_fn(table.Fn{
|
||||
|
@ -178,9 +184,9 @@ fn (p mut Parser) fn_decl() ast.FnDecl {
|
|||
is_pub: is_pub
|
||||
is_variadic: is_variadic
|
||||
receiver: ast.Field{
|
||||
name: rec_name
|
||||
typ: rec_type
|
||||
}
|
||||
name: rec_name
|
||||
typ: rec_type
|
||||
}
|
||||
is_method: is_method
|
||||
rec_mut: rec_mut
|
||||
is_c: is_c
|
||||
|
@ -189,14 +195,15 @@ fn (p mut Parser) fn_decl() ast.FnDecl {
|
|||
}
|
||||
}
|
||||
|
||||
fn (p mut Parser) fn_args() ([]table.Arg,bool) {
|
||||
fn (p mut Parser) fn_args() ([]table.Arg, bool) {
|
||||
p.check(.lpar)
|
||||
mut args := []table.Arg
|
||||
mut is_variadic := false
|
||||
// `int, int, string` (no names, just types)
|
||||
types_only := p.tok.kind in [.amp, .and] || (p.peek_tok.kind == .comma && p.table.known_type(p.tok.lit)) || p.peek_tok.kind == .rpar
|
||||
types_only := p.tok.kind in [.amp, .and] || (p.peek_tok.kind == .comma && p.table.known_type(p.tok.lit)) ||
|
||||
p.peek_tok.kind == .rpar
|
||||
if types_only {
|
||||
//p.warn('types only')
|
||||
// p.warn('types only')
|
||||
mut arg_no := 1
|
||||
for p.tok.kind != .rpar {
|
||||
arg_name := 'arg_$arg_no'
|
||||
|
@ -225,8 +232,7 @@ fn (p mut Parser) fn_args() ([]table.Arg,bool) {
|
|||
}
|
||||
arg_no++
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
for p.tok.kind != .rpar {
|
||||
mut arg_names := [p.check_name()]
|
||||
// `a, b, c int`
|
||||
|
@ -263,9 +269,9 @@ fn (p mut Parser) fn_args() ([]table.Arg,bool) {
|
|||
}
|
||||
}
|
||||
p.check(.rpar)
|
||||
return args,is_variadic
|
||||
return args, is_variadic
|
||||
}
|
||||
|
||||
fn (p &Parser) fileis(s string) bool {
|
||||
fn (p Parser) fileis(s string) bool {
|
||||
return p.file_name.contains(s)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue