v2 / vlib / v / parser / codegen.v
38 lines · 32 sloc · 1.11 KB · e2e5cf8db56f3562c7baa735061690be936bdf3e
Raw
1@[has_globals]
2module parser
3
4import v.ast
5
6__global codegen_files = unsafe { []&ast.File{} }
7
8// codegen allows you to generate V code, so that it can be parsed,
9// checked, markused, cgen-ed etc further, just like user's V code.
10pub fn (mut p Parser) codegen(code string) {
11 $if debug_codegen ? {
12 eprintln('parser.codegen: ${code}')
13 }
14 p.codegen_text += code
15}
16
17fn (mut p Parser) handle_codegen_for_file() {
18 // vdoc parses in fmt mode for looser syntax handling, but it still needs
19 // parser-generated enum helpers to appear in the documented AST.
20 if (p.pref.is_fmt && !p.pref.is_vdoc) || p.codegen_text == '' {
21 return
22 }
23 ptext := 'module ' + p.mod.all_after_last('.') + '\n' + p.codegen_text
24 codegen_files << parse_text(ptext, p.file_path, mut p.table, p.scanner.comments_mode, p.pref)
25}
26
27fn handle_codegen_for_multiple_files(mut files []&ast.File) {
28 if codegen_files.len == 0 {
29 return
30 }
31 files << codegen_files
32 codegen_files.clear()
33}
34
35// append_codegen_files appends parser-generated files to a parsed file list.
36pub fn append_codegen_files(mut files []&ast.File) {
37 handle_codegen_for_multiple_files(mut files)
38}
39