Skip to content

Commit b114254

Browse files
committed
ast,parser,cgen: add a new ast.FnDecl field is_c_extern, set it during parsing, to be available in markused and checker too
1 parent c4aaa2e commit b114254

File tree

4 files changed

+19
-1
lines changed

4 files changed

+19
-1
lines changed

cmd/tools/vast/vast.v

+9
Original file line numberDiff line numberDiff line change
@@ -546,9 +546,12 @@ fn (t Tree) fn_decl(node ast.FnDecl) &Node {
546546
mut obj := new_object()
547547
obj.add_terse('ast_type', t.string_node('FnDecl'))
548548
obj.add_terse('name', t.string_node(node.name))
549+
obj.add_terse('short_name', t.string_node(node.short_name))
549550
obj.add_terse('mod', t.string_node(node.mod))
550551
obj.add_terse('is_deprecated', t.bool_node(node.is_deprecated))
551552
obj.add_terse('is_pub', t.bool_node(node.is_pub))
553+
obj.add_terse('is_c_variadic', t.bool_node(node.is_c_variadic))
554+
obj.add_terse('is_c_extern', t.bool_node(node.is_c_extern))
552555
obj.add_terse('is_variadic', t.bool_node(node.is_variadic))
553556
obj.add('is_anon', t.bool_node(node.is_anon))
554557
obj.add_terse('is_noreturn', t.bool_node(node.is_noreturn))
@@ -559,17 +562,23 @@ fn (t Tree) fn_decl(node ast.FnDecl) &Node {
559562
obj.add_terse('is_exported', t.bool_node(node.is_exported))
560563
obj.add('is_keep_alive', t.bool_node(node.is_keep_alive))
561564
obj.add_terse('is_unsafe', t.bool_node(node.is_unsafe))
565+
obj.add_terse('is_markused', t.bool_node(node.is_markused))
566+
obj.add_terse('is_file_translated', t.bool_node(node.is_file_translated))
562567
obj.add_terse('receiver', t.struct_field(node.receiver))
563568
obj.add('receiver_pos', t.pos(node.receiver_pos))
564569
obj.add_terse('is_method', t.bool_node(node.is_method))
570+
obj.add_terse('is_static_type_method', t.bool_node(node.is_static_type_method))
565571
obj.add('method_type_pos', t.pos(node.method_type_pos))
566572
obj.add('method_idx', t.number_node(node.method_idx))
567573
obj.add_terse('rec_mut', t.bool_node(node.rec_mut))
574+
obj.add_terse('has_prev_newline', t.bool_node(node.has_prev_newline))
575+
obj.add_terse('has_break_line', t.bool_node(node.has_break_line))
568576
obj.add('rec_share', t.enum_node(node.rec_share))
569577
obj.add_terse('language', t.enum_node(node.language))
570578
obj.add('file_mode', t.enum_node(node.file_mode))
571579
obj.add('no_body', t.bool_node(node.no_body))
572580
obj.add('is_builtin', t.bool_node(node.is_builtin))
581+
obj.add('file', t.string_node(node.file))
573582
obj.add('is_direct_arr', t.bool_node(node.is_direct_arr))
574583
obj.add('ctdefine_idx', t.number_node(node.ctdefine_idx))
575584
obj.add('pos', t.pos(node.pos))

vlib/v/ast/ast.v

+1
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,7 @@ pub:
560560
is_deprecated bool
561561
is_pub bool
562562
is_c_variadic bool
563+
is_c_extern bool
563564
is_variadic bool
564565
is_anon bool
565566
is_noreturn bool // true, when @[noreturn] is used on a fn

vlib/v/gen/c/fn.v

+4-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ import v.util
1010
const c_fn_name_escape_seq = ['[', '_T_', ']', '']
1111

1212
fn (mut g Gen) is_used_by_main(node ast.FnDecl) bool {
13+
if node.is_c_extern {
14+
return true
15+
}
1316
mut is_used_by_main := true
1417
if g.pref.skip_unused {
1518
fkey := node.fkey()
@@ -71,7 +74,7 @@ fn (mut g Gen) fn_decl(node ast.FnDecl) {
7174
defer {
7275
g.inside_c_extern = old_inside_c_extern
7376
}
74-
if node.language == .c && node.attrs.contains('c_extern') {
77+
if node.language == .c && node.is_c_extern {
7578
g.inside_c_extern = true
7679
}
7780

vlib/v/parser/fn.v

+5
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ fn (mut p Parser) fn_decl() ast.FnDecl {
196196
mut is_noreturn := false
197197
mut is_ctor_new := false
198198
mut is_c2v_variadic := false
199+
mut is_c_extern := false
199200
mut is_markused := false
200201
mut is_expand_simple_interpolation := false
201202
mut comments := []ast.Comment{}
@@ -237,6 +238,9 @@ fn (mut p Parser) fn_decl() ast.FnDecl {
237238
'markused' {
238239
is_markused = true
239240
}
241+
'c_extern' {
242+
is_c_extern = true
243+
}
240244
'windows_stdcall' {
241245
p.note_with_pos('the tag [windows_stdcall] has been deprecated, it will be an error after 2022-06-01, use `[callconv: stdcall]` instead',
242246
p.tok.pos())
@@ -662,6 +666,7 @@ run them via `v file.v` instead',
662666
is_pub: is_pub
663667
is_variadic: is_variadic
664668
is_c_variadic: is_c_variadic
669+
is_c_extern: is_c_extern
665670
is_main: is_main
666671
is_test: is_test
667672
is_keep_alive: is_keep_alive

0 commit comments

Comments
 (0)