aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/Qt.DotNet.Adapter/Qt/DotNet/TypeCast.cs18
-rw-r--r--src/Qt.DotNet.GenerationRules/Qt/DotNet/CodeGeneration/Rules/TypeCasting/GenerateTypeCast.cs53
-rw-r--r--src/Qt.DotNet.Generator/Qt/DotNet/CodeGeneration/DependencyGraph.cs6
3 files changed, 75 insertions, 2 deletions
diff --git a/src/Qt.DotNet.Adapter/Qt/DotNet/TypeCast.cs b/src/Qt.DotNet.Adapter/Qt/DotNet/TypeCast.cs
new file mode 100644
index 0000000..6e4cc32
--- /dev/null
+++ b/src/Qt.DotNet.Adapter/Qt/DotNet/TypeCast.cs
@@ -0,0 +1,18 @@
+/***************************************************************************************************
+ Copyright (C) 2025 The Qt Company Ltd.
+ SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+***************************************************************************************************/
+
+using System;
+using Qt.Quick;
+
+namespace Qt.DotNet
+{
+ [Include]
+ [QmlElement(Singleton = true)]
+ public class TypeCast
+ {
+ [Include]
+ public TypeCast() { }
+ }
+}
diff --git a/src/Qt.DotNet.GenerationRules/Qt/DotNet/CodeGeneration/Rules/TypeCasting/GenerateTypeCast.cs b/src/Qt.DotNet.GenerationRules/Qt/DotNet/CodeGeneration/Rules/TypeCasting/GenerateTypeCast.cs
new file mode 100644
index 0000000..af59fdd
--- /dev/null
+++ b/src/Qt.DotNet.GenerationRules/Qt/DotNet/CodeGeneration/Rules/TypeCasting/GenerateTypeCast.cs
@@ -0,0 +1,53 @@
+/***************************************************************************************************
+ Copyright (C) 2025 The Qt Company Ltd.
+ SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+***************************************************************************************************/
+
+using System.Reflection;
+
+namespace Qt.DotNet.CodeGeneration.Rules.TypeCasting
+{
+ using static Placeholders;
+ using static Traits;
+
+ public class GenerateTypeCast : Class.GenerateClass
+ {
+ public override bool Matches(MemberInfo src)
+ => base.Matches(src) && src != TypeOf<TypeCast>();
+ public override IEnumerable<MemberInfo> DependsOn => [TypeOf<TypeCast>()];
+ public override Result Execute(MemberInfo src)
+ {
+ if (src is not Type type)
+ return Error();
+
+ var typeCast = TypeOf<TypeCast>();
+
+ // TO-DO: Generate unique names for cast functions
+
+ ////////////////////////////////////////////////////////////////////////////////////////
+ //
+ if (typeCast.GetPlaceholder(MethodDeclarations) is not { } methods)
+ return Error();
+ methods += $@"
+Q_INVOKABLE {type.MFn(Ns | Name)} *as{type.MFn(Name)}(QObject *obj);
+{Blank}";
+ ////////////////////////////////////////////////////////////////////////////////////////
+ //
+ if (typeCast.GetPlaceholder(Includes) is not { } includes)
+ return Error();
+ includes += $"#include <{type.MFn(Ns | Dir)}{type.MFn(File)}.h>";
+
+ ////////////////////////////////////////////////////////////////////////////////////////
+ //
+ if (typeCast.GetPlaceholder(MethodsImplementation) is not { } implementation)
+ return Error();
+ implementation += $@"
+{type.MFn(Ns | Name)} *{typeCast.MFn(Ns | Name)}::as{type.MFn(Name)}(QObject *qObj)
+{{
+ return Convert::as<{type.MFn(Ns | Name)}>(qObj);
+}}
+{Blank}";
+ return Ok;
+ }
+ }
+}
diff --git a/src/Qt.DotNet.Generator/Qt/DotNet/CodeGeneration/DependencyGraph.cs b/src/Qt.DotNet.Generator/Qt/DotNet/CodeGeneration/DependencyGraph.cs
index 85b1ee5..97788b6 100644
--- a/src/Qt.DotNet.Generator/Qt/DotNet/CodeGeneration/DependencyGraph.cs
+++ b/src/Qt.DotNet.Generator/Qt/DotNet/CodeGeneration/DependencyGraph.cs
@@ -257,9 +257,11 @@ namespace Qt.DotNet.CodeGeneration
}
}
- await Task.WhenAll(
- assembly.ExportedTypes
+ var exportedTypes = assembly.ExportedTypes
.Where(x => x.DeclaringType == null)
+ .Append(TypeOf<TypeCast>());
+
+ await Task.WhenAll(exportedTypes
.Select(x => Task.Run(async () => await AddEdgeAsync(Root, x))));
if (!Edges.Any())