parent
							
								
									c3b9eaf146
								
							
						
					
					
						commit
						67d1b72e36
					
				| 
						 | 
				
			
			@ -866,7 +866,9 @@ pub fn (mut g Gen) write_alias_typesymbol_declaration(sym ast.TypeSymbol) {
 | 
			
		|||
 | 
			
		||||
pub fn (mut g Gen) write_interface_typesymbol_declaration(sym ast.TypeSymbol) {
 | 
			
		||||
	info := sym.info as ast.Interface
 | 
			
		||||
	g.type_definitions.writeln('typedef struct {')
 | 
			
		||||
	struct_name := c_name(sym.name)
 | 
			
		||||
	g.type_definitions.writeln('typedef struct $struct_name $struct_name;')
 | 
			
		||||
	g.type_definitions.writeln('struct $struct_name {')
 | 
			
		||||
	g.type_definitions.writeln('\tunion {')
 | 
			
		||||
	g.type_definitions.writeln('\t\tvoid* _object;')
 | 
			
		||||
	for variant in info.types {
 | 
			
		||||
| 
						 | 
				
			
			@ -880,7 +882,7 @@ pub fn (mut g Gen) write_interface_typesymbol_declaration(sym ast.TypeSymbol) {
 | 
			
		|||
		cname := c_name(field.name)
 | 
			
		||||
		g.type_definitions.writeln('\t$styp* $cname;')
 | 
			
		||||
	}
 | 
			
		||||
	g.type_definitions.writeln('} ${c_name(sym.name)};')
 | 
			
		||||
	g.type_definitions.writeln('};')
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn (mut g Gen) write_fn_typesymbol_declaration(sym ast.TypeSymbol) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,39 @@
 | 
			
		|||
struct Base {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface Foo {
 | 
			
		||||
	parent Foo
 | 
			
		||||
	thing(mut b Base, value i64) string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct Bar {
 | 
			
		||||
	parent Foo
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn (f Bar) thing(mut b Base, value i64) string {
 | 
			
		||||
	return 'bar'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct SubBar {
 | 
			
		||||
	parent Foo = Bar{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn (f SubBar) thing(mut b Base, value i64) string {
 | 
			
		||||
	return 'subbar'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_interface_nested_field() {
 | 
			
		||||
	mut foo_group := []Foo{}
 | 
			
		||||
	foo_group << Bar{}
 | 
			
		||||
	foo_group << SubBar{}
 | 
			
		||||
 | 
			
		||||
	mut b := Base{}
 | 
			
		||||
	mut ret := []string{}
 | 
			
		||||
	for foo in foo_group {
 | 
			
		||||
		println(foo.thing(mut b, 22))
 | 
			
		||||
		ret << foo.thing(mut b, 22)
 | 
			
		||||
	}
 | 
			
		||||
	assert ret.len == 2
 | 
			
		||||
	assert ret[0] == 'bar'
 | 
			
		||||
	assert ret[1] == 'subbar'
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue