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) {
|
pub fn (mut g Gen) write_interface_typesymbol_declaration(sym ast.TypeSymbol) {
|
||||||
info := sym.info as ast.Interface
|
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('\tunion {')
|
||||||
g.type_definitions.writeln('\t\tvoid* _object;')
|
g.type_definitions.writeln('\t\tvoid* _object;')
|
||||||
for variant in info.types {
|
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)
|
cname := c_name(field.name)
|
||||||
g.type_definitions.writeln('\t$styp* $cname;')
|
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) {
|
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