checker: more checks for in and !in
							parent
							
								
									0def084932
								
							
						
					
					
						commit
						d697b2848a
					
				| 
						 | 
					@ -399,24 +399,23 @@ pub fn (mut c Checker) infix_expr(mut infix_expr ast.InfixExpr) table.Type {
 | 
				
			||||||
				.array {
 | 
									.array {
 | 
				
			||||||
					right_sym := c.table.get_type_symbol(right.array_info().elem_type)
 | 
										right_sym := c.table.get_type_symbol(right.array_info().elem_type)
 | 
				
			||||||
					if left.kind != right_sym.kind {
 | 
										if left.kind != right_sym.kind {
 | 
				
			||||||
						c.error('the data type on the left of `in` does not match the array item type',
 | 
											c.error('the data type on the left of `$infix_expr.op.str()` does not match the array item type',
 | 
				
			||||||
						infix_expr.pos)
 | 
											infix_expr.pos)
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				.map {
 | 
									.map {
 | 
				
			||||||
					key_sym := c.table.get_type_symbol(right.map_info().key_type)
 | 
										key_sym := c.table.get_type_symbol(right.map_info().key_type)
 | 
				
			||||||
					if left.kind != key_sym.kind {
 | 
										if left.kind != key_sym.kind {
 | 
				
			||||||
						c.error('the data type on the left of `in` does not match the map key type',
 | 
											c.error('the data type on the left of `$infix_expr.op.str()` does not match the map key type', infix_expr.pos)
 | 
				
			||||||
							infix_expr.pos)
 | 
					 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				.string {
 | 
									.string {
 | 
				
			||||||
					if left.kind != .string {
 | 
										if left.kind != .string {
 | 
				
			||||||
						c.error('the data type on the left of `in` must be a string', infix_expr.pos)
 | 
											c.error('the data type on the left of `$infix_expr.op.str()` must be a string', infix_expr.pos)
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				else {
 | 
									else {
 | 
				
			||||||
					c.error('`in` can only be used with an array/map/string', infix_expr.pos)
 | 
										c.error('`$infix_expr.op.str()` can only be used with an array/map/string', infix_expr.pos)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			return table.bool_type
 | 
								return table.bool_type
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -54,3 +54,24 @@ vlib/v/checker/tests/in_mismatch_type.v:31:9: error: the data type on the left o
 | 
				
			||||||
      |            ~~
 | 
					      |            ~~
 | 
				
			||||||
   32 |         println('all right')
 | 
					   32 |         println('all right')
 | 
				
			||||||
   33 |     }
 | 
					   33 |     }
 | 
				
			||||||
 | 
					vlib/v/checker/tests/in_mismatch_type.v:34:7: error: the data type on the left of `!in` does not match the array item type
 | 
				
			||||||
 | 
					   32 |         println('all right')
 | 
				
			||||||
 | 
					   33 |     }
 | 
				
			||||||
 | 
					   34 |     if 1 !in a_s {
 | 
				
			||||||
 | 
					      |          ~~~
 | 
				
			||||||
 | 
					   35 |         println('ok')
 | 
				
			||||||
 | 
					   36 |     }
 | 
				
			||||||
 | 
					vlib/v/checker/tests/in_mismatch_type.v:37:9: error: the data type on the left of `!in` does not match the array item type 
 | 
				
			||||||
 | 
					   35 |         println('ok')
 | 
				
			||||||
 | 
					   36 |     }
 | 
				
			||||||
 | 
					   37 |     if '1' !in a_i {
 | 
				
			||||||
 | 
					      |            ~~~
 | 
				
			||||||
 | 
					   38 |         println('good')
 | 
				
			||||||
 | 
					   39 |     }
 | 
				
			||||||
 | 
					vlib/v/checker/tests/in_mismatch_type.v:41:7: error: the data type on the left of `!in` does not match the map key type
 | 
				
			||||||
 | 
					   39 |     }
 | 
				
			||||||
 | 
					   40 |
 | 
				
			||||||
 | 
					   41 |     if 5 !in m {
 | 
				
			||||||
 | 
					      |          ~~~
 | 
				
			||||||
 | 
					   42 |         println('yay')
 | 
				
			||||||
 | 
					   43 |     }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -31,4 +31,14 @@ fn main() {
 | 
				
			||||||
	if '2' in a_i {
 | 
						if '2' in a_i {
 | 
				
			||||||
		println('all right')
 | 
							println('all right')
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if 1 !in a_s {
 | 
				
			||||||
 | 
							println('ok')
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if '1' !in a_i {
 | 
				
			||||||
 | 
							println('good')
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if 5 !in m {
 | 
				
			||||||
 | 
							println('yay')
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue