toml: check for invalid placement of underscores around exponent (#12303)
							parent
							
								
									f14dabc6bd
								
							
						
					
					
						commit
						52df19ef61
					
				| 
						 | 
				
			
			@ -61,6 +61,7 @@ fn has_repeating(str string, repeats []rune) bool {
 | 
			
		|||
 | 
			
		||||
fn (c Checker) check_number(num ast.Number) ? {
 | 
			
		||||
	lit := num.text
 | 
			
		||||
	lit_lower_case := lit.to_lower()
 | 
			
		||||
	if lit in ['0', '0.0', '+0', '-0', '+0.0', '-0.0', '0e0', '+0e0', '-0e0', '0e00'] {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -78,8 +79,8 @@ fn (c Checker) check_number(num ast.Number) ? {
 | 
			
		|||
 | 
			
		||||
	mut hex_bin_oct := is_hex_bin_oct(lit)
 | 
			
		||||
	mut is_bin, mut is_oct, mut is_hex := false, false, false
 | 
			
		||||
	is_float := lit.to_lower().all_before('e').contains('.')
 | 
			
		||||
	has_exponent_notation := lit.to_lower().contains('e')
 | 
			
		||||
	is_float := lit_lower_case.all_before('e').contains('.')
 | 
			
		||||
	has_exponent_notation := lit_lower_case.contains('e')
 | 
			
		||||
	float_decimal_index := lit.index('.') or { -1 }
 | 
			
		||||
	// mut is_first_digit := byte(lit[0]).is_digit()
 | 
			
		||||
	mut ascii := byte(lit[0]).ascii_str()
 | 
			
		||||
| 
						 | 
				
			
			@ -160,15 +161,16 @@ fn (c Checker) check_number(num ast.Number) ? {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	if has_exponent_notation {
 | 
			
		||||
		if lit.to_lower().all_after('e').starts_with('_') {
 | 
			
		||||
		if lit_lower_case.all_after('e').starts_with('_')
 | 
			
		||||
			|| lit_lower_case.all_before('e').ends_with('_') {
 | 
			
		||||
			return error(@MOD + '.' + @STRUCT + '.' + @FN +
 | 
			
		||||
				' the exponent in "$lit" can not start with an underscore in ...${c.excerpt(num.pos)}...')
 | 
			
		||||
				' the exponent in "$lit" can not start nor end with an underscore in ...${c.excerpt(num.pos)}...')
 | 
			
		||||
		}
 | 
			
		||||
		if lit.to_lower().all_after('e').contains('.') {
 | 
			
		||||
		if lit_lower_case.all_after('e').contains('.') {
 | 
			
		||||
			return error(@MOD + '.' + @STRUCT + '.' + @FN +
 | 
			
		||||
				' numbers like "$lit" (with exponent) can not have a decimal point in ...${c.excerpt(num.pos)}...')
 | 
			
		||||
		}
 | 
			
		||||
		if !is_hex && lit.to_lower().count('e') > 1 {
 | 
			
		||||
		if !is_hex && lit_lower_case.count('e') > 1 {
 | 
			
		||||
			return error(@MOD + '.' + @STRUCT + '.' + @FN +
 | 
			
		||||
				' numbers like "$lit" (with exponent) can only have one exponent in ...${c.excerpt(num.pos)}...')
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -189,9 +191,9 @@ fn (c Checker) check_number(num ast.Number) ? {
 | 
			
		|||
			return error(@MOD + '.' + @STRUCT + '.' + @FN +
 | 
			
		||||
				' numbers like "$lit" (float) can not have underscores before or after the decimal point in ...${c.excerpt(num.pos)}...')
 | 
			
		||||
		}
 | 
			
		||||
		if lit.contains('e.') || lit.contains('.e') || lit.contains('E.') || lit.contains('.E') {
 | 
			
		||||
		if lit_lower_case.contains('e.') || lit.contains('.e') {
 | 
			
		||||
			return error(@MOD + '.' + @STRUCT + '.' + @FN +
 | 
			
		||||
				' numbers like "$lit" (float) can not have underscores before or after the decimal point in ...${c.excerpt(num.pos)}...')
 | 
			
		||||
				' numbers like "$lit" (float) can not have decimal points on either side of the exponent notation in ...${c.excerpt(num.pos)}...')
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		if lit.len > 1 && lit.starts_with('0') && lit[1] !in [`b`, `o`, `x`] {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,8 +19,6 @@ const (
 | 
			
		|||
		'string/basic-out-of-range-unicode-escape-1.toml',
 | 
			
		||||
		'string/basic-out-of-range-unicode-escape-2.toml',
 | 
			
		||||
		'string/bad-uni-esc.toml',
 | 
			
		||||
		// Float
 | 
			
		||||
		'float/trailing-us-exp.toml',
 | 
			
		||||
		// Encoding
 | 
			
		||||
		'encoding/bad-utf8-in-comment.toml',
 | 
			
		||||
		'encoding/bad-utf8-in-string.toml',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue