Skip to content

Commit fc165fa

Browse files
committedSep 13, 2016
Updated Qt# to the latest C++#.
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent fd6b15b commit fc165fa

11 files changed

+115
-87
lines changed
 

‎QtSharp.CLI/packages.config

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<packages>
33
<package id="Baseclass.Contrib.Nuget.Output" version="2.1.0" targetFramework="net451" />
4-
<package id="CppSharp" version="0.5.2" targetFramework="net451" developmentDependency="true" />
4+
<package id="CppSharp" version="0.7.0" targetFramework="net451" developmentDependency="true" />
55
</packages>

‎QtSharp/CompileInlinesPass.cs

+9-9
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
using System.Linq;
44
using System.Text;
55
using CppSharp.AST;
6-
using CppSharp.Parser;
76
using CppSharp.Passes;
87
using CppSharp;
8+
using CppSharp.Parser;
99

1010
namespace QtSharp
1111
{
@@ -22,13 +22,13 @@ public CompileInlinesPass(string qmake, string make)
2222

2323
public override bool VisitLibrary(ASTContext context)
2424
{
25-
foreach (var module in Driver.Options.Modules)
25+
foreach (var module in this.Context.Options.Modules)
2626
{
2727
string error;
2828
const string qtVersionVariable = "QT_VERSION";
2929
var qtVersion = ProcessHelper.Run(this.qmake, string.Format("-query {0}", qtVersionVariable), out error);
30-
var qtVersionFile = Path.Combine(this.Driver.Options.OutputDir, qtVersionVariable);
31-
var dir = Platform.IsMacOS ? this.Driver.Options.OutputDir : Path.Combine(this.Driver.Options.OutputDir, "release");
30+
var qtVersionFile = Path.Combine(this.Context.Options.OutputDir, qtVersionVariable);
31+
var dir = Platform.IsMacOS ? this.Context.Options.OutputDir : Path.Combine(this.Context.Options.OutputDir, "release");
3232
var inlines = Path.GetFileName(string.Format("{0}{1}.{2}", Platform.IsWindows ? string.Empty : "lib",
3333
module.InlinesLibraryName, Platform.IsMacOS ? "dylib" : "dll"));
3434
var libFile = Path.Combine(dir, inlines);
@@ -56,8 +56,8 @@ public override bool VisitLibrary(ASTContext context)
5656
if (parserResult.Kind == ParserResultKind.Success)
5757
{
5858
var nativeLibrary = CppSharp.ClangParser.ConvertLibrary(parserResult.Library);
59-
this.Driver.Symbols.Libraries.Add(nativeLibrary);
60-
this.Driver.Symbols.IndexSymbols();
59+
this.Context.Symbols.Libraries.Add(nativeLibrary);
60+
this.Context.Symbols.IndexSymbols();
6161
parserResult.Library.Dispose();
6262
}
6363
}
@@ -68,7 +68,7 @@ public override bool VisitLibrary(ASTContext context)
6868
private bool CompileInlines(Module module)
6969
{
7070
var pro = string.Format("{0}.pro", module.InlinesLibraryName);
71-
var path = Path.Combine(this.Driver.Options.OutputDir, pro);
71+
var path = Path.Combine(this.Context.Options.OutputDir, pro);
7272
var proBuilder = new StringBuilder();
7373
var qtModules = string.Join(" ", from header in module.Headers
7474
where !header.EndsWith(".h", StringComparison.Ordinal)
@@ -104,11 +104,11 @@ private bool CompileInlines(Module module)
104104
Console.WriteLine(error);
105105
return false;
106106
}
107-
var makefile = File.Exists(Path.Combine(Driver.Options.OutputDir, "Makefile.Release")) ? "Makefile.Release" : "Makefile";
107+
var makefile = File.Exists(Path.Combine(this.Context.Options.OutputDir, "Makefile.Release")) ? "Makefile.Release" : "Makefile";
108108
if (Platform.IsMacOS)
109109
{
110110
// HACK: Clang does not support -fkeep-inline-functions so force compilation with (the real) GCC on OS X
111-
var makefilePath = Path.Combine(Driver.Options.OutputDir, makefile);
111+
var makefilePath = Path.Combine(this.Context.Options.OutputDir, makefile);
112112
var script = new StringBuilder(File.ReadAllText(makefilePath));
113113
var xcodePath = XcodeToolchain.GetXcodePath();
114114
script.Replace(Path.Combine(xcodePath, "Contents", "Developer", "usr", "bin", "gcc"), "/usr/local/bin/gcc");

‎QtSharp/GenerateEventEventsPass.cs

+8-2
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,16 @@ namespace QtSharp
1111
{
1212
public class GenerateEventEventsPass : TranslationUnitPass
1313
{
14+
public GenerateEventEventsPass(Generator generator)
15+
{
16+
this.generator = generator;
17+
}
18+
1419
public override bool VisitTranslationUnit(TranslationUnit unit)
1520
{
1621
if (!this.eventAdded)
1722
{
18-
this.Driver.Generator.OnUnitGenerated += this.OnUnitGenerated;
23+
this.generator.OnUnitGenerated += this.OnUnitGenerated;
1924
this.eventAdded = true;
2025
}
2126
return base.VisitTranslationUnit(unit);
@@ -78,7 +83,7 @@ public override bool VisitMethodDecl(Method method)
7883
baseMethod.IsPure)
7984
{
8085
this.events.Add(method);
81-
this.Driver.Options.ExplicitlyPatchedVirtualFunctions.Add(method.QualifiedOriginalName);
86+
this.Context.Options.ExplicitlyPatchedVirtualFunctions.Add(method.QualifiedOriginalName);
8287
}
8388
}
8489
}
@@ -87,5 +92,6 @@ public override bool VisitMethodDecl(Method method)
8792

8893
private bool eventAdded;
8994
private readonly HashSet<Method> events = new HashSet<Method>();
95+
private Generator generator;
9096
}
9197
}

‎QtSharp/GenerateSignalEventsPass.cs

+9-3
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,18 @@ public class GenerateSignalEventsPass : TranslationUnitPass
1515
{
1616
private bool eventAdded;
1717
private readonly HashSet<Event> events = new HashSet<Event>();
18+
private Generator generator;
19+
20+
public GenerateSignalEventsPass(Generator generator)
21+
{
22+
this.generator = generator;
23+
}
1824

1925
public override bool VisitTranslationUnit(TranslationUnit unit)
2026
{
2127
if (!this.eventAdded)
2228
{
23-
this.Driver.Generator.OnUnitGenerated += this.OnUnitGenerated;
29+
this.generator.OnUnitGenerated += this.OnUnitGenerated;
2430
this.eventAdded = true;
2531
}
2632
return base.VisitTranslationUnit(unit);
@@ -115,7 +121,7 @@ from e in @event.Parameters
115121
var qtMetacall = (
116122
from template in generatorOutput.Templates
117123
from block in template.FindBlocks(CSharpBlockKind.Method)
118-
where block.Declaration != null && block.Declaration.Name == "Qt_metacall" &&
124+
where block.Declaration != null && block.Declaration.Name == "QtMetacall" &&
119125
block.Declaration.Namespace.Name == "QObject"
120126
select block).FirstOrDefault();
121127
if (qtMetacall != null)
@@ -147,7 +153,7 @@ public override bool VisitClassDecl(Class @class)
147153
var qtMetaCall = @class.FindMethod("qt_metacall");
148154
if (qtMetaCall != null)
149155
{
150-
this.Driver.Options.ExplicitlyPatchedVirtualFunctions.Add(qtMetaCall.QualifiedOriginalName);
156+
this.Context.Options.ExplicitlyPatchedVirtualFunctions.Add(qtMetaCall.QualifiedOriginalName);
151157
}
152158
return true;
153159
}

‎QtSharp/GetCommentsFromQtDocsPass.cs

+6-6
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ public class GetCommentsFromQtDocsPass : TranslationUnitPass
1111
public GetCommentsFromQtDocsPass(string docsPath, IEnumerable<string> modules)
1212
{
1313
this.documentation = new Documentation(docsPath, modules);
14-
this.Options.VisitFunctionReturnType = false;
15-
this.Options.VisitFunctionParameters = false;
16-
this.Options.VisitEventParameters = false;
17-
this.Options.VisitClassBases = false;
18-
this.Options.VisitTemplateArguments = false;
19-
this.Options.VisitClassFields = false;
14+
this.VisitOptions.VisitFunctionReturnType = false;
15+
this.VisitOptions.VisitFunctionParameters = false;
16+
this.VisitOptions.VisitEventParameters = false;
17+
this.VisitOptions.VisitClassBases = false;
18+
this.VisitOptions.VisitTemplateArguments = false;
19+
this.VisitOptions.VisitClassFields = false;
2020
}
2121

2222
public override bool VisitLibrary(ASTContext context)

‎QtSharp/QFlags.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,15 @@ public override string CSharpSignature(CSharpTypePrinterContext ctx)
2424
return this.CSharpSignatureType(ctx).ToString();
2525
}
2626

27-
public override void CSharpMarshalToNative(MarshalContext ctx)
27+
public override void CSharpMarshalToNative(CSharpMarshalContext ctx)
2828
{
2929
if (ctx.Parameter.Type.Desugar().IsAddress())
3030
ctx.Return.Write("new global::System.IntPtr(&{0})", ctx.Parameter.Name);
3131
else
3232
ctx.Return.Write(ctx.Parameter.Name);
3333
}
3434

35-
public override void CSharpMarshalToManaged(MarshalContext ctx)
35+
public override void CSharpMarshalToManaged(CSharpMarshalContext ctx)
3636
{
3737
if (ctx.ReturnType.Type.Desugar().IsAddress())
3838
{

‎QtSharp/QString.cs

+6-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using CppSharp.AST;
22
using CppSharp.AST.Extensions;
3-
using CppSharp.Generators;
43
using CppSharp.Generators.CSharp;
54
using CppSharp.Types;
65

@@ -13,12 +12,12 @@ public override string CSharpSignature(CSharpTypePrinterContext ctx)
1312
{
1413
if (ctx.CSharpKind == CSharpTypePrinterContextKind.Native)
1514
{
16-
return ctx.Type.IsAddress() ? "QtCore.QString.Internal*" : "QtCore.QString.Internal";
15+
return string.Format("QtCore.QString.{0}{1}", Helpers.InternalStruct, ctx.Type.IsAddress() ? "*" : string.Empty);
1716
}
1817
return "string";
1918
}
2019

21-
public override void CSharpMarshalToNative(MarshalContext ctx)
20+
public override void CSharpMarshalToNative(CSharpMarshalContext ctx)
2221
{
2322
ctx.SupportBefore.WriteLine("var __stringPtr{0} = ReferenceEquals({1}, null) ? null : (ushort*) Marshal.StringToHGlobalUni({1}).ToPointer();",
2423
ctx.ParameterIndex, ctx.Parameter.Name);
@@ -37,13 +36,13 @@ public override void CSharpMarshalToNative(MarshalContext ctx)
3736
{
3837
this.Type.TryGetClass(out @class);
3938
}
40-
this.typePrinter = this.typePrinter ?? (this.typePrinter = new CSharpTypePrinter(ctx.Driver));
39+
this.typePrinter = this.typePrinter ?? (this.typePrinter = new CSharpTypePrinter(ctx.Context));
4140
var qualifiedIdentifier = (@class.OriginalClass ?? @class).Visit(this.typePrinter);
42-
ctx.Return.Write("ReferenceEquals(__qstring{0}, null) ? new {1}.Internal() : *({1}.Internal*) (__qstring{0}.{2})",
43-
ctx.ParameterIndex, qualifiedIdentifier, Helpers.InstanceIdentifier);
41+
ctx.Return.Write("ReferenceEquals(__qstring{0}, null) ? new {1}.{2}() : *({1}.{2}*) (__qstring{0}.{3})",
42+
ctx.ParameterIndex, qualifiedIdentifier, Helpers.InternalStruct, Helpers.InstanceIdentifier);
4443
}
4544

46-
public override void CSharpMarshalToManaged(MarshalContext ctx)
45+
public override void CSharpMarshalToManaged(CSharpMarshalContext ctx)
4746
{
4847
ctx.Return.Write("Marshal.PtrToStringUni(new IntPtr(QtCore.QString.{0}({1}).Utf16))",
4948
Helpers.CreateInstanceIdentifier, ctx.ReturnVarName);

‎QtSharp/QtSharp.cs

+60-26
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,19 @@ public ICollection<KeyValuePair<string, string>> GetVerifiedWrappedModules()
3333

3434
public void Preprocess(Driver driver, ASTContext lib)
3535
{
36-
foreach (var unit in lib.TranslationUnits.Where(u => u.FilePath != "<invalid>"))
36+
foreach (var unit in lib.TranslationUnits.Where(u => u.IsValid))
3737
{
38-
IgnorePrivateDeclarations(unit);
38+
// HACK: work around https://github.com/mono/CppSharp/issues/677
39+
if (unit.FileName == "locale_classes.tcc")
40+
{
41+
unit.ExplicitlyIgnore();
42+
}
43+
else
44+
{
45+
IgnorePrivateDeclarations(unit);
46+
}
3947
}
4048
lib.SetClassAsValueType("QByteArray");
41-
lib.SetClassAsValueType("QListData");
42-
lib.SetClassAsValueType("QListData::Data");
4349
lib.SetClassAsValueType("QLocale");
4450
lib.SetClassAsValueType("QModelIndex");
4551
lib.SetClassAsValueType("QPoint");
@@ -51,8 +57,6 @@ public void Preprocess(Driver driver, ASTContext lib)
5157
lib.SetClassAsValueType("QGenericArgument");
5258
lib.SetClassAsValueType("QGenericReturnArgument");
5359
lib.SetClassAsValueType("QVariant");
54-
lib.IgnoreClassMethodWithName("QString", "fromStdWString");
55-
lib.IgnoreClassMethodWithName("QString", "toStdWString");
5660

5761
// QString is type-mapped to string so we only need two methods for the conversion
5862
var qString = lib.FindCompleteClass("QString");
@@ -133,6 +137,34 @@ where string.IsNullOrEmpty(@enum.Name)
133137
{
134138
enumeration.Name = "TypeEnum";
135139
}
140+
141+
// HACK: work around https://github.com/mono/CppSharp/issues/692
142+
foreach (var name in new[] { "QImage", "QPixmap" })
143+
{
144+
var @class = lib.FindCompleteClass(name);
145+
var ctorWithArray = @class.Constructors.FirstOrDefault(
146+
c => c.Parameters.Count == 1 && c.Parameters[0].Type.Desugar() is ArrayType);
147+
if (ctorWithArray != null)
148+
{
149+
ctorWithArray.ExplicitlyIgnore();
150+
}
151+
}
152+
foreach (var name in new[] { "QGraphicsScene", "QGraphicsView" })
153+
{
154+
var @class = lib.FindCompleteClass(name);
155+
var drawItems = @class.Methods.FirstOrDefault(m => m.OriginalName == "drawItems");
156+
if (drawItems != null)
157+
{
158+
drawItems.ExplicitlyIgnore();
159+
}
160+
}
161+
lib.FindCompleteClass("QAbstractPlanarVideoBuffer").ExplicitlyIgnore();
162+
var qAbstractVideoBuffer = lib.FindCompleteClass("QAbstractVideoBuffer");
163+
var mapPlanes = qAbstractVideoBuffer.Methods.FirstOrDefault(m => m.OriginalName == "mapPlanes");
164+
if (mapPlanes != null)
165+
{
166+
mapPlanes.ExplicitlyIgnore();
167+
}
136168
}
137169

138170
private static void IgnorePrivateDeclarations(DeclarationContext unit)
@@ -163,15 +195,15 @@ private static void IgnorePrivateDeclaration(Declaration declaration)
163195

164196
public void Postprocess(Driver driver, ASTContext lib)
165197
{
166-
new ClearCommentsPass().VisitLibrary(driver.ASTContext);
198+
new ClearCommentsPass().VisitLibrary(driver.Context.ASTContext);
167199
var modules = this.qtInfo.LibFiles.Select(l => GetModuleNameFromLibFile(l));
168200
var s = System.Diagnostics.Stopwatch.StartNew();
169-
new GetCommentsFromQtDocsPass(this.qtInfo.Docs, modules).VisitLibrary(driver.ASTContext);
201+
new GetCommentsFromQtDocsPass(this.qtInfo.Docs, modules).VisitLibrary(driver.Context.ASTContext);
170202
System.Console.WriteLine("Documentation done in: {0}", s.Elapsed);
171203
new CaseRenamePass(
172204
RenameTargets.Function | RenameTargets.Method | RenameTargets.Property | RenameTargets.Delegate |
173205
RenameTargets.Field | RenameTargets.Variable,
174-
RenameCasePattern.UpperCamelCase).VisitLibrary(driver.ASTContext);
206+
RenameCasePattern.UpperCamelCase).VisitLibrary(driver.Context.ASTContext);
175207

176208
var qChar = lib.FindCompleteClass("QChar");
177209
var op = qChar.FindOperator(CXXOperatorKind.ExplicitConversion)
@@ -203,18 +235,18 @@ public void Postprocess(Driver driver, ASTContext lib)
203235

204236
public void Setup(Driver driver)
205237
{
238+
driver.ParserOptions.MicrosoftMode = false;
239+
driver.ParserOptions.NoBuiltinIncludes = true;
240+
driver.ParserOptions.TargetTriple = this.qtInfo.Target;
241+
driver.ParserOptions.Abi = CppAbi.Itanium;
242+
driver.ParserOptions.Verbose = true;
243+
driver.ParserOptions.addDefines("__float128=void");
206244
driver.Options.GeneratorKind = GeneratorKind.CSharp;
207-
driver.Options.MicrosoftMode = false;
208-
driver.Options.NoBuiltinIncludes = true;
209-
driver.Options.TargetTriple = this.qtInfo.Target;
210-
driver.Options.Abi = CppAbi.Itanium;
211-
driver.Options.Verbose = true;
212245
driver.Options.GenerateInterfacesForMultipleInheritance = true;
213246
driver.Options.GeneratePropertiesAdvanced = true;
214247
driver.Options.UnityBuild = true;
215248
driver.Options.IgnoreParseWarnings = true;
216249
driver.Options.CheckSymbols = true;
217-
driver.Options.GenerateSingleCSharpFile = true;
218250
driver.Options.GenerateInlines = true;
219251
driver.Options.CompileCode = true;
220252
driver.Options.GenerateDefaultValuesForArguments = true;
@@ -266,25 +298,27 @@ public void Setup(Driver driver)
266298
module.CodeFiles.Add(Path.Combine(dir, "QObject.cs"));
267299
module.CodeFiles.Add(Path.Combine(dir, "QChar.cs"));
268300
module.CodeFiles.Add(Path.Combine(dir, "QEvent.cs"));
269-
module.CodeFiles.Add(Path.Combine(dir, "_iobuf.cs"));
270301
}
271302

272303
driver.Options.Modules.Add(module);
273304
}
274305

275306
foreach (var systemIncludeDir in this.qtInfo.SystemIncludeDirs)
276-
driver.Options.addSystemIncludeDirs(systemIncludeDir);
307+
driver.ParserOptions.addSystemIncludeDirs(systemIncludeDir);
277308

278309
if (Platform.IsMacOS)
279310
{
280311
foreach (var frameworkDir in this.qtInfo.FrameworkDirs)
281-
driver.Options.addArguments(string.Format("-F{0}", frameworkDir));
282-
driver.Options.addArguments(string.Format("-F{0}", qtInfo.Libs));
312+
driver.ParserOptions.addArguments(string.Format("-F{0}", frameworkDir));
313+
driver.ParserOptions.addArguments(string.Format("-F{0}", qtInfo.Libs));
283314
}
284315

285-
driver.Options.addIncludeDirs(qtInfo.Headers);
286-
287-
driver.Options.addLibraryDirs(Platform.IsWindows ? qtInfo.Bins : qtInfo.Libs);
316+
driver.ParserOptions.addIncludeDirs(qtInfo.Headers);
317+
318+
driver.ParserOptions.addLibraryDirs(Platform.IsWindows ? qtInfo.Bins : qtInfo.Libs);
319+
320+
// Qt defines its own GUID with the same header guard as the system GUID, so ensure the system GUID is read first
321+
driver.Project.AddFile("guiddef.h");
288322
}
289323

290324
public static string GetModuleNameFromLibFile(string libFile)
@@ -299,10 +333,10 @@ public static string GetModuleNameFromLibFile(string libFile)
299333

300334
public void SetupPasses(Driver driver)
301335
{
302-
driver.TranslationUnitPasses.AddPass(new CompileInlinesPass(this.qtInfo.QMake, this.qtInfo.Make));
303-
driver.TranslationUnitPasses.AddPass(new GenerateSignalEventsPass());
304-
driver.TranslationUnitPasses.AddPass(new GenerateEventEventsPass());
305-
driver.TranslationUnitPasses.AddPass(new RemoveQObjectMembersPass());
336+
driver.Context.TranslationUnitPasses.AddPass(new CompileInlinesPass(this.qtInfo.QMake, this.qtInfo.Make));
337+
driver.Context.TranslationUnitPasses.AddPass(new GenerateSignalEventsPass(driver.Generator));
338+
driver.Context.TranslationUnitPasses.AddPass(new GenerateEventEventsPass(driver.Generator));
339+
driver.Context.TranslationUnitPasses.AddPass(new RemoveQObjectMembersPass());
306340
}
307341

308342
private readonly QtInfo qtInfo;

0 commit comments

Comments
 (0)
Please sign in to comment.