compiler: remove unneeded field & manually add parser to v.parsers (#2232)
compiler: remove unneeded field & manually add parser to v.parsers (#2232)pull/2233/head
parent
e14861694c
commit
a62dec2053
|
@ -124,6 +124,7 @@ fn (p mut Parser) comp_time() {
|
|||
pp.is_vweb = true
|
||||
pp.set_current_fn( p.cur_fn ) // give access too all variables in current function
|
||||
pp.parse(.main)
|
||||
pp.v.add_parser(pp)
|
||||
tmpl_fn_body := p.cgen.lines.slice(pos + 2, p.cgen.lines.len).join('\n').clone()
|
||||
end_pos := tmpl_fn_body.last_index('Builder_str( sb )') + 19 // TODO
|
||||
p.cgen.lines = p.cgen.lines.left(pos)
|
||||
|
@ -287,7 +288,3 @@ fn (p mut Parser) gen_struct_str(typ Type) {
|
|||
// This function will get parsee by V after the main pass.
|
||||
p.cgen.fns << 'string ${typ.name}_str();'
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -65,7 +65,6 @@ mut:
|
|||
out_name_c string // name of the temporary C file
|
||||
files []string // all V files that need to be parsed and compiled
|
||||
dir string // directory (or file) being compiled (TODO rename to path?)
|
||||
rdir string // abs dir
|
||||
table &Table // table with types, vars, functions etc
|
||||
cgen &CGen // C code generator
|
||||
pref &Preferences // all the preferences and settings extracted to a struct for reusability
|
||||
|
@ -208,24 +207,24 @@ fn main() {
|
|||
}
|
||||
|
||||
fn (v mut V) add_parser(parser Parser) {
|
||||
for p in v.parsers {
|
||||
if p.id == parser.id {
|
||||
return
|
||||
}
|
||||
}
|
||||
v.parsers << parser
|
||||
}
|
||||
|
||||
fn (v mut V) parse(file string, pass Pass) {
|
||||
// find existing parser or create new one. returns v.parsers index
|
||||
fn (v mut V) parse(file string, pass Pass) int {
|
||||
//println('parse($file, $pass)')
|
||||
for i, p in v.parsers {
|
||||
if os.realpath(p.file_path) == os.realpath(file) {
|
||||
v.parsers[i].parse(pass)
|
||||
return
|
||||
//if v.parsers[i].pref.autofree { v.parsers[i].scanner.text.free() free(v.parsers[i].scanner) }
|
||||
return i
|
||||
}
|
||||
}
|
||||
mut p := v.new_parser_from_file(file)
|
||||
p.parse(pass)
|
||||
//if p.pref.autofree { p.scanner.text.free() free(p.scanner) }
|
||||
v.add_parser(p)
|
||||
return v.parsers.len-1
|
||||
}
|
||||
|
||||
|
||||
|
@ -342,6 +341,7 @@ fn (v mut V) compile() {
|
|||
// free the string builder which held the generated methods
|
||||
v.vgen_buf.free()
|
||||
vgen_parser.parse(.main)
|
||||
// v.parsers.add(vgen_parser)
|
||||
v.log('Done parsing.')
|
||||
// Write everything
|
||||
mut d := strings.new_builder(10000)// Avoid unnecessary allocations
|
||||
|
@ -583,12 +583,14 @@ fn (v mut V) add_v_files_to_compile() {
|
|||
mut p := v.new_parser_from_file(file)
|
||||
p.parse(.imports)
|
||||
//if p.pref.autofree { p.scanner.text.free() free(p.scanner) }
|
||||
v.add_parser(p)
|
||||
}
|
||||
// Parse user imports
|
||||
for file in v.get_user_files() {
|
||||
mut p := v.new_parser_from_file(file)
|
||||
p.parse(.imports)
|
||||
//if p.pref.autofree { p.scanner.text.free() free(p.scanner) }
|
||||
v.add_parser(p)
|
||||
}
|
||||
// Parse lib imports
|
||||
v.parse_lib_imports()
|
||||
|
@ -632,7 +634,7 @@ fn (v &V) get_builtin_files() []string {
|
|||
|
||||
// get user files
|
||||
fn (v &V) get_user_files() []string {
|
||||
mut dir := v.rdir
|
||||
mut dir := v.dir
|
||||
v.log('get_v_files($dir)')
|
||||
// Need to store user files separately, because they have to be added after libs, but we dont know
|
||||
// which libs need to be added yet
|
||||
|
@ -685,12 +687,12 @@ fn (v mut V) parse_lib_imports() {
|
|||
// Add all imports referenced by these libs
|
||||
for file in vfiles {
|
||||
if file in done_imports { continue }
|
||||
v.parse(file, .imports)
|
||||
pid := v.parse(file, .imports)
|
||||
done_imports << file
|
||||
// if p.import_table.module_name != mod {
|
||||
// verror('bad module name: $file was imported as `$mod` but it is defined as module `$p.import_table.module_name`')
|
||||
// }
|
||||
//if p.pref.autofree { p.scanner.text.free() free(p.scanner) }
|
||||
p_mod := v.parsers[pid].import_table.module_name
|
||||
if p_mod != mod {
|
||||
verror('bad module name: $file was imported as `$mod` but it is defined as module `$p_mod`')
|
||||
}
|
||||
}
|
||||
}
|
||||
done_fits << fit.file_path
|
||||
|
@ -909,7 +911,6 @@ fn new_v(args[]string) &V {
|
|||
return &V{
|
||||
os: _os
|
||||
out_name: out_name
|
||||
rdir: rdir
|
||||
dir: dir
|
||||
lang_dir: vroot
|
||||
table: new_table(obfuscate)
|
||||
|
|
|
@ -99,7 +99,6 @@ const (
|
|||
fn (v mut V) new_parser_from_string(text string, id string) Parser {
|
||||
mut p := v.new_parser(new_scanner(text), id)
|
||||
p.scan_tokens()
|
||||
v.add_parser(p)
|
||||
return p
|
||||
}
|
||||
|
||||
|
@ -130,8 +129,6 @@ fn (v mut V) new_parser_from_file(path string) Parser {
|
|||
v.cgen.file = path
|
||||
p.scan_tokens()
|
||||
//p.scanner.debug_tokens()
|
||||
v.add_parser(p)
|
||||
|
||||
return p
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue