checker: move more checks from parser
							parent
							
								
									554d87f5b0
								
							
						
					
					
						commit
						19723c927b
					
				| 
						 | 
				
			
			@ -670,8 +670,13 @@ pub fn (c mut Checker) assign_stmt(assign_stmt mut ast.AssignStmt) {
 | 
			
		|||
	c.expected_type = table.none_type	// TODO a hack to make `x := if ... work`
 | 
			
		||||
	// check variablename for beginning with capital letter 'Abc'
 | 
			
		||||
	for ident in assign_stmt.left {
 | 
			
		||||
		if assign_stmt.op == .decl_assign && scanner.contains_capital(ident.name) {
 | 
			
		||||
		is_decl := assign_stmt.op == .decl_assign
 | 
			
		||||
		if is_decl && scanner.contains_capital(ident.name) {
 | 
			
		||||
			c.error('variable names cannot contain uppercase letters, use snake_case instead', ident.pos)
 | 
			
		||||
		} else if is_decl && ident.kind != .blank_ident {
 | 
			
		||||
			if ident.name.starts_with('__') {
 | 
			
		||||
				c.error('variable names cannot start with `__`', ident.pos)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if assign_stmt.left.len > assign_stmt.right.len {
 | 
			
		||||
| 
						 | 
				
			
			@ -998,6 +1003,9 @@ fn (c mut Checker) stmt(node ast.Stmt) {
 | 
			
		|||
			c.in_for_count--
 | 
			
		||||
		}
 | 
			
		||||
		ast.GoStmt {
 | 
			
		||||
			if !is_call_expr(it.call_expr) {
 | 
			
		||||
				c.error('expression in `go` must be a function call', expr_pos(it.call_expr))1
 | 
			
		||||
			}
 | 
			
		||||
			c.expr(it.call_expr)
 | 
			
		||||
		}
 | 
			
		||||
		// ast.HashStmt {}
 | 
			
		||||
| 
						 | 
				
			
			@ -1020,6 +1028,13 @@ fn (c mut Checker) stmt(node ast.Stmt) {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn is_call_expr(expr ast.Expr) bool {
 | 
			
		||||
	return match expr {
 | 
			
		||||
		ast.CallExpr { true }
 | 
			
		||||
		else { false }
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn (c mut Checker) stmts(stmts []ast.Stmt) {
 | 
			
		||||
	c.expected_type = table.void_type
 | 
			
		||||
	for stmt in stmts {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
vlib/v/checker/tests/inout/decl_underscore.v:2:2: error: variable names cannot start with `__`
 | 
			
		||||
    1| fn main() {
 | 
			
		||||
    2|     __abc := 1
 | 
			
		||||
           ~~~~~
 | 
			
		||||
    3| }
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
fn main() {
 | 
			
		||||
	__abc := 1
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
vlib/v/checker/tests/inout/go_expr.v:2:5: error: expression in `go` must be a function call
 | 
			
		||||
    1| fn main() {
 | 
			
		||||
    2|     go 1
 | 
			
		||||
              ^
 | 
			
		||||
    3| }
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
fn main() {
 | 
			
		||||
	go 1
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -242,8 +242,7 @@ fn (p mut Parser) check(expected token.Kind) {
 | 
			
		|||
	// p.next()
 | 
			
		||||
	// }
 | 
			
		||||
	if p.tok.kind != expected {
 | 
			
		||||
		s := 'unexpected `${p.tok.kind.str()}`, expecting `${expected.str()}`'
 | 
			
		||||
		p.error(s)
 | 
			
		||||
		p.error('unexpected `${p.tok.kind.str()}`, expecting `${expected.str()}`')
 | 
			
		||||
	}
 | 
			
		||||
	p.next()
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -420,9 +419,7 @@ pub fn (p mut Parser) stmt() ast.Stmt {
 | 
			
		|||
				ast.CallExpr {
 | 
			
		||||
					// call_expr = it
 | 
			
		||||
				}
 | 
			
		||||
				else {
 | 
			
		||||
					p.error('expression in `go` must be a function call')
 | 
			
		||||
				}
 | 
			
		||||
				else {}
 | 
			
		||||
			}
 | 
			
		||||
			return ast.GoStmt{
 | 
			
		||||
				call_expr: expr
 | 
			
		||||
| 
						 | 
				
			
			@ -1808,9 +1805,6 @@ fn (p mut Parser) assign_stmt() ast.Stmt {
 | 
			
		|||
			p.error('unknown variable `$ident.name`')
 | 
			
		||||
		}
 | 
			
		||||
		if is_decl && ident.kind != .blank_ident {
 | 
			
		||||
			if ident.name.starts_with('__') {
 | 
			
		||||
				p.error('variable names cannot start with `__`')
 | 
			
		||||
			}
 | 
			
		||||
			if p.scope.known_var(ident.name) {
 | 
			
		||||
				p.error('redefinition of `$ident.name`')
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue