miqt/cmd/genbindings/emitgo.go

89 lines
1.9 KiB
Go
Raw Normal View History

2024-08-06 01:03:23 +00:00
package main
import (
"go/format"
"log"
2024-08-06 02:29:12 +00:00
"strings"
2024-08-06 01:03:23 +00:00
)
func emitParametersGo(params []CppParameter) string {
2024-08-06 02:29:12 +00:00
tmp := make([]string, 0, len(params))
for _, p := range params {
tmp = append(tmp, p.ParameterType+" "+p.ParameterName)
2024-08-06 02:29:12 +00:00
}
return strings.Join(tmp, ", ")
}
func emitGo(src *CppParsedHeader) (string, error) {
2024-08-06 02:29:12 +00:00
ret := strings.Builder{}
ret.WriteString(`package miqt
2024-08-06 02:29:12 +00:00
/*
2024-08-06 02:29:12 +00:00
#cgo CFLAGS: -fPIC
#cgo pkg-config: Qt5Widgets
#include "binding.h"
2024-08-06 02:29:12 +00:00
*/
import "C"
2024-08-06 02:29:12 +00:00
`)
for _, c := range src.Classes {
2024-08-06 02:29:12 +00:00
ret.WriteString(`
type ` + c.ClassName + ` struct {
h C.P` + c.ClassName + `
}
func (this *` + c.ClassName + `) cPointer() C.P` + c.ClassName + ` {
if this == nil {
return nil
2024-08-06 02:29:12 +00:00
}
return this.h
2024-08-06 02:29:12 +00:00
}
`)
2024-08-06 02:29:12 +00:00
for i, ctor := range c.Ctors {
ret.WriteString(`
// New` + c.ClassName + maybeSuffix(i) + ` constructs a new ` + c.ClassName + ` object.
func New` + c.ClassName + maybeSuffix(i) + `(` + emitParametersGo(ctor.Parameters) + `) {
ret := C.` + c.ClassName + `_new` + maybeSuffix(i) + `(` + emitParametersNames(ctor.Parameters, "") + `)
return &` + c.ClassName + `{h: ret}
}
`)
2024-08-06 02:29:12 +00:00
}
for _, m := range c.Methods {
// TODO for any known pointer type, call its cPointer() method instead of passing it directly
2024-08-06 02:29:12 +00:00
shouldReturn := "return "
returnTypeDecl := m.ReturnType
if returnTypeDecl == "void" {
shouldReturn = ""
returnTypeDecl = ""
}
2024-08-06 02:29:12 +00:00
ret.WriteString(`
func (this *` + c.ClassName + `) ` + m.MethodName + `(` + emitParametersGo(m.Parameters) + `) ` + returnTypeDecl + ` {
` + shouldReturn + ` C.` + c.ClassName + `_` + m.SafeMethodName() + `(` + emitParametersNames(m.Parameters, c.ClassName) + `)
}
`)
}
2024-08-06 02:29:12 +00:00
}
2024-08-06 02:29:12 +00:00
// Run gofmt over the result
formattedSrc, err := format.Source([]byte(ret.String()))
if err != nil {
log.Printf("gofmt failure: %v", err)
formattedSrc = []byte(ret.String())
2024-08-06 02:29:12 +00:00
}
return string(formattedSrc), nil
2024-08-06 01:03:23 +00:00
}