mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
parser: update p.inside_or_expr consistently (fix v fmt -w vls/analyzer/symbol_registration.v
)
This commit is contained in:
parent
6aca360507
commit
f2cda1a529
40
vlib/v/fmt/tests/symbol_registration_keep.vv
Normal file
40
vlib/v/fmt/tests/symbol_registration_keep.vv
Normal file
@ -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
|
||||
}
|
||||
}
|
@ -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()
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user