parser: allow blank ident in nested loops
							parent
							
								
									fb97c2e01e
								
							
						
					
					
						commit
						7e400124e8
					
				|  | @ -107,6 +107,9 @@ pub fn (s mut Scope) update_var_type(name string, typ table.Type) { | |||
| } | ||||
| 
 | ||||
| pub fn (s mut Scope) register(name string, obj ScopeObject) { | ||||
| 	if name == '_' { | ||||
| 		return | ||||
| 	} | ||||
| 	if x := s.find(name) { | ||||
| 		// println('existing obect: $name')
 | ||||
| 		return | ||||
|  |  | |||
|  | @ -595,7 +595,9 @@ fn (mut g Gen) for_in(it ast.ForInStmt) { | |||
| 		g.write('; $i < ') | ||||
| 		g.expr(it.high) | ||||
| 		g.writeln('; $i++) {') | ||||
| 		g.writeln('\tint $it.val_var = $i;') | ||||
| 		if it.val_var != '_' { | ||||
| 			g.writeln('\tint $it.val_var = $i;') | ||||
| 		} | ||||
| 		g.stmts(it.stmts) | ||||
| 		g.writeln('}') | ||||
| 	} else if it.kind == .array { | ||||
|  | @ -608,16 +610,11 @@ fn (mut g Gen) for_in(it ast.ForInStmt) { | |||
| 		g.write('${atmp_type} ${atmp} = ') | ||||
| 		g.expr(it.cond) | ||||
| 		g.writeln(';') | ||||
| 		i := if it.key_var == '' { g.new_tmp_var() } else { it.key_var } | ||||
| 		if cond_type_is_ptr { | ||||
| 			g.writeln('for (int $i = 0; $i < ${atmp}->len; $i++) {') | ||||
| 		} else { | ||||
| 			g.writeln('for (int $i = 0; $i < ${atmp}.len; $i++) {') | ||||
| 		} | ||||
| 		if cond_type_is_ptr { | ||||
| 			g.writeln('\t$styp $it.val_var = (($styp*)${atmp}->data)[$i];') | ||||
| 		} else { | ||||
| 			g.writeln('\t$styp $it.val_var = (($styp*)${atmp}.data)[$i];') | ||||
| 		i := if it.key_var in ['', '_'] { g.new_tmp_var() } else { it.key_var } | ||||
| 		op_field := if cond_type_is_ptr { '->' } else { '.' } | ||||
| 		g.writeln('for (int $i = 0; $i < ${atmp}${op_field}len; $i++) {') | ||||
| 		if it.val_var != '_' { | ||||
| 			g.writeln('\t$styp $it.val_var = (($styp*)${atmp}${op_field}data)[$i];') | ||||
| 		} | ||||
| 		g.stmts(it.stmts) | ||||
| 		g.writeln('}') | ||||
|  | @ -628,21 +625,23 @@ fn (mut g Gen) for_in(it ast.ForInStmt) { | |||
| 		val_styp := g.typ(it.val_type) | ||||
| 		keys_tmp := 'keys_' + g.new_tmp_var() | ||||
| 		idx := g.new_tmp_var() | ||||
| 		key := if it.key_var == '' { g.new_tmp_var() } else { it.key_var } | ||||
| 		key := if it.key_var in ['', '_'] { g.new_tmp_var() } else { it.key_var } | ||||
| 		zero := g.type_default(it.val_type) | ||||
| 		g.write('array_$key_styp $keys_tmp = map_keys(&') | ||||
| 		g.expr(it.cond) | ||||
| 		g.writeln(');') | ||||
| 		g.writeln('for (int $idx = 0; $idx < ${keys_tmp}.len; $idx++) {') | ||||
| 		g.writeln('\t$key_styp $key = (($key_styp*)${keys_tmp}.data)[$idx];') | ||||
| 		g.write('\t$val_styp $it.val_var = (*($val_styp*)map_get3(') | ||||
| 		g.expr(it.cond) | ||||
| 		g.writeln(', $key, &($val_styp[]){ $zero }));') | ||||
| 		if it.val_var != '_' { | ||||
| 			g.write('\t$val_styp $it.val_var = (*($val_styp*)map_get3(') | ||||
| 			g.expr(it.cond) | ||||
| 			g.writeln(', $key, &($val_styp[]){ $zero }));') | ||||
| 		} | ||||
| 		g.stmts(it.stmts) | ||||
| 		g.writeln('}') | ||||
| 	} else if table.type_is(it.cond_type, .variadic) { | ||||
| 		g.writeln('// FOR IN cond_type/variadic') | ||||
| 		i := if it.key_var == '' { g.new_tmp_var() } else { it.key_var } | ||||
| 		i := if it.key_var in ['', '_'] { g.new_tmp_var() } else { it.key_var } | ||||
| 		styp := g.typ(it.cond_type) | ||||
| 		g.write('for (int $i = 0; $i < ') | ||||
| 		g.expr(it.cond) | ||||
|  | @ -653,13 +652,15 @@ fn (mut g Gen) for_in(it ast.ForInStmt) { | |||
| 		g.stmts(it.stmts) | ||||
| 		g.writeln('}') | ||||
| 	} else if it.kind == .string { | ||||
| 		i := if it.key_var == '' { g.new_tmp_var() } else { it.key_var } | ||||
| 		i := if it.key_var in ['', '_'] { g.new_tmp_var() } else { it.key_var } | ||||
| 		g.write('for (int $i = 0; $i < ') | ||||
| 		g.expr(it.cond) | ||||
| 		g.writeln('.len; $i++) {') | ||||
| 		g.write('byte $it.val_var = ') | ||||
| 		g.expr(it.cond) | ||||
| 		g.writeln('.str[$i];') | ||||
| 		if it.val_var != '_' { | ||||
| 			g.write('byte $it.val_var = ') | ||||
| 			g.expr(it.cond) | ||||
| 			g.writeln('.str[$i];') | ||||
| 		} | ||||
| 		g.stmts(it.stmts) | ||||
| 		g.writeln('}') | ||||
| 	} | ||||
|  |  | |||
|  | @ -0,0 +1,260 @@ | |||
| fn test_assign() { | ||||
| 	_ = 123 | ||||
| } | ||||
| 
 | ||||
| fn fn_with_blank_param(_ int) { | ||||
| 	_ = 456 | ||||
| } | ||||
| 
 | ||||
| fn test_fn_with_blank_param() { | ||||
| 	fn_with_blank_param(321) | ||||
| } | ||||
| 
 | ||||
| fn test_for_in_range() { | ||||
| 	for _ in 1 .. 10 { | ||||
| 		assert true | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn test_nested_range() { | ||||
| 	for _ in 1 .. 10 { | ||||
| 		for _ in 1 .. 10 { | ||||
| 			assert true | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn test_for_in_array_simple() { | ||||
| 	for _ in [1, 2, 3] { | ||||
| 		assert true | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn test_for_in_array_key() { | ||||
| 	mut i := 1 | ||||
| 	for _, v in [1, 2, 3] { | ||||
| 		assert v == i | ||||
| 		i++ | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn test_for_in_array_val() { | ||||
| 	mut j := 0 | ||||
| 	for i, _ in [3, 4, 5] { | ||||
| 		assert i == j | ||||
| 		j++ | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn test_for_in_array_both() { | ||||
| 	for _, _ in [1, 2, 3] { | ||||
| 		assert true | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn test_nested_for_in_array_simple() { | ||||
| 	for _ in [1, 2, 3] { | ||||
| 		for _ in [1, 2, 3] { | ||||
| 			assert true | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn test_nested_for_in_array_key() { | ||||
| 	for _, v in [1, 2, 3] { | ||||
| 		for _, w in [1, 2, 3] { | ||||
| 			assert true | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn test_nested_for_in_array_val() { | ||||
| 	for i, _ in [1, 2, 3] { | ||||
| 		for j, _ in [1, 2, 3] { | ||||
| 			assert true | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn test_nested_for_in_array_both() { | ||||
| 	for _, _ in [1, 2, 3] { | ||||
| 		for _, _ in [1, 2, 3] { | ||||
| 			assert true | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| const ( | ||||
| 	m = { | ||||
| 		'key': 'value' | ||||
| 	} | ||||
| ) | ||||
| 
 | ||||
| fn test_for_in_map_key() { | ||||
| 	for _, v in m { | ||||
| 		assert v == 'value' | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn test_for_in_map_val() { | ||||
| 	for i, _ in m { | ||||
| 		assert i == 'key' | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn test_for_in_map_both() { | ||||
| 	for _, _ in m { | ||||
| 		assert true | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn test_nested_for_in_map_key() { | ||||
| 	for _, v in m { | ||||
| 		assert v == 'value' | ||||
| 		for _, w in m { | ||||
| 			assert w == 'value' | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn test_nested_for_in_map_val() { | ||||
| 	for i, _ in m { | ||||
| 		assert i == 'key' | ||||
| 		for j, _ in m { | ||||
| 			assert j == 'key' | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn test_nested_for_in_map_both() { | ||||
| 	for _, _ in m { | ||||
| 		for _, _ in m { | ||||
| 			assert true | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn fn_for_in_variadic_args_simple(arr ...string) { | ||||
| 	for _ in arr { | ||||
| 		assert true | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn fn_for_in_variadic_args_key(arr ...string) { | ||||
| 	for _, v in arr { | ||||
| 		assert true | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn fn_for_in_variadic_args_val(arr ...string) { | ||||
| 	for i, _ in arr { | ||||
| 		assert true | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn fn_for_in_variadic_args_both(arr ...string) { | ||||
| 	for _, _ in arr { | ||||
| 		assert true | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn fn_nested_for_in_variadic_args(arr ...string) { | ||||
| 	for _ in arr { | ||||
| 		for _ in arr { | ||||
| 			assert true | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn fn_nested_for_in_variadic_args_key(arr ...string) { | ||||
| 	for _, v in arr { | ||||
| 		for _, w in arr { | ||||
| 			assert true | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn fn_nested_for_in_variadic_args_val(arr ...string) { | ||||
| 	for i, _ in arr { | ||||
| 		for j, _ in arr { | ||||
| 			assert true | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn fn_nested_for_in_variadic_args_both(arr ...string) { | ||||
| 	for _, _ in arr { | ||||
| 		for _, _ in arr { | ||||
| 			assert true | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn test_for_in_variadic_args() { | ||||
| 	fn_for_in_variadic_args_simple('a', 'b', 'c') | ||||
| 	fn_for_in_variadic_args_key('a', 'b', 'c') | ||||
| 	fn_for_in_variadic_args_val('a', 'b', 'c') | ||||
| 	fn_for_in_variadic_args_both('a', 'b', 'c') | ||||
| 	fn_nested_for_in_variadic_args('a', 'b', 'c') | ||||
| 	fn_nested_for_in_variadic_args_key('a', 'b', 'c') | ||||
| 	fn_nested_for_in_variadic_args_val('a', 'b', 'c') | ||||
| 	fn_nested_for_in_variadic_args_both('a', 'b', 'c') | ||||
| } | ||||
| 
 | ||||
| fn test_for_in_string_simple() { | ||||
| 	for _ in 'abcd' { | ||||
| 		assert true | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn test_for_in_string_key() { | ||||
| 	for _, v in 'a' { | ||||
| 		assert v == `a` | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn test_for_in_string_val() { | ||||
| 	for i, _ in 'a' { | ||||
| 		assert i == 0 | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn test_for_in_string_both() { | ||||
| 	for _, _ in 'abcd' { | ||||
| 		assert true | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn test_nested_for_in_string_simple() { | ||||
| 	for _ in 'abcd' { | ||||
| 		for _ in 'abcd' { | ||||
| 			assert true | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn test_nested_for_in_string_key() { | ||||
| 	for _, v in 'a' { | ||||
| 		assert v == `a` | ||||
| 		for _, w in 'a' { | ||||
| 			assert w == `a` | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn test_nested_for_in_string_val() { | ||||
| 	for i, _ in 'a' { | ||||
| 		assert i == 0 | ||||
| 		for j, _ in 'a' { | ||||
| 			assert j == 0 | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn test_nested_for_in_string_both() { | ||||
| 	for _, _ in 'abcd' { | ||||
| 		for _, _ in 'abcd' { | ||||
| 			assert true | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
		Loading…
	
		Reference in New Issue