mirror of
https://github.com/mappu/miqt.git
synced 2024-12-23 01:18:37 +00:00
genbindings: track optional parameters in our IL, expand in AST pass
This commit is contained in:
parent
a991feb589
commit
85dd87e6d0
@ -154,9 +154,15 @@ nextMethod:
|
|||||||
|
|
||||||
// Update the name for the existing nth parameter
|
// Update the name for the existing nth parameter
|
||||||
mm.Parameters[paramCounter].ParameterName = parmName
|
mm.Parameters[paramCounter].ParameterName = parmName
|
||||||
paramCounter++
|
|
||||||
|
|
||||||
// TODO If this parameter is optional, expand it into multiple function overloads
|
// If this parameter has any internal AST nodes of its
|
||||||
|
// own, assume it means it's an optional parameter
|
||||||
|
if _, ok := methodObj["inner"]; ok {
|
||||||
|
mm.Parameters[paramCounter].Optional = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Next
|
||||||
|
paramCounter++
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// Something else inside a declaration??
|
// Something else inside a declaration??
|
||||||
|
@ -10,6 +10,7 @@ type CppParameter struct {
|
|||||||
Const bool
|
Const bool
|
||||||
Pointer bool
|
Pointer bool
|
||||||
ByRef bool
|
ByRef bool
|
||||||
|
Optional bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type CppProperty struct {
|
type CppProperty struct {
|
||||||
|
@ -54,6 +54,9 @@ func main() {
|
|||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AST transforms on our IL
|
||||||
|
astTransformOptional(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`))
|
||||||
|
|
||||||
|
50
cmd/genbindings/transformoptional.go
Normal file
50
cmd/genbindings/transformoptional.go
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// astTransformOptional expands all methods with optional parameters into
|
||||||
|
// explicit additional versions.
|
||||||
|
func astTransformOptional(parsed *CppParsedHeader) {
|
||||||
|
for i, c := range parsed.Classes {
|
||||||
|
|
||||||
|
anyChange := false
|
||||||
|
for j, m := range c.Methods {
|
||||||
|
|
||||||
|
// Search for first optional parameter (they all must be last)
|
||||||
|
optionalStart := -1
|
||||||
|
for k, p := range m.Parameters {
|
||||||
|
if p.Optional {
|
||||||
|
optionalStart = k
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if optionalStart == -1 {
|
||||||
|
continue // There were no optional parameters
|
||||||
|
}
|
||||||
|
|
||||||
|
anyChange = true
|
||||||
|
|
||||||
|
// Add method copies
|
||||||
|
for x := optionalStart; x < len(m.Parameters); x++ {
|
||||||
|
dupMethod := CppMethod{
|
||||||
|
MethodName: m.MethodName + fmt.Sprintf("%d", x+1),
|
||||||
|
ReturnType: m.ReturnType,
|
||||||
|
Parameters: nil,
|
||||||
|
}
|
||||||
|
dupMethod.Parameters = append(dupMethod.Parameters, m.Parameters[0:x+1]...)
|
||||||
|
c.Methods = append(c.Methods, dupMethod) // TODO can we insert them next, instead of at the end?
|
||||||
|
}
|
||||||
|
|
||||||
|
// Truncate the original method's parameters to only the
|
||||||
|
// mandatory ones
|
||||||
|
m.Parameters = m.Parameters[0:optionalStart]
|
||||||
|
c.Methods[j] = m
|
||||||
|
}
|
||||||
|
|
||||||
|
if anyChange {
|
||||||
|
parsed.Classes[i] = c
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user