checker: prepare for the is_changed check
parent
9fcb8536e8
commit
138d730dfa
|
@ -362,7 +362,7 @@ fn (mut g Game) draw_ui() {
|
|||
if g.state == .gameover {
|
||||
g.gg.draw_rect(0, win_height / 2 - text_size, win_width,
|
||||
5 * text_size, ui_color)
|
||||
g.ft.draw_text(1, win_height / 2 + 0 * text_size, 'Game Over', over_cfg)
|
||||
g.gg.draw_text(1, win_height / 2 + 0 * text_size, 'Game Over', over_cfg)
|
||||
g.ft.draw_text(1, win_height / 2 + 2 * text_size, 'Space to restart', over_cfg)
|
||||
} else if g.state == .paused {
|
||||
g.gg.draw_rect(0, win_height / 2 - text_size, win_width,
|
||||
|
|
|
@ -287,14 +287,15 @@ pub struct Stmt {
|
|||
*/
|
||||
pub struct Var {
|
||||
pub:
|
||||
name string
|
||||
expr Expr
|
||||
is_mut bool
|
||||
is_arg bool // fn args should not be autofreed
|
||||
name string
|
||||
expr Expr
|
||||
is_mut bool
|
||||
is_arg bool // fn args should not be autofreed
|
||||
pub mut:
|
||||
typ table.Type
|
||||
pos token.Position
|
||||
is_used bool
|
||||
typ table.Type
|
||||
pos token.Position
|
||||
is_used bool
|
||||
is_changed bool // to detect mutable vars that are never changed
|
||||
}
|
||||
|
||||
pub struct GlobalDecl {
|
||||
|
|
|
@ -59,8 +59,23 @@ pub fn (mut c Checker) check(ast_file ast.File) {
|
|||
for stmt in ast_file.stmts {
|
||||
c.stmt(stmt)
|
||||
}
|
||||
// Check scopes
|
||||
// TODO
|
||||
/*
|
||||
for i, obj in c.file.global_scope.objects {
|
||||
match obj {
|
||||
ast.Var {
|
||||
if it.is_mut && !it.is_changed {
|
||||
c.warn('`$it.name` is declared as mutable, but it was never changed', it.pos)
|
||||
}
|
||||
}
|
||||
else {}
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
// not used right now
|
||||
pub fn (mut c Checker) check2(ast_file ast.File) []errors.Error {
|
||||
c.file = ast_file
|
||||
for stmt in ast_file.stmts {
|
||||
|
@ -583,6 +598,7 @@ fn (mut c Checker) fail_if_immutable(expr ast.Expr) {
|
|||
c.error('`$it.name` is immutable, declare it with `mut` to make it mutable',
|
||||
it.pos)
|
||||
}
|
||||
v.is_changed = true
|
||||
} else if it.name in c.const_names {
|
||||
c.error('cannot modify constant `$it.name`', it.pos)
|
||||
}
|
||||
|
|
|
@ -12,9 +12,9 @@ import v.util
|
|||
import v.errors
|
||||
import os
|
||||
import runtime
|
||||
//import sync
|
||||
import time
|
||||
|
||||
// import sync
|
||||
pub struct Parser {
|
||||
file_name string // "/home/user/hello.v"
|
||||
file_name_dir string // "/home/user"
|
||||
|
@ -173,7 +173,6 @@ fn (mut q Queue) run() {
|
|||
}
|
||||
}
|
||||
*/
|
||||
|
||||
pub fn parse_files(paths []string, table &table.Table, pref &pref.Preferences, global_scope &ast.Scope) []ast.File {
|
||||
// println('nr_cpus= $nr_cpus')
|
||||
$if macos {
|
||||
|
@ -234,6 +233,7 @@ pub fn (mut p Parser) open_scope() {
|
|||
}
|
||||
|
||||
pub fn (mut p Parser) close_scope() {
|
||||
// TODO move this to checker since is_changed is set there?
|
||||
if !p.pref.is_repl && !p.scanner.is_fmt {
|
||||
for _, obj in p.scope.objects {
|
||||
match obj {
|
||||
|
@ -245,6 +245,12 @@ pub fn (mut p Parser) close_scope() {
|
|||
p.warn_with_pos('unused variable: `$it.name`', it.pos)
|
||||
}
|
||||
}
|
||||
/*
|
||||
if it.is_mut && !it.is_changed {
|
||||
p.warn_with_pos('`$it.name` is declared as mutable, but it was never changed',
|
||||
it.pos)
|
||||
}
|
||||
*/
|
||||
}
|
||||
else {}
|
||||
}
|
||||
|
@ -1486,7 +1492,7 @@ fn (mut p Parser) type_decl() ast.TypeDecl {
|
|||
} else {
|
||||
table.Language.v
|
||||
}
|
||||
p.table.register_type_symbol(table.TypeSymbol{
|
||||
p.table.register_type_symbol({
|
||||
kind: .alias
|
||||
name: p.prepend_mod(name)
|
||||
parent_idx: pid
|
||||
|
|
Loading…
Reference in New Issue