genbindings: improved uintptr handling for enum types

This commit is contained in:
mappu 2024-08-27 20:05:38 +12:00
parent a0812831e7
commit a0b51bef8e
3 changed files with 34 additions and 9 deletions

View File

@ -49,12 +49,11 @@ func (p CppParameter) RenderTypeCabi() string {
ret = "int"
} else if strings.Contains(p.ParameterType, `::`) {
if _, ok := KnownClassnames[p.ParameterType]; ok {
if p.IsEnum() {
ret = "uintptr_t"
} else {
// Inner class
ret = cabiClassName(p.ParameterType)
} else {
// Enum
ret = "uintptr_t"
}
}
@ -602,6 +601,12 @@ extern "C" {
} else if m.ReturnType.Const {
shouldReturn += "(" + emitReturnTypeCabi(m.ReturnType) + ") "
} else if m.ReturnType.IsEnum() {
// Needs an explicit uintptr cast
shouldReturn = m.ReturnType.RenderTypeQtCpp() + " ret = "
afterCall += "\treturn static_cast<uintptr_t>(ret);\n"
}
preamble, forwarding := emitParametersCABI2CppForwarding(m.Parameters)

View File

@ -85,12 +85,11 @@ func (p CppParameter) RenderTypeGo() string {
ret += "int"
} else if strings.Contains(p.ParameterType, `::`) {
if _, ok := KnownClassnames[p.ParameterType]; ok {
if p.IsEnum() {
ret += "uintptr"
} else {
// Inner class
ret += cabiClassName(p.ParameterType)
} else {
// Enum
ret += "uintptr"
}
} else {
// Do not transform this type

View File

@ -47,6 +47,12 @@ func (p *CppParameter) CopyWithAlias(alias CppParameter) CppParameter {
ret := *p // copy
ret.ParameterName = alias.ParameterName
ret.TypeAlias = alias.ParameterType
// If this was a pointer to a typedef'd type, or a typedef of a pointer type, we need to preserve that
// WARNING: This can't work for double indirection
ret.Const = ret.Const || alias.Const
ret.Pointer = ret.Pointer || alias.Pointer
ret.ByRef = ret.ByRef || alias.ByRef
return ret
}
@ -76,6 +82,21 @@ func (p CppParameter) QtClassType() bool {
return true
}
func (p CppParameter) IsEnum() bool {
if strings.Contains(p.ParameterType, `::`) {
if _, ok := KnownClassnames[p.ParameterType]; ok {
// It's an inner class
return false
} else {
// Enum
return true
}
}
// Top-level enums aren't supported yet
return false
}
func (p CppParameter) QListOf() (CppParameter, bool) {
if strings.HasPrefix(p.ParameterType, "QList<") && strings.HasSuffix(p.ParameterType, `>`) {
return parseSingleTypeString(p.ParameterType[6 : len(p.ParameterType)-1]), true
@ -103,7 +124,7 @@ func (p CppParameter) QSetOf() bool {
func (p CppParameter) IntType() bool {
if strings.Contains(p.ParameterType, `::`) {
if p.IsEnum() {
return true
}