generics: fix generic_struct_insts_to_concrete (#9536)
							parent
							
								
									0b39de2fd3
								
							
						
					
					
						commit
						f1797a0150
					
				|  | @ -1093,27 +1093,22 @@ pub fn (mut t Table) generic_struct_insts_to_concrete() { | |||
| 			} | ||||
| 			mut parent_info := parent.info as Struct | ||||
| 			mut fields := parent_info.fields.clone() | ||||
| 			for i, _ in fields { | ||||
| 				mut field := fields[i] | ||||
| 				if field.typ.has_flag(.generic) { | ||||
| 					if parent_info.generic_types.len != info.generic_types.len { | ||||
| 						// TODO: proper error
 | ||||
| 						panic('generic template mismatch') | ||||
| 					} | ||||
| 					for j, gp in parent_info.generic_types { | ||||
| 						if gp == field.typ { | ||||
| 							field.typ = info.generic_types[j].derive(field.typ).clear_flag(.generic) | ||||
| 							break | ||||
| 						} | ||||
| 			if parent_info.generic_types.len == info.generic_types.len { | ||||
| 				for i, _ in fields { | ||||
| 					mut field := fields[i] | ||||
| 					if t_typ := t.resolve_generic_by_types(field.typ, parent_info.generic_types, | ||||
| 						info.generic_types) | ||||
| 					{ | ||||
| 						field.typ = t_typ | ||||
| 					} | ||||
| 					fields[i] = field | ||||
| 				} | ||||
| 				fields[i] = field | ||||
| 				parent_info.generic_types = [] | ||||
| 				parent_info.fields = fields | ||||
| 				typ.is_public = true | ||||
| 				typ.kind = .struct_ | ||||
| 				typ.info = parent_info | ||||
| 			} | ||||
| 			parent_info.generic_types = [] | ||||
| 			parent_info.fields = fields | ||||
| 			typ.is_public = true | ||||
| 			typ.kind = .struct_ | ||||
| 			typ.info = parent_info | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -49,3 +49,15 @@ fn test_generics_with_generics_struct_string() { | |||
| 	assert ret.contains("data: ['foo', 'bar']") | ||||
| 	assert ret.contains('index: 11') | ||||
| } | ||||
| 
 | ||||
| fn test_generics_struct_insts_to_concrete() { | ||||
| 	ai := ArrayIterator<int>{ | ||||
| 		data: [11, 22], | ||||
| 		index: 22 | ||||
| 	} | ||||
| 	println(ai) | ||||
| 	ret := '$ai' | ||||
| 	assert ret.contains('ArrayIterator<int>{') | ||||
| 	assert ret.contains('data: [11, 22]') | ||||
| 	assert ret.contains('index: 22') | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue