| 1 | @[has_globals] |
| 2 | module parser |
| 3 | |
| 4 | import 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. |
| 10 | pub fn (mut p Parser) codegen(code string) { |
| 11 | $if debug_codegen ? { |
| 12 | eprintln('parser.codegen: ${code}') |
| 13 | } |
| 14 | p.codegen_text += code |
| 15 | } |
| 16 | |
| 17 | fn (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 | |
| 27 | fn 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. |
| 36 | pub fn append_codegen_files(mut files []&ast.File) { |
| 37 | handle_codegen_for_multiple_files(mut files) |
| 38 | } |
| 39 | |