mirror of
https://github.com/vlang/v.git
synced 2025-09-09 15:27:05 -04:00
parser: cleanup and simplify language parsing (#20185)
This commit is contained in:
parent
0a029d4532
commit
226e075e7a
@ -249,17 +249,8 @@ fn (mut p Parser) fn_decl() ast.FnDecl {
|
||||
p.check(.key_fn)
|
||||
comments << p.eat_comments()
|
||||
p.open_scope()
|
||||
// C. || JS.
|
||||
mut language := ast.Language.v
|
||||
language_tok_pos := p.tok.pos()
|
||||
if p.tok.kind == .name && p.tok.lit == 'C' {
|
||||
is_unsafe = !is_trusted
|
||||
language = .c
|
||||
} else if p.tok.kind == .name && p.tok.lit == 'JS' {
|
||||
language = .js
|
||||
} else if p.tok.kind == .name && p.tok.lit == 'WASM' {
|
||||
language = .wasm
|
||||
}
|
||||
mut language := p.parse_language()
|
||||
p.fn_language = language
|
||||
if language != .v {
|
||||
for fna in p.attrs {
|
||||
@ -274,9 +265,10 @@ fn (mut p Parser) fn_decl() ast.FnDecl {
|
||||
language_tok_pos)
|
||||
}
|
||||
if language != .v {
|
||||
p.next()
|
||||
p.check(.dot)
|
||||
p.check_for_impure_v(language, language_tok_pos)
|
||||
if language == .c {
|
||||
is_unsafe = !is_trusted
|
||||
}
|
||||
}
|
||||
// Receiver?
|
||||
mut rec := ReceiverParsingInfo{
|
||||
@ -521,14 +513,11 @@ run them via `v file.v` instead',
|
||||
language: language
|
||||
})
|
||||
} else {
|
||||
if language == .c {
|
||||
name = 'C.${name}'
|
||||
} else if language == .js {
|
||||
name = 'JS.${name}'
|
||||
} else if language == .wasm {
|
||||
name = 'WASM.${name}'
|
||||
} else {
|
||||
name = p.prepend_mod(name)
|
||||
name = match language {
|
||||
.c { 'C.${name}' }
|
||||
.js { 'JS.${name}' }
|
||||
.wasm { 'WASM.${name}' }
|
||||
else { p.prepend_mod(name) }
|
||||
}
|
||||
if !p.pref.translated && language == .v {
|
||||
if existing := p.table.fns[name] {
|
||||
|
@ -327,14 +327,11 @@ fn (mut p Parser) parse_type_with_mut(is_mut bool) ast.Type {
|
||||
|
||||
// Parses any language indicators on a type.
|
||||
fn (mut p Parser) parse_language() ast.Language {
|
||||
language := if p.tok.lit == 'C' {
|
||||
ast.Language.c
|
||||
} else if p.tok.lit == 'JS' {
|
||||
ast.Language.js
|
||||
} else if p.tok.lit == 'WASM' {
|
||||
ast.Language.wasm
|
||||
} else {
|
||||
ast.Language.v
|
||||
language := match p.tok.lit {
|
||||
'C' { ast.Language.c }
|
||||
'JS' { ast.Language.js }
|
||||
'WASM' { ast.Language.wasm }
|
||||
else { ast.Language.v }
|
||||
}
|
||||
if language != .v {
|
||||
p.next()
|
||||
|
@ -2534,15 +2534,13 @@ fn (mut p Parser) name_expr() ast.Expr {
|
||||
pos: type_pos
|
||||
}
|
||||
}
|
||||
mut language := ast.Language.v
|
||||
if p.tok.lit == 'C' {
|
||||
language = ast.Language.c
|
||||
p.check_for_impure_v(language, p.tok.pos())
|
||||
} else if p.tok.lit == 'JS' {
|
||||
language = ast.Language.js
|
||||
p.check_for_impure_v(language, p.tok.pos())
|
||||
} else if p.tok.lit == 'WASM' {
|
||||
language = ast.Language.wasm
|
||||
language := match p.tok.lit {
|
||||
'C' { ast.Language.c }
|
||||
'JS' { ast.Language.js }
|
||||
'WASM' { ast.Language.wasm }
|
||||
else { ast.Language.v }
|
||||
}
|
||||
if language != .v {
|
||||
p.check_for_impure_v(language, p.tok.pos())
|
||||
}
|
||||
is_option := p.tok.kind == .question
|
||||
|
@ -25,19 +25,7 @@ fn (mut p Parser) struct_decl(is_anon bool) ast.StructDecl {
|
||||
} else {
|
||||
p.check(.key_union)
|
||||
}
|
||||
language := if p.tok.lit == 'C' && p.peek_tok.kind == .dot {
|
||||
ast.Language.c
|
||||
} else if p.tok.lit == 'JS' && p.peek_tok.kind == .dot {
|
||||
ast.Language.js
|
||||
} else if p.tok.lit == 'WASM' && p.peek_tok.kind == .dot {
|
||||
ast.Language.wasm
|
||||
} else {
|
||||
ast.Language.v
|
||||
}
|
||||
if language != .v {
|
||||
p.next() // C || JS
|
||||
p.next() // .
|
||||
}
|
||||
language := p.parse_language()
|
||||
name_pos := p.tok.pos()
|
||||
p.check_for_impure_v(language, name_pos)
|
||||
if p.disallow_declarations_in_script_mode() {
|
||||
@ -522,17 +510,7 @@ fn (mut p Parser) interface_decl() ast.InterfaceDecl {
|
||||
p.next()
|
||||
}
|
||||
p.next() // `interface`
|
||||
language := if p.tok.lit == 'C' && p.peek_tok.kind == .dot {
|
||||
ast.Language.c
|
||||
} else if p.tok.lit == 'JS' && p.peek_tok.kind == .dot {
|
||||
ast.Language.js
|
||||
} else {
|
||||
ast.Language.v
|
||||
}
|
||||
if language != .v {
|
||||
p.next() // C || JS | WASM
|
||||
p.next() // .
|
||||
}
|
||||
language := p.parse_language()
|
||||
name_pos := p.tok.pos()
|
||||
p.check_for_impure_v(language, name_pos)
|
||||
if p.disallow_declarations_in_script_mode() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user