diff --git a/cmd/genbindings/clang2il.go b/cmd/genbindings/clang2il.go index 47437534..bad7a96f 100644 --- a/cmd/genbindings/clang2il.go +++ b/cmd/genbindings/clang2il.go @@ -398,8 +398,6 @@ nextMethod: continue } - ApplyQuirks(ret.ClassName, &mm) - ret.Ctors = append(ret.Ctors, mm) case "CXXDestructorDecl": @@ -493,8 +491,6 @@ nextMethod: return CppClass{}, err } - ApplyQuirks(ret.ClassName, &mm) - ret.Methods = append(ret.Methods, mm) default: diff --git a/cmd/genbindings/config-allowlist.go b/cmd/genbindings/config-allowlist.go index b5b3052d..fb47fab8 100644 --- a/cmd/genbindings/config-allowlist.go +++ b/cmd/genbindings/config-allowlist.go @@ -631,7 +631,9 @@ func AllowType(p CppParameter, isReturnType bool) error { return nil } -func ApplyQuirks(className string, mm *CppMethod) { +// ApplyQuirks adds flags to methods that require special handling. +// This is evaluated early, before optional arguments are expanded. +func ApplyQuirks(packageName, className string, mm *CppMethod) { if mm.ReturnType.GetQtCppType().ParameterType == "Q_PID" { // int64 on Linux, _PROCESS_INFORMATION* on Windows @@ -648,11 +650,11 @@ func ApplyQuirks(className string, mm *CppMethod) { mm.BecomesNonConstInVersion = addr("6.7") } - if className == "QObjectData" && mm.MethodName == "dynamicMetaObject" { + if packageName == "qt6" && className == "QObjectData" && mm.MethodName == "dynamicMetaObject" { mm.ReturnType.BecomesConstInVersion = addr("6.9") } - if className == "QFileDialog" && mm.MethodName == "saveFileContent" && mm.IsStatic { + if className == "QFileDialog" && mm.MethodName == "saveFileContent" && mm.IsStatic && len(mm.Parameters) > 1 { // The prototype was changed from // [Qt 5 - 6.6] void QFileDialog::saveFileContent(const QByteArray &fileContent, const QString &fileNameHint = QString()) // [Qt 6.7] void QFileDialog::saveFileContent(const QByteArray &fileContent, const QString &fileNameHint, QWidget *parent = nullptr) diff --git a/cmd/genbindings/emitcabi.go b/cmd/genbindings/emitcabi.go index efd078bb..67d6ec05 100644 --- a/cmd/genbindings/emitcabi.go +++ b/cmd/genbindings/emitcabi.go @@ -864,7 +864,7 @@ extern "C" { continue // Can't call directly, have to go through our wrapper } - if m.ReturnType.BecomesConstInVersion != nil && packageName == "qt6" { + if m.ReturnType.BecomesConstInVersion != nil { ret.WriteString(fmt.Sprintf("// This method's return type was changed from non-const to const in Qt "+*m.ReturnType.BecomesConstInVersion) + "\n" + "#if QT_VERSION >= QT_VERSION_CHECK(" + strings.Replace(*m.ReturnType.BecomesConstInVersion, `.`, `,`, -1) + ",0)\n" + fmt.Sprintf("%s %s(%s);\n", "const "+m.ReturnType.RenderTypeCabi(), cabiMethodName(c, m), emitParametersCabi(m, ifv(m.IsConst, "const ", "")+className+"*")) + @@ -1270,7 +1270,7 @@ extern "C" { "\n", ) - } else if m.ReturnType.BecomesConstInVersion != nil && strings.Contains(src.Filename, "qt6") { + } else if m.ReturnType.BecomesConstInVersion != nil { ret.WriteString("" + "// This method's return type was changed from non-const to const in Qt " + *m.ReturnType.BecomesConstInVersion + "\n" + diff --git a/cmd/genbindings/main.go b/cmd/genbindings/main.go index 7293355d..e6ab9c52 100644 --- a/cmd/genbindings/main.go +++ b/cmd/genbindings/main.go @@ -157,7 +157,8 @@ func generate(packageName string, srcDirs []string, allowHeaderFn func(string) b parsed.Filename = inputHeader // Stash // AST transforms on our IL - astTransformChildClasses(parsed) // must be first + astTransformChildClasses(parsed) // must be first + astTransformApplyQuirks(packageName, parsed) // must be before optional/overload expansion astTransformOptional(parsed) astTransformOverloads(parsed) astTransformConstructorOrder(parsed) diff --git a/cmd/genbindings/transformquirks.go b/cmd/genbindings/transformquirks.go new file mode 100644 index 00000000..80ce954b --- /dev/null +++ b/cmd/genbindings/transformquirks.go @@ -0,0 +1,21 @@ +package main + +// astTransformApplyQuirks applies quirk flags to the class/method. +func astTransformApplyQuirks(packageName string, parsed *CppParsedHeader) { + + for i, c := range parsed.Classes { + + // Constructors + + for j, _ := range c.Ctors { + ApplyQuirks(packageName, c.ClassName, &parsed.Classes[i].Ctors[j]) + } + + // Methods + + for j, _ := range c.Methods { + ApplyQuirks(packageName, c.ClassName, &parsed.Classes[i].Methods[j]) + } + + } +}