assert: fix line position, pretty print float literals and casts
							parent
							
								
									3bad02abdd
								
							
						
					
					
						commit
						ef19aa1de6
					
				|  | @ -626,6 +626,7 @@ pub: | |||
| 	expr      Expr // `buf`
 | ||||
| 	arg       Expr // `n` in `string(buf, n)`
 | ||||
| 	typ       table.Type // `string`
 | ||||
| 	typname   string | ||||
| mut: | ||||
| 	expr_type table.Type // `byteptr`
 | ||||
| 	has_arg   bool | ||||
|  |  | |||
|  | @ -72,7 +72,7 @@ pub fn (x Expr) str() string { | |||
| 			return it.name | ||||
| 		} | ||||
| 		InfixExpr { | ||||
| 			return '(${it.left.str()} $it.op.str() ${it.right.str()})' | ||||
| 			return '${it.left.str()} $it.op.str() ${it.right.str()}' | ||||
| 		} | ||||
| 		PrefixExpr { | ||||
| 			return it.op.str() + it.right.str() | ||||
|  | @ -80,6 +80,9 @@ pub fn (x Expr) str() string { | |||
| 		IntegerLiteral { | ||||
| 			return it.val | ||||
| 		} | ||||
| 		FloatLiteral { | ||||
| 			return it.val | ||||
| 		} | ||||
| 		StringLiteral { | ||||
| 			return '"$it.val"' | ||||
| 		} | ||||
|  | @ -113,6 +116,9 @@ pub fn (x Expr) str() string { | |||
| 		IndexExpr { | ||||
| 			return '${it.left.str()}[${it.index.str()}]' | ||||
| 		} | ||||
| 		CastExpr { | ||||
| 			return '${it.typname}(${it.expr.str()})' | ||||
| 		} | ||||
| 		else { | ||||
| 			return '[unhandled expr type ${typeof(x)}]' | ||||
| 		} | ||||
|  |  | |||
|  | @ -676,7 +676,11 @@ fn (c mut Checker) stmt(node ast.Stmt) { | |||
| 	// c.expected_type = table.void_type
 | ||||
| 	match mut node { | ||||
| 		ast.AssertStmt { | ||||
| 			c.expr(it.expr) | ||||
| 			assert_type := c.expr(it.expr) | ||||
| 			if assert_type != table.bool_type_idx { | ||||
| 				atype_name := c.table.get_type_symbol(assert_type).name | ||||
| 				c.error('assert can be used only with `bool` expressions, but found `${atype_name}` instead', it.pos) | ||||
| 			} | ||||
| 		} | ||||
| 		ast.AssignStmt { | ||||
| 			c.assign_stmt(mut it) | ||||
|  | @ -875,6 +879,7 @@ pub fn (c mut Checker) expr(node ast.Expr) table.Type { | |||
| 			if it.has_arg { | ||||
| 				c.expr(it.arg) | ||||
| 			} | ||||
| 			it.typname = c.table.get_type_symbol(it.typ).name | ||||
| 			return it.typ | ||||
| 		} | ||||
| 		ast.CallExpr { | ||||
|  |  | |||
|  | @ -611,11 +611,10 @@ fn (g mut Gen) gen_assert_stmt(a ast.AssertStmt) { | |||
| 	if g.is_test { | ||||
| 		g.writeln('{') | ||||
| 		g.writeln('	g_test_oks++;') | ||||
| 		g.writeln('	cb_assertion_ok( _STR("${mod_path}"), ${a.pos.line_nr}, _STR("assert ${s_assertion}"), _STR("${g.fn_decl.name}()") );') | ||||
| 		// g.writeln('	println(_STR("OK ${mod_path}:${a.pos.line_nr}: fn ${g.fn_decl.name}(): assert $s_assertion"));')
 | ||||
| 		g.writeln('	cb_assertion_ok( _STR("${mod_path}"), ${a.pos.line_nr+1}, _STR("assert ${s_assertion}"), _STR("${g.fn_decl.name}()") );') | ||||
| 		g.writeln('}else{') | ||||
| 		g.writeln('	g_test_fails++;') | ||||
| 		g.writeln('	cb_assertion_failed( _STR("${mod_path}"), ${a.pos.line_nr}, _STR("assert ${s_assertion}"), _STR("${g.fn_decl.name}()") );') | ||||
| 		g.writeln('	cb_assertion_failed( _STR("${mod_path}"), ${a.pos.line_nr+1}, _STR("assert ${s_assertion}"), _STR("${g.fn_decl.name}()") );') | ||||
| 		g.writeln('	exit(1);') | ||||
| 		g.writeln('	// TODO') | ||||
| 		g.writeln('	// Maybe print all vars in a test function if it fails?') | ||||
|  | @ -623,7 +622,7 @@ fn (g mut Gen) gen_assert_stmt(a ast.AssertStmt) { | |||
| 		return | ||||
| 	} | ||||
| 	g.writeln('{}else{') | ||||
| 	g.writeln('	eprintln(_STR("${mod_path}:${a.pos.line_nr}: FAIL: fn ${g.fn_decl.name}(): assert $s_assertion"));') | ||||
| 	g.writeln('	eprintln(_STR("${mod_path}:${a.pos.line_nr+1}: FAIL: fn ${g.fn_decl.name}(): assert $s_assertion"));') | ||||
| 	g.writeln('	exit(1);') | ||||
| 	g.writeln('}') | ||||
| } | ||||
|  |  | |||
|  | @ -354,10 +354,11 @@ pub fn (p mut Parser) stmt() ast.Stmt { | |||
| 		} | ||||
| 		.key_assert { | ||||
| 			p.next() | ||||
| 			assert_pos := p.tok.position() | ||||
| 			expr := p.expr(0) | ||||
| 			return ast.AssertStmt{ | ||||
| 				expr: expr | ||||
| 				pos: p.tok.position() | ||||
| 				pos: assert_pos | ||||
| 			} | ||||
| 		} | ||||
| 		.key_mut, .key_static { | ||||
|  |  | |||
|  | @ -724,6 +724,10 @@ pub fn (s mut Scanner) scan() token.Token { | |||
| 				s.ignore_line() | ||||
| 				s.line_comment = s.text[start + 1..s.pos] | ||||
| 				comment := s.line_comment.trim_space() | ||||
| 				s.pos-- | ||||
| 				// fix line_nr, \n was read, and the comment is marked
 | ||||
| 				// on the next line
 | ||||
| 				s.line_nr-- | ||||
| 				if s.comments_mode == .parse_comments { | ||||
| 					// Find out if this comment is on its own line (for vfmt)
 | ||||
| 					mut is_separate_line_comment := true | ||||
|  | @ -735,10 +739,6 @@ pub fn (s mut Scanner) scan() token.Token { | |||
| 					if is_separate_line_comment { | ||||
| 						comment = '|' + comment | ||||
| 					} | ||||
| 					s.pos-- | ||||
| 					// fix line_nr, \n was read, and the comment is marked
 | ||||
| 					// on the next line
 | ||||
| 					s.line_nr-- | ||||
| 					return s.new_token(.comment, comment) | ||||
| 				} | ||||
| 				// s.fgenln('// ${s.prev_tok.str()} "$s.line_comment"')
 | ||||
|  |  | |||
|  | @ -39,5 +39,5 @@ fn test_scan() { | |||
| 	assert e == 120.0 | ||||
| 	assert 1.23e+10 == 1.23e10 | ||||
| 	assert 1.23e+10 == 1.23e0010 | ||||
| 	assert -1.23e+10 == 1.23e0010 * -1.0 | ||||
| 	assert (-1.23e+10) == (1.23e0010 * -1.0) | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue