cutego/internal/binding/converter/header.go

173 lines
3.4 KiB
Go
Executable file

package converter
import (
"fmt"
"strings"
"github.com/therecipe/qt/internal/binding/parser"
)
func GoHeaderName(f *parser.Function) (o string) {
if f.SignalMode == "callback" {
var tmp = fmt.Sprintf("callback%v%v", f.Class(), strings.Replace(strings.Title(f.Name), "~", "Destroy", -1))
if f.Overload {
tmp += f.OverloadNumber
}
return tmp
}
if f.Static {
o += fmt.Sprintf("%v_", strings.Split(f.Fullname, "::")[0])
}
switch f.Meta {
case "constructor":
o += "New"
case "destructor":
o += "Destroy"
}
o += f.SignalMode
o += strings.Title(f.Name)
o += f.TemplateMode
if f.Overload {
o += f.OverloadNumber
}
if strings.ContainsAny(o, "&<>=/!()[]{}-^|*+-") || strings.Contains(o, "Operator") {
f.Access = "unsupported_GoHeaderName"
return f.Access
}
return strings.Replace(o, "~", "", -1)
}
func CppHeaderName(f *parser.Function) string {
return fmt.Sprintf("%v_%v", strings.Split(f.Fullname, "::")[0], GoHeaderName(f))
}
func GoHeaderOutput(f *parser.Function) string {
var value = f.Output
if f.Meta == "constructor" && f.Output == "" {
value = f.Name
}
var o = goType(f, value)
if isClass(o) {
return fmt.Sprintf("*%v", o)
}
return o
}
func CppHeaderOutput(f *parser.Function) string {
var value = f.Output
if f.Meta == "constructor" && f.Output == "" {
value = f.Name
}
return cppType(f, value)
}
func GoHeaderInput(f *parser.Function) (o string) {
if f.SignalMode == "callback" {
o += "ptr unsafe.Pointer, ptrName *C.char"
for _, p := range f.Parameters {
if v := cgoType(f, p.Value); v != "" {
o += fmt.Sprintf(", %v %v", cleanName(p.Name), v)
}
}
return strings.TrimSuffix(o, ", ")
}
if (f.Meta == "signal" || strings.Contains(f.Virtual, "impure")) && f.SignalMode == "Connect" {
o += "f func ("
}
if (f.Meta == "signal" || strings.Contains(f.Virtual, "impure")) && f.SignalMode != "Connect" {
if strings.Contains(f.Virtual, "impure") && f.SignalMode == "" {
} else {
return
}
}
for _, p := range f.Parameters {
if v := goType(f, p.Value); v != "" {
if isClass(v) {
if (f.Meta == "signal" || strings.Contains(f.Virtual, "impure")) && f.SignalMode == "Connect" {
o += fmt.Sprintf("%v *%v, ", cleanName(p.Name), v)
} else {
o += fmt.Sprintf("%v %v_ITF, ", cleanName(p.Name), v)
}
} else {
o += fmt.Sprintf("%v %v, ", cleanName(p.Name), v)
}
} else {
f.Access = "unsupported_GoHeaderInput"
return f.Access
}
}
o = strings.TrimSuffix(o, ", ")
if (f.Meta == "signal" || strings.Contains(f.Virtual, "impure")) && f.SignalMode == "Connect" {
o += ")"
}
return
}
func GoHeaderInputSignalFunction(f *parser.Function) (o string) {
o += "func ("
for _, p := range f.Parameters {
if v := goType(f, p.Value); v != "" {
if isClass(v) {
o += fmt.Sprintf("*%v, ", v)
} else {
o += fmt.Sprintf("%v, ", v)
}
} else {
f.Access = "unsupported_GoHeaderInputSignalFunction"
return f.Access
}
}
o = strings.TrimSuffix(o, ", ")
o += ")"
return
}
func CppHeaderInput(f *parser.Function) (o string) {
if !(f.Static || f.Meta == "constructor") {
o += "void* ptr, "
}
if f.Meta == "signal" {
return strings.TrimSuffix(o, ", ")
}
for _, p := range f.Parameters {
if v := cppType(f, p.Value); !(v == "") {
o += fmt.Sprintf("%v %v, ", v, cleanName(p.Name))
} else {
f.Access = "unsupported_CppHeaderInput"
return f.Access
}
}
return strings.TrimSuffix(o, ", ")
}