Skip to content

Commit 9de8488

Browse files
authored
parser: optimise mark_var_as_used calls, by moving it to an ast.Scope method (#22842)
1 parent fe5609d commit 9de8488

4 files changed

Lines changed: 19 additions & 29 deletions

File tree

vlib/v/ast/scope.v

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,17 @@ pub fn (sc &Scope) show(depth int, max_depth int) string {
262262
return out
263263
}
264264

265+
pub fn (mut sc Scope) mark_var_as_used(varname string) bool {
266+
mut obj := sc.find(varname) or { return false }
267+
if mut obj is Var {
268+
obj.is_used = true
269+
return true
270+
} else if obj is GlobalField {
271+
return true
272+
}
273+
return false
274+
}
275+
265276
pub fn (sc &Scope) str() string {
266277
return sc.show(0, 0)
267278
}

vlib/v/parser/comptime.v

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ fn (mut p Parser) comptime_for() ast.ComptimeFor {
352352
typ = p.parse_any_type(lang, false, true, false)
353353
} else {
354354
expr = p.ident(lang)
355-
p.mark_var_as_used((expr as ast.Ident).name)
355+
p.scope.mark_var_as_used((expr as ast.Ident).name)
356356
}
357357
typ_pos = typ_pos.extend(p.prev_tok.pos())
358358
p.check(.dot)
@@ -470,7 +470,7 @@ fn (mut p Parser) comptime_selector(left ast.Expr) ast.Expr {
470470
if p.peek_tok.kind == .lpar {
471471
method_pos := p.tok.pos()
472472
method_name := p.check_name()
473-
p.mark_var_as_used(method_name)
473+
p.scope.mark_var_as_used(method_name)
474474
// `app.$action()` (`action` is a string)
475475
p.check(.lpar)
476476
args := p.call_args()

vlib/v/parser/expr.v

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ fn (mut p Parser) check_expr(precedence int) !ast.Expr {
7373
ident := p.ident(.v)
7474
node = ident
7575
if p.peek_tok.kind != .assign && (p.inside_if_cond || p.inside_match) {
76-
p.mark_var_as_used(ident.name)
76+
p.scope.mark_var_as_used(ident.name)
7777
}
7878
p.add_defer_var(ident)
7979
p.is_stmt_ident = is_stmt_ident
@@ -356,7 +356,7 @@ fn (mut p Parser) check_expr(precedence int) !ast.Expr {
356356
} else {
357357
p.check(.lpar)
358358
pos := p.tok.pos()
359-
mut is_known_var := p.mark_var_as_used(p.tok.lit)
359+
mut is_known_var := p.scope.mark_var_as_used(p.tok.lit)
360360
|| p.table.global_scope.known_const(p.mod + '.' + p.tok.lit)
361361
//|| p.table.known_fn(p.mod + '.' + p.tok.lit)
362362
// assume `mod.` prefix leads to a type
@@ -524,7 +524,7 @@ fn (mut p Parser) check_expr(precedence int) !ast.Expr {
524524
// variable name: type
525525
ident := p.ident(.v)
526526
node = ident
527-
p.mark_var_as_used(ident.name)
527+
p.scope.mark_var_as_used(ident.name)
528528
p.add_defer_var(ident)
529529
p.is_stmt_ident = is_stmt_ident
530530
} else if p.tok.kind != .eof && !(p.tok.kind == .rsbr && p.inside_asm) {

vlib/v/parser/parser.v

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1058,7 +1058,7 @@ fn (mut p Parser) stmt(is_top_level bool) ast.Stmt {
10581058
} else if p.peek_tok.kind == .name {
10591059
return p.unexpected(got: 'name `${p.tok.lit}`')
10601060
} else if !p.inside_if_expr && !p.inside_match_body && !p.inside_or_expr
1061-
&& p.peek_tok.kind in [.rcbr, .eof] && !p.mark_var_as_used(p.tok.lit) {
1061+
&& p.peek_tok.kind in [.rcbr, .eof] && !p.scope.mark_var_as_used(p.tok.lit) {
10621062
return p.error_with_pos('`${p.tok.lit}` evaluated but not used', p.tok.pos())
10631063
}
10641064
return p.parse_multi_expr(is_top_level)
@@ -2626,7 +2626,7 @@ fn (mut p Parser) name_expr() ast.Expr {
26262626
// get type position before moving to next
26272627
is_known_var := p.scope.known_var(p.tok.lit)
26282628
if is_known_var {
2629-
p.mark_var_as_used(p.tok.lit)
2629+
p.scope.mark_var_as_used(p.tok.lit)
26302630
return p.ident(.v)
26312631
} else {
26322632
type_pos := p.tok.pos()
@@ -2748,7 +2748,7 @@ fn (mut p Parser) name_expr() ast.Expr {
27482748
known_var := if p.peek_tok.kind.is_assign() {
27492749
p.scope.known_var(p.tok.lit)
27502750
} else {
2751-
p.mark_var_as_used(p.tok.lit)
2751+
p.scope.mark_var_as_used(p.tok.lit)
27522752
}
27532753
// Handle modules
27542754
mut is_mod_cast := false
@@ -4584,27 +4584,6 @@ fn (mut p Parser) rewind_scanner_to_current_token_in_new_mode() {
45844584
}
45854585
}
45864586

4587-
// returns true if `varname` is known
4588-
fn (mut p Parser) mark_var_as_used(varname string) bool {
4589-
if mut obj := p.scope.find(varname) {
4590-
match mut obj {
4591-
ast.Var {
4592-
obj.is_used = true
4593-
return true
4594-
}
4595-
ast.GlobalField {
4596-
// obj.is_used = true
4597-
return true
4598-
}
4599-
// ast.ConstField {
4600-
// return true
4601-
//}
4602-
else {}
4603-
}
4604-
}
4605-
return false
4606-
}
4607-
46084587
fn (mut p Parser) unsafe_stmt() ast.Stmt {
46094588
mut pos := p.tok.pos()
46104589
p.next()

0 commit comments

Comments
 (0)