checker: implement `[required]` struct field attribute (#6276)
							parent
							
								
									bd304f1141
								
							
						
					
					
						commit
						35cbca96e1
					
				|  | @ -180,7 +180,7 @@ fn (t TileLine) to_left() TileLine { | |||
| fn (b Board) to_left() Board { | ||||
| 	mut res := b | ||||
| 	for y := 0; y < 4; y++ { | ||||
| 		mut hline := TileLine{y} | ||||
| 		mut hline := TileLine{ypos: y} | ||||
| 		for x := 0; x < 4; x++ { | ||||
| 			hline.field[x] = b.field[y][x] | ||||
| 		} | ||||
|  |  | |||
|  | @ -36,7 +36,7 @@ mut: | |||
| fn (mut a App) init() { | ||||
| 	a.frame = 0 | ||||
| 	a.last = time.ticks() | ||||
| 	a.ps = particle.System{a.width, a.height} | ||||
| 	a.ps = particle.System{width: a.width, height: a.height} | ||||
| 	a.ps.init(particle.SystemConfig{ | ||||
| 		pool: 20000 | ||||
| 	}) | ||||
|  |  | |||
|  | @ -480,6 +480,20 @@ pub fn (mut c Checker) struct_init(mut struct_init ast.StructInit) table.Type { | |||
| 					c.warn('reference field `${type_sym.source_name}.$field.name` must be initialized', | ||||
| 						struct_init.pos) | ||||
| 				} | ||||
| 				// Check for `[required]` struct attr
 | ||||
| 				if field.attrs.contains('required') && !struct_init.is_short { | ||||
| 					mut found := false | ||||
| 					for init_field in struct_init.fields { | ||||
| 						if field.name == init_field.name { | ||||
| 							found = true | ||||
| 							break | ||||
| 						} | ||||
| 					} | ||||
| 					if !found { | ||||
| 						c.error('field `${type_sym.source_name}.$field.name` is required', | ||||
| 							struct_init.pos) | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		else {} | ||||
|  |  | |||
|  | @ -0,0 +1,7 @@ | |||
| vlib/v/checker/tests/struct_required_field.vv:12:6: error: field `Abc.f3` is required | ||||
|    10 |         f3: 789 | ||||
|    11 |     } | ||||
|    12 |     _ = Abc{ | ||||
|       |         ~~~~ | ||||
|    13 |         f1: 123 | ||||
|    14 |         f2: 789 | ||||
|  | @ -0,0 +1,16 @@ | |||
| struct Abc { | ||||
| 	f1 int [required] | ||||
| 	f2 int | ||||
| 	f3 int [required] | ||||
| } | ||||
| 
 | ||||
| fn main() { | ||||
| 	_ = Abc{ | ||||
| 		f1: 123 | ||||
| 		f3: 789 | ||||
| 	} | ||||
| 	_ = Abc{ | ||||
| 		f1: 123 | ||||
| 		f2: 789 | ||||
| 	} | ||||
| } | ||||
		Loading…
	
		Reference in New Issue