genbindings: handle function overloads

This commit is contained in:
mappu 2024-08-11 16:53:58 +12:00
parent 8de91463f5
commit 4d94d4cd34
2 changed files with 46 additions and 0 deletions

View File

@ -60,6 +60,7 @@ func main() {
// AST transforms on our IL // AST transforms on our IL
astTransformOptional(parsed) astTransformOptional(parsed)
astTransformOverloads(parsed)
// Emit 3 code files from the intermediate format // Emit 3 code files from the intermediate format
outputName := filepath.Join(*outDir, "gen_"+strings.TrimSuffix(filepath.Base(*inputHeader), `.h`)) outputName := filepath.Join(*outDir, "gen_"+strings.TrimSuffix(filepath.Base(*inputHeader), `.h`))

View File

@ -0,0 +1,45 @@
package main
import (
"fmt"
)
// astTransformOverloads renames methods if another method exists with the same
// name.
func astTransformOverloads(parsed *CppParsedHeader) {
for i, c := range parsed.Classes {
anyChange := false
existing := map[string]struct{}{}
for j, m := range c.Methods {
if _, ok := existing[m.MethodName]; !ok {
existing[m.MethodName] = struct{}{}
continue // No collision
}
// Collision - rename
anyChange = true
ctr := 2
var proposedName string
for {
proposedName = fmt.Sprintf("%s%d", m.MethodName, ctr)
if _, ok := existing[proposedName]; !ok {
break
}
ctr++ // Loop until we have a non-colliding name available
}
existing[proposedName] = struct{}{}
m.OverrideMethodName = m.MethodName
m.MethodName = proposedName
c.Methods[j] = m
}
if anyChange {
parsed.Classes[i] = c
}
}
}