parser: move flag logic to checker (#6239)

pull/6245/head
spaceface777 2020-08-28 08:24:04 +02:00 committed by GitHub
parent 5526954fdc
commit d663f57d43
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 60 additions and 57 deletions

View File

@ -615,8 +615,10 @@ pub:
// #include etc
pub struct HashStmt {
pub:
val string
mod string
pos token.Position
pub mut:
val string
}
/*

View File

@ -2171,7 +2171,9 @@ fn (mut c Checker) stmt(node ast.Stmt) {
}
ast.GotoLabel {}
ast.GotoStmt {}
ast.HashStmt {}
ast.HashStmt {
c.hash_stmt(node)
}
ast.Import {
c.import_stmt(node)
}
@ -2200,6 +2202,47 @@ fn (mut c Checker) stmt(node ast.Stmt) {
}
}
fn (mut c Checker) hash_stmt(mut node ast.HashStmt) {
if c.pref.backend == .js {
if !c.file.path.ends_with('.js.v') {
c.error('Hash statements are only allowed in backend specific files such "x.js.v"',
node.pos)
}
if c.mod == 'main' {
c.error('Hash statements are not allowed in the main module. Please place them in a separate module.',
node.pos)
}
} else if node.val.starts_with('include') {
mut flag := node.val[8..]
if flag.contains('@VROOT') {
vroot := util.resolve_vroot(flag, c.file.path) or {
c.error(err, node.pos)
return
}
node.val = 'include $vroot'
}
} else if node.val.starts_with('flag') {
// #flag linux -lm
mut flag := node.val[5..]
// expand `@VROOT` to its absolute path
if flag.contains('@VROOT') {
flag = util.resolve_vroot(flag, c.file.path) or {
c.error(err, node.pos)
return
}
}
for deprecated in ['@VMOD', '@VMODULE', '@VPATH', '@VLIB_PATH'] {
if flag.contains(deprecated) {
c.error('$deprecated had been deprecated, use @VROOT instead.', node.pos)
}
}
// println('adding flag "$flag"')
c.table.parse_cflag(flag, c.mod, c.pref.compile_defines_all) or {
c.error(err, node.pos)
}
}
}
fn (mut c Checker) import_stmt(imp ast.Import) {
for sym in imp.syms {
name := '$imp.mod\.$sym.name'

View File

@ -6,7 +6,6 @@ module parser
import os
import v.ast
import v.pref
import v.vmod
import v.table
import vweb.tmpl
@ -17,67 +16,14 @@ const (
supported_ccompilers = ['tinyc', 'clang', 'mingw', 'msvc', 'gcc']
)
fn (mut p Parser) resolve_vroot(flag string) string {
mut mcache := vmod.get_cache()
vmod_file_location := mcache.get_by_folder(p.file_name_dir)
if vmod_file_location.vmod_file.len == 0 {
// There was no actual v.mod file found.
p.error('To use @VROOT, you need' + ' to have a "v.mod" file in $p.file_name_dir,' + ' or in one of its parent folders.')
}
vmod_path := vmod_file_location.vmod_folder
if p.pref.is_fmt {
return flag
}
return flag.replace('@VROOT', os.real_path(vmod_path))
}
// // #include, #flag, #v
fn (mut p Parser) hash() ast.HashStmt {
mut val := p.tok.lit
p.next()
if p.pref.backend == .js {
if !p.file_name.ends_with('.js.v') {
p.error('Hash statements are only allowed in backend specific files such "x.js.v"')
}
if p.mod == 'main' {
p.error('Hash statements are not allowed in the main module. Please place them in a separate module.')
}
}
if val.starts_with('include') {
mut flag := val[8..]
if flag.contains('@VROOT') {
vroot := p.resolve_vroot(flag)
val = 'include $vroot'
}
}
if val.starts_with('flag') {
// #flag linux -lm
mut flag := val[5..]
// expand `@VROOT` to its absolute path
if flag.contains('@VROOT') {
flag = p.resolve_vroot(flag)
}
for deprecated in ['@VMOD', '@VMODULE', '@VPATH', '@VLIB_PATH'] {
if flag.contains(deprecated) {
p.error('$deprecated had been deprecated, use @VROOT instead.')
}
}
// println('adding flag "$flag"')
p.table.parse_cflag(flag, p.mod, p.pref.compile_defines_all) or {
p.error(err)
}
/*
words := val.split(' ')
if words.len > 1 && words[1] in supported_platforms {
if p.pref.os == .mac && words[1] == 'darwin' {
p.pref.cflags += val.after('darwin')
}
}
*/
}
return ast.HashStmt{
val: val
mod: p.mod
pos: p.prev_tok.position()
}
}

View File

@ -5,6 +5,7 @@ module util
import os
import v.pref
import v.vmod
pub const (
v_version = '0.1.29'
@ -112,6 +113,17 @@ pub fn set_vroot_folder(vroot_path string) {
os.setenv('VEXE', os.real_path(os.join_path(vroot_path, vname)), true)
}
pub fn resolve_vroot(str, dir string) ?string {
mut mcache := vmod.get_cache()
vmod_file_location := mcache.get_by_folder(dir)
if vmod_file_location.vmod_file.len == 0 {
// There was no actual v.mod file found.
return error('To use @VROOT, you need to have a "v.mod" file in $dir, or in one of its parent folders.')
}
vmod_path := vmod_file_location.vmod_folder
return str.replace('@VROOT', os.real_path(vmod_path))
}
pub fn launch_tool(is_verbose bool, tool_name string, args []string) {
vexe := pref.vexe_path()
vroot := os.dir(vexe)