parser: cleanup and simplify language parsing (#20185)

This commit is contained in:
Turiiya 2023-12-15 15:35:12 +01:00 committed by GitHub
parent 0a029d4532
commit 226e075e7a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 23 additions and 61 deletions

View File

@ -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] {

View File

@ -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()

View File

@ -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

View File

@ -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() {