mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
compiler: generics - support across modules/files
This commit is contained in:

committed by
Alexander Medvednikov

parent
7c802f31d3
commit
8fbfceed30
@ -71,6 +71,7 @@ pub mut:
|
||||
parsers []Parser // file parsers
|
||||
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
|
||||
}
|
||||
|
||||
@ -289,19 +290,22 @@ pub fn (v mut V) compile() {
|
||||
// new vfmt is not ready yet
|
||||
//}
|
||||
}
|
||||
|
||||
// add parser generated V code (str() methods etc)
|
||||
mut vgen_parser := v.new_parser_from_string(v.vgen_buf.str())
|
||||
// free the string builder which held the generated methods
|
||||
v.vgen_buf.free()
|
||||
vgen_parser.is_vgen = true
|
||||
v.add_parser(vgen_parser)
|
||||
// run vgen / generic parsers
|
||||
for i, _ in v.parsers {
|
||||
if !v.parsers[i].is_vgen { continue }
|
||||
v.parsers[i].parse(.main)
|
||||
}
|
||||
// Generate .vh if we are building a module
|
||||
if v.pref.build_mode == .build_module {
|
||||
generate_vh(v.dir)
|
||||
}
|
||||
|
||||
// parse generated V code (str() methods etc)
|
||||
mut vgen_parser := v.new_parser_from_string(v.vgen_buf.str())
|
||||
// free the string builder which held the generated methods
|
||||
vgen_parser.is_vgen = true
|
||||
v.vgen_buf.free()
|
||||
vgen_parser.parse(.main)
|
||||
// v.parsers.add(vgen_parser)
|
||||
|
||||
// All definitions
|
||||
mut def := strings.new_builder(10000)// Avoid unnecessary allocations
|
||||
$if !js {
|
||||
@ -633,6 +637,13 @@ pub fn (v mut V) add_v_files_to_compile() {
|
||||
// resolve deps and add imports in correct order
|
||||
imported_mods := v.resolve_deps().imports()
|
||||
for mod in imported_mods {
|
||||
// TODO: work out bug and only add when needed in fn.v
|
||||
if !mod in v.gen_parser_idx {
|
||||
mut gp := v.new_parser_from_string('module '+mod.all_after('.')+'\n')
|
||||
gp.is_vgen = true
|
||||
gp.mod = mod
|
||||
v.gen_parser_idx[mod] = v.add_parser(gp)
|
||||
}
|
||||
if mod == 'builtin' || mod == 'main' {
|
||||
// builtin already added
|
||||
// main files will get added last
|
||||
|
Reference in New Issue
Block a user