diff --git a/vlib/v/fmt/tests/symbol_registration_keep.vv b/vlib/v/fmt/tests/symbol_registration_keep.vv new file mode 100644 index 0000000000..66b201d78e --- /dev/null +++ b/vlib/v/fmt/tests/symbol_registration_keep.vv @@ -0,0 +1,40 @@ +module analyzer + +import os + +const ( + mut_struct_keyword = 'mut:' + pub_struct_keyword = 'pub:' + pub_mut_struct_keyword = 'pub mut:' + global_struct_keyword = '__global:' +) + +struct SymbolRegistration { +mut: + store &Store = &Store(0) + cursor TreeCursor + module_name string + src_text []byte + // skips the local scopes and registers only + // the top-level ones regardless of its + // visibility + is_import bool + is_script bool + first_var_decl_pos C.TSRange +} + +fn (mut sr SymbolRegistration) struct_field_decl(field_access SymbolAccess, field_decl_node C.TSNode) &Symbol { + field_type_node := field_decl_node.child_by_field_name('type') + field_name_node := field_decl_node.child_by_field_name('name') + field_typ := sr.store.find_symbol_by_type_node(field_type_node, sr.src_text) or { void_type } + return &Symbol{ + name: field_name_node.get_text(sr.src_text) + kind: .field + range: field_name_node.range() + access: field_access + return_type: field_typ + is_top_level: true + file_path: sr.store.cur_file_path + file_version: sr.store.cur_version + } +} diff --git a/vlib/v/parser/expr.v b/vlib/v/parser/expr.v index 914fe956f9..df55eae3b3 100644 --- a/vlib/v/parser/expr.v +++ b/vlib/v/parser/expr.v @@ -492,6 +492,8 @@ fn (mut p Parser) infix_expr(left ast.Expr) ast.Expr { // allow `x := <-ch or {...}` to handle closed channel if op == .arrow { if p.tok.kind == .key_orelse { + was_inside_or_expr := p.inside_or_expr + p.inside_or_expr = true p.next() p.open_scope() p.scope.register(ast.Var{ @@ -505,6 +507,7 @@ fn (mut p Parser) infix_expr(left ast.Expr) ast.Expr { or_stmts = p.parse_block_no_scope(false) or_pos = or_pos.extend(p.prev_tok.position()) p.close_scope() + p.inside_or_expr = was_inside_or_expr } if p.tok.kind == .question { p.next() @@ -595,6 +598,8 @@ fn (mut p Parser) prefix_expr() ast.Expr { // allow `x := <-ch or {...}` to handle closed channel if op == .arrow { if p.tok.kind == .key_orelse { + was_inside_or_expr := p.inside_or_expr + p.inside_or_expr = true p.next() p.open_scope() p.scope.register(ast.Var{ @@ -608,6 +613,7 @@ fn (mut p Parser) prefix_expr() ast.Expr { or_stmts = p.parse_block_no_scope(false) or_pos = or_pos.extend(p.prev_tok.position()) p.close_scope() + p.inside_or_expr = was_inside_or_expr } if p.tok.kind == .question { p.next() diff --git a/vlib/v/parser/parser.v b/vlib/v/parser/parser.v index 6d4ef106a1..bfdcd0d006 100644 --- a/vlib/v/parser/parser.v +++ b/vlib/v/parser/parser.v @@ -2338,6 +2338,7 @@ fn (mut p Parser) index_expr(left ast.Expr) ast.IndexExpr { // a[i] or { ... } if p.tok.kind == .key_orelse { was_inside_or_expr := p.inside_or_expr + p.inside_or_expr = true or_pos = p.tok.position() p.next() p.open_scope() @@ -2442,6 +2443,8 @@ fn (mut p Parser) dot_expr(left ast.Expr) ast.Expr { mut or_kind := ast.OrKind.absent mut or_pos := p.tok.position() if p.tok.kind == .key_orelse { + was_inside_or_expr := p.inside_or_expr + p.inside_or_expr = true p.next() p.open_scope() p.scope.register(ast.Var{ @@ -2455,6 +2458,7 @@ fn (mut p Parser) dot_expr(left ast.Expr) ast.Expr { or_stmts = p.parse_block_no_scope(false) or_pos = or_pos.extend(p.prev_tok.position()) p.close_scope() + p.inside_or_expr = was_inside_or_expr } // `foo()?` if p.tok.kind == .question {