mirror of
https://github.com/mappu/miqt.git
synced 2025-01-23 23:10:36 +00:00
genbindings: inheritance support
This commit is contained in:
parent
55481316ed
commit
afcde0a69b
@ -76,6 +76,26 @@ func processClassType(node map[string]interface{}, className string) (CppClass,
|
||||
}
|
||||
}
|
||||
|
||||
// Check if this (publicly) inherits another class
|
||||
if bases, ok := node["bases"].([]interface{}); ok {
|
||||
for _, base := range bases {
|
||||
base, ok := base.(map[string]interface{})
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
|
||||
access, ok := base["access"].(string)
|
||||
if !(ok && access == "public") {
|
||||
continue
|
||||
}
|
||||
|
||||
if typ, ok := base["type"].(map[string]interface{}); ok {
|
||||
if qualType, ok := typ["qualType"].(string); ok {
|
||||
ret.Inherits = append(ret.Inherits, qualType)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Parse all methods
|
||||
|
||||
|
@ -93,6 +93,14 @@ import "C"
|
||||
ret.WriteString(`
|
||||
type ` + c.ClassName + ` struct {
|
||||
h C.P` + c.ClassName + `
|
||||
`)
|
||||
|
||||
// Embed all inherited types to directly allow calling inherited methods
|
||||
for _, base := range c.Inherits {
|
||||
ret.WriteString(base + "\n")
|
||||
}
|
||||
|
||||
ret.WriteString(`
|
||||
}
|
||||
|
||||
func (this *` + c.ClassName + `) cPointer() C.P` + c.ClassName + ` {
|
||||
@ -104,13 +112,18 @@ import "C"
|
||||
|
||||
`)
|
||||
|
||||
localInit := "h: ret"
|
||||
for _, base := range c.Inherits {
|
||||
localInit += ", " + base + ": " + base + "{h: ret}"
|
||||
}
|
||||
|
||||
for i, ctor := range c.Ctors {
|
||||
preamble, forwarding := emitParametersGo2CABIForwarding(ctor)
|
||||
ret.WriteString(`
|
||||
// New` + c.ClassName + maybeSuffix(i) + ` constructs a new ` + c.ClassName + ` object.
|
||||
func New` + c.ClassName + maybeSuffix(i) + `(` + emitParametersGo(ctor.Parameters) + `) {
|
||||
` + preamble + ` ret := C.` + c.ClassName + `_new` + maybeSuffix(i) + `(` + forwarding + `)
|
||||
return &` + c.ClassName + `{h: ret}
|
||||
return &` + c.ClassName + `{` + localInit + `}
|
||||
}
|
||||
|
||||
`)
|
||||
|
@ -71,7 +71,7 @@ type CppClass struct {
|
||||
ClassName string
|
||||
Abstract bool
|
||||
Ctors []CppMethod // only use the parameters
|
||||
Extends []string
|
||||
Inherits []string // other class names
|
||||
Methods []CppMethod
|
||||
Props []CppProperty
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user