mirror of
https://github.com/bluszcz/cutego.git
synced 2024-09-29 05:35:16 +03:00
267 lines
5.8 KiB
Go
Executable file
267 lines
5.8 KiB
Go
Executable file
package converter
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/therecipe/qt/internal/binding/parser"
|
|
)
|
|
|
|
func GoHeaderName(f *parser.Function) string {
|
|
|
|
if f.SignalMode == parser.CALLBACK {
|
|
return fmt.Sprintf("callback%v_%v%v", f.ClassName(), strings.Replace(strings.Title(f.Name), parser.TILDE, "Destroy", -1), f.OverloadNumber)
|
|
}
|
|
|
|
var bb = new(bytes.Buffer)
|
|
defer bb.Reset()
|
|
|
|
if f.Static {
|
|
fmt.Fprintf(bb, "%v_", strings.Split(f.Fullname, "::")[0])
|
|
}
|
|
|
|
fmt.Fprint(bb, f.SignalMode)
|
|
|
|
switch {
|
|
case f.Meta == parser.CONSTRUCTOR:
|
|
{
|
|
fmt.Fprint(bb, "New")
|
|
}
|
|
|
|
case f.Meta == parser.DESTRUCTOR, strings.HasPrefix(f.Name, parser.TILDE):
|
|
{
|
|
fmt.Fprint(bb, "Destroy")
|
|
}
|
|
}
|
|
|
|
switch f.TemplateModeJNI {
|
|
case "String", "Object":
|
|
{
|
|
if strings.Contains(f.Name, "Object") {
|
|
if f.TemplateModeJNI == "String" {
|
|
fmt.Fprintf(bb, "%v%v", strings.Replace(strings.Title(f.Name), "Object", "", -1), f.TemplateModeJNI)
|
|
} else {
|
|
fmt.Fprint(bb, strings.Title(f.Name))
|
|
}
|
|
}
|
|
}
|
|
|
|
default:
|
|
{
|
|
fmt.Fprintf(bb, "%v%v",
|
|
|
|
func() string {
|
|
if strings.HasSuffix(f.Name, "_atList") || strings.HasSuffix(f.Name, "_setList") ||
|
|
strings.HasSuffix(f.Name, "_newList") || strings.HasSuffix(f.Name, "_keyList") {
|
|
return f.Name
|
|
}
|
|
return strings.Title(f.Name)
|
|
}(),
|
|
|
|
f.TemplateModeJNI,
|
|
)
|
|
}
|
|
}
|
|
|
|
if f.Overload {
|
|
fmt.Fprint(bb, f.OverloadNumber)
|
|
}
|
|
|
|
if f.Default {
|
|
fmt.Fprint(bb, "Default")
|
|
}
|
|
|
|
if f.Exception {
|
|
fmt.Fprint(bb, "Caught")
|
|
}
|
|
|
|
if strings.ContainsAny(bb.String(), "&<>=/!()[]{}^|*+-") || strings.Contains(bb.String(), "Operator") {
|
|
f.Access = "unsupported_GoHeaderName"
|
|
return f.Access
|
|
}
|
|
|
|
return strings.Replace(bb.String(), parser.TILDE, "", -1)
|
|
}
|
|
|
|
func CppHeaderName(f *parser.Function) string {
|
|
return fmt.Sprintf("%v_%v", f.ClassName(), GoHeaderName(f))
|
|
}
|
|
|
|
func GoHeaderOutput(f *parser.Function) string {
|
|
|
|
switch f.SignalMode {
|
|
case parser.CALLBACK:
|
|
{
|
|
return cgoTypeOutput(f, f.Output)
|
|
}
|
|
|
|
case parser.CONNECT, parser.DISCONNECT:
|
|
{
|
|
return ""
|
|
}
|
|
}
|
|
|
|
var value = f.Output
|
|
|
|
if f.Meta == parser.CONSTRUCTOR && f.Output == "" {
|
|
value = f.Name
|
|
}
|
|
|
|
var o = goType(f, value)
|
|
if isClass(o) {
|
|
if !strings.HasPrefix(o, "[]") && !strings.HasPrefix(o, "map[") {
|
|
o = fmt.Sprintf("*%v", o)
|
|
}
|
|
}
|
|
|
|
if f.Exception {
|
|
if o != "" {
|
|
o += ", "
|
|
}
|
|
o += "error"
|
|
o = fmt.Sprintf("(%v)", o)
|
|
}
|
|
return o
|
|
}
|
|
|
|
func CppHeaderOutput(f *parser.Function) string {
|
|
|
|
var value = f.Output
|
|
|
|
if f.Meta == parser.CONSTRUCTOR && f.Output == "" {
|
|
value = f.Name
|
|
}
|
|
|
|
return cppType(f, value)
|
|
}
|
|
|
|
func GoHeaderInput(f *parser.Function) string {
|
|
var bb = new(bytes.Buffer)
|
|
defer bb.Reset()
|
|
|
|
if f.SignalMode == parser.DISCONNECT {
|
|
return bb.String()
|
|
}
|
|
|
|
if f.SignalMode == parser.CALLBACK {
|
|
fmt.Fprint(bb, "ptr unsafe.Pointer")
|
|
for _, p := range f.Parameters {
|
|
if v := cgoType(f, p.Value); v != "" {
|
|
fmt.Fprintf(bb, ", %v %v", parser.CleanName(p.Name, p.Value), v)
|
|
}
|
|
}
|
|
return bb.String()
|
|
}
|
|
|
|
if f.SignalMode == parser.CONNECT {
|
|
fmt.Fprint(bb, "f func (")
|
|
}
|
|
|
|
if (f.Meta == parser.SIGNAL || strings.Contains(f.Virtual, parser.IMPURE)) && f.SignalMode != parser.CONNECT {
|
|
if strings.Contains(f.Virtual, parser.IMPURE) && f.SignalMode == "" {
|
|
} else {
|
|
return bb.String()
|
|
}
|
|
}
|
|
|
|
var tmp = make([]string, 0)
|
|
for _, p := range f.Parameters {
|
|
if v := goType(f, p.Value); v != "" {
|
|
if isClass(v) && !parser.IsPackedList(parser.CleanValue(p.Value)) && !parser.IsPackedMap(parser.CleanValue(p.Value)) {
|
|
if f.SignalMode == parser.CONNECT {
|
|
tmp = append(tmp, fmt.Sprintf("%v *%v", parser.CleanName(p.Name, p.Value), v))
|
|
} else {
|
|
tmp = append(tmp, fmt.Sprintf("%v %v_ITF", parser.CleanName(p.Name, p.Value), v))
|
|
}
|
|
} else {
|
|
tmp = append(tmp, fmt.Sprintf("%v %v", parser.CleanName(p.Name, p.Value), v))
|
|
}
|
|
} else {
|
|
f.Access = "unsupported_GoHeaderInput"
|
|
return f.Access
|
|
}
|
|
}
|
|
fmt.Fprint(bb, strings.Join(tmp, ", "))
|
|
|
|
if f.SignalMode == parser.CONNECT {
|
|
fmt.Fprint(bb, ")")
|
|
|
|
if isClass(goType(f, f.Output)) && !parser.IsPackedList(parser.CleanValue(f.Output)) && !parser.IsPackedMap(parser.CleanValue(f.Output)) {
|
|
fmt.Fprintf(bb, " *%v", goType(f, f.Output))
|
|
} else {
|
|
fmt.Fprintf(bb, " %v", goType(f, f.Output))
|
|
}
|
|
}
|
|
|
|
return bb.String()
|
|
}
|
|
|
|
//TODO: combine with above
|
|
func GoHeaderInputSignalFunction(f *parser.Function) string {
|
|
var bb = new(bytes.Buffer)
|
|
defer bb.Reset()
|
|
|
|
fmt.Fprint(bb, "func (")
|
|
|
|
var tmp = make([]string, 0)
|
|
|
|
for _, p := range f.Parameters {
|
|
if v := goType(f, p.Value); v != "" {
|
|
if isClass(v) && !parser.IsPackedList(parser.CleanValue(p.Value)) && !parser.IsPackedMap(parser.CleanValue(p.Value)) {
|
|
tmp = append(tmp, fmt.Sprintf("*%v", v))
|
|
} else {
|
|
tmp = append(tmp, v)
|
|
}
|
|
} else {
|
|
f.Access = "unsupported_GoHeaderInputSignalFunction"
|
|
return f.Access
|
|
}
|
|
}
|
|
|
|
fmt.Fprint(bb, strings.Join(tmp, ", "))
|
|
|
|
fmt.Fprint(bb, ")")
|
|
|
|
if f.SignalMode == parser.CALLBACK {
|
|
if isClass(goType(f, f.Output)) && !parser.IsPackedList(parser.CleanValue(f.Output)) && !parser.IsPackedMap(parser.CleanValue(f.Output)) {
|
|
fmt.Fprintf(bb, " *%v", goType(f, f.Output))
|
|
} else {
|
|
fmt.Fprintf(bb, " %v", goType(f, f.Output))
|
|
}
|
|
}
|
|
|
|
return bb.String()
|
|
}
|
|
|
|
func GoGoInput(f *parser.Function) string {
|
|
var tmp = make([]string, 0)
|
|
for _, p := range f.Parameters {
|
|
tmp = append(tmp, parser.CleanName(p.Name, p.Value))
|
|
}
|
|
return strings.Join(tmp, ", ")
|
|
}
|
|
|
|
func CppHeaderInput(f *parser.Function) string {
|
|
var tmp = make([]string, 0)
|
|
|
|
if !(f.Static || f.Meta == parser.CONSTRUCTOR) {
|
|
tmp = append(tmp, "void* ptr")
|
|
}
|
|
|
|
if f.Meta == parser.SIGNAL {
|
|
return strings.Join(tmp, ", ")
|
|
}
|
|
|
|
for _, p := range f.Parameters {
|
|
if v := cppTypeInput(f, p.Value); v != "" {
|
|
tmp = append(tmp, fmt.Sprintf("%v %v", v, parser.CleanName(p.Name, p.Value)))
|
|
} else {
|
|
f.Access = "unsupported_CppHeaderInput"
|
|
return f.Access
|
|
}
|
|
}
|
|
|
|
return strings.Join(tmp, ", ")
|
|
}
|