v.parser: forbid unsupported language functions/types in specific backends (#12655)
parent
75830f1fe3
commit
50d988ebc7
|
@ -207,6 +207,7 @@ fn (mut p Parser) fn_decl() ast.FnDecl {
|
|||
p.open_scope()
|
||||
// C. || JS.
|
||||
mut language := ast.Language.v
|
||||
language_tok_pos := p.tok.position()
|
||||
if p.tok.kind == .name && p.tok.lit == 'C' {
|
||||
is_unsafe = !is_trusted
|
||||
language = .c
|
||||
|
@ -224,12 +225,12 @@ fn (mut p Parser) fn_decl() ast.FnDecl {
|
|||
}
|
||||
if is_keep_alive && language != .c {
|
||||
p.error_with_pos('attribute [keep_args_alive] is only supported for C functions',
|
||||
p.tok.position())
|
||||
language_tok_pos)
|
||||
}
|
||||
if language != .v {
|
||||
p.next()
|
||||
p.check(.dot)
|
||||
p.check_for_impure_v(language, p.tok.position())
|
||||
p.check_for_impure_v(language, language_tok_pos)
|
||||
}
|
||||
// Receiver?
|
||||
mut rec := ReceiverParsingInfo{
|
||||
|
|
|
@ -1627,24 +1627,46 @@ fn (mut p Parser) parse_attr() ast.Attr {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn (mut p Parser) language_not_allowed_error(language ast.Language, pos token.Position) {
|
||||
upcase_language := language.str().to_upper()
|
||||
p.error_with_pos('$upcase_language code is not allowed in .${p.file_backend_mode}.v files, please move it to a .${language}.v file',
|
||||
pos)
|
||||
}
|
||||
|
||||
pub fn (mut p Parser) language_not_allowed_warning(language ast.Language, pos token.Position) {
|
||||
upcase_language := language.str().to_upper()
|
||||
p.warn_with_pos('$upcase_language code will not be allowed in pure .v files, please move it to a .${language}.v file instead',
|
||||
pos)
|
||||
}
|
||||
|
||||
pub fn (mut p Parser) check_for_impure_v(language ast.Language, pos token.Position) {
|
||||
if language == .v {
|
||||
// pure V code is always allowed everywhere
|
||||
return
|
||||
} else {
|
||||
match p.file_backend_mode {
|
||||
.c {
|
||||
if language != .c {
|
||||
p.language_not_allowed_error(language, pos)
|
||||
return
|
||||
}
|
||||
}
|
||||
.js {
|
||||
if language != .js {
|
||||
p.language_not_allowed_error(language, pos)
|
||||
return
|
||||
}
|
||||
}
|
||||
else {}
|
||||
}
|
||||
}
|
||||
if !p.pref.warn_impure_v {
|
||||
// the stricter mode is not ON yet => allow everything for now
|
||||
return
|
||||
}
|
||||
if p.file_backend_mode != language {
|
||||
upcase_language := language.str().to_upper()
|
||||
if p.file_backend_mode == .v {
|
||||
p.warn_with_pos('$upcase_language code will not be allowed in pure .v files, please move it to a .${language}.v file instead',
|
||||
pos)
|
||||
return
|
||||
} else {
|
||||
p.warn_with_pos('$upcase_language code is not allowed in .${p.file_backend_mode}.v files, please move it to a .${language}.v file',
|
||||
pos)
|
||||
p.language_not_allowed_warning(language, pos)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
vlib/v/parser/tests/forbidden_language_support_c.c.vv:1:4: error: JS code is not allowed in .c.v files, please move it to a .js.v file
|
||||
1 | fn JS.a() int
|
||||
| ~~
|
|
@ -0,0 +1 @@
|
|||
fn JS.a() int
|
|
@ -0,0 +1,3 @@
|
|||
vlib/v/parser/tests/forbidden_language_support_js.js.vv:1:4: error: C code is not allowed in .js.v files, please move it to a .c.v file
|
||||
1 | fn C.a() int
|
||||
| ^
|
|
@ -0,0 +1 @@
|
|||
fn C.a() int
|
|
@ -0,0 +1,3 @@
|
|||
v\vlib\v\tests\inout\forbidden_language_support_js.js.vv:1:4: error: C code is not allowed in .js.v files, please move it to a .c.v file
|
||||
1 | fn C.a() int
|
||||
|
|
Loading…
Reference in New Issue