ast,parser,cgen: add a new ast.FnDecl field is_c_extern, set it during parsing, to be available in markused and checker too

This commit is contained in:
Delyan Angelov 2024-10-13 16:10:22 +03:00
parent c4aaa2ef4d
commit b1142548b9
No known key found for this signature in database
GPG key ID: 66886C0F12D595ED
4 changed files with 19 additions and 1 deletions

View file

@ -546,9 +546,12 @@ fn (t Tree) fn_decl(node ast.FnDecl) &Node {
mut obj := new_object()
obj.add_terse('ast_type', t.string_node('FnDecl'))
obj.add_terse('name', t.string_node(node.name))
obj.add_terse('short_name', t.string_node(node.short_name))
obj.add_terse('mod', t.string_node(node.mod))
obj.add_terse('is_deprecated', t.bool_node(node.is_deprecated))
obj.add_terse('is_pub', t.bool_node(node.is_pub))
obj.add_terse('is_c_variadic', t.bool_node(node.is_c_variadic))
obj.add_terse('is_c_extern', t.bool_node(node.is_c_extern))
obj.add_terse('is_variadic', t.bool_node(node.is_variadic))
obj.add('is_anon', t.bool_node(node.is_anon))
obj.add_terse('is_noreturn', t.bool_node(node.is_noreturn))
@ -559,17 +562,23 @@ fn (t Tree) fn_decl(node ast.FnDecl) &Node {
obj.add_terse('is_exported', t.bool_node(node.is_exported))
obj.add('is_keep_alive', t.bool_node(node.is_keep_alive))
obj.add_terse('is_unsafe', t.bool_node(node.is_unsafe))
obj.add_terse('is_markused', t.bool_node(node.is_markused))
obj.add_terse('is_file_translated', t.bool_node(node.is_file_translated))
obj.add_terse('receiver', t.struct_field(node.receiver))
obj.add('receiver_pos', t.pos(node.receiver_pos))
obj.add_terse('is_method', t.bool_node(node.is_method))
obj.add_terse('is_static_type_method', t.bool_node(node.is_static_type_method))
obj.add('method_type_pos', t.pos(node.method_type_pos))
obj.add('method_idx', t.number_node(node.method_idx))
obj.add_terse('rec_mut', t.bool_node(node.rec_mut))
obj.add_terse('has_prev_newline', t.bool_node(node.has_prev_newline))
obj.add_terse('has_break_line', t.bool_node(node.has_break_line))
obj.add('rec_share', t.enum_node(node.rec_share))
obj.add_terse('language', t.enum_node(node.language))
obj.add('file_mode', t.enum_node(node.file_mode))
obj.add('no_body', t.bool_node(node.no_body))
obj.add('is_builtin', t.bool_node(node.is_builtin))
obj.add('file', t.string_node(node.file))
obj.add('is_direct_arr', t.bool_node(node.is_direct_arr))
obj.add('ctdefine_idx', t.number_node(node.ctdefine_idx))
obj.add('pos', t.pos(node.pos))

View file

@ -560,6 +560,7 @@ pub:
is_deprecated bool
is_pub bool
is_c_variadic bool
is_c_extern bool
is_variadic bool
is_anon bool
is_noreturn bool // true, when @[noreturn] is used on a fn

View file

@ -10,6 +10,9 @@ import v.util
const c_fn_name_escape_seq = ['[', '_T_', ']', '']
fn (mut g Gen) is_used_by_main(node ast.FnDecl) bool {
if node.is_c_extern {
return true
}
mut is_used_by_main := true
if g.pref.skip_unused {
fkey := node.fkey()
@ -71,7 +74,7 @@ fn (mut g Gen) fn_decl(node ast.FnDecl) {
defer {
g.inside_c_extern = old_inside_c_extern
}
if node.language == .c && node.attrs.contains('c_extern') {
if node.language == .c && node.is_c_extern {
g.inside_c_extern = true
}

View file

@ -196,6 +196,7 @@ fn (mut p Parser) fn_decl() ast.FnDecl {
mut is_noreturn := false
mut is_ctor_new := false
mut is_c2v_variadic := false
mut is_c_extern := false
mut is_markused := false
mut is_expand_simple_interpolation := false
mut comments := []ast.Comment{}
@ -237,6 +238,9 @@ fn (mut p Parser) fn_decl() ast.FnDecl {
'markused' {
is_markused = true
}
'c_extern' {
is_c_extern = true
}
'windows_stdcall' {
p.note_with_pos('the tag [windows_stdcall] has been deprecated, it will be an error after 2022-06-01, use `[callconv: stdcall]` instead',
p.tok.pos())
@ -662,6 +666,7 @@ run them via `v file.v` instead',
is_pub: is_pub
is_variadic: is_variadic
is_c_variadic: is_c_variadic
is_c_extern: is_c_extern
is_main: is_main
is_test: is_test
is_keep_alive: is_keep_alive