From b9e3efbf0c6022f36828d27b5abf07daf7afc887 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Sat, 3 Oct 2015 02:49:26 +0300 Subject: [PATCH] Removed the option for copy ctors and prevented usage of ignored ones. Signed-off-by: Dimitar Dobrev --- src/CppParser/Bindings/ParserGen.cs | 3 +-- src/Generator/AST/Utils.cs | 3 --- src/Generator/Generators/CLI/CLITypePrinter.cs | 14 ++++++++++++-- .../Generators/CSharp/CSharpTextTemplate.cs | 13 ++++--------- src/Generator/Options.cs | 1 - src/Generator/Passes/FindSymbolsPass.cs | 12 ++++++++++++ tests/CSharp/CSharp.cs | 1 - tests/Common/Common.cs | 1 - tests/TypeMaps/TypeMaps.cs | 1 - tests/VTables/VTables.cpp | 4 ++++ tests/VTables/VTables.h | 1 + 11 files changed, 34 insertions(+), 20 deletions(-) diff --git a/src/CppParser/Bindings/ParserGen.cs b/src/CppParser/Bindings/ParserGen.cs index ac655cfd..889ce7c5 100644 --- a/src/CppParser/Bindings/ParserGen.cs +++ b/src/CppParser/Bindings/ParserGen.cs @@ -53,8 +53,7 @@ namespace CppSharp options.Abi = Abi; options.LibraryName = "CppSharp.CppParser.dll"; options.GeneratorKind = Kind; - options.GenerateCopyConstructors = true; - options.Headers.AddRange(new string[] + options.Headers.AddRange(new[] { "AST.h", "Sources.h", diff --git a/src/Generator/AST/Utils.cs b/src/Generator/AST/Utils.cs index f44cb7fb..c839134b 100644 --- a/src/Generator/AST/Utils.cs +++ b/src/Generator/AST/Utils.cs @@ -41,9 +41,6 @@ namespace CppSharp.AST // Ignore copy constructor if a base class don't has or has a private copy constructor if (method.IsCopyConstructor) { - if (!options.GenerateCopyConstructors) - return true; - var baseClass = @class; while (baseClass != null && baseClass.HasBaseClass) { diff --git a/src/Generator/Generators/CLI/CLITypePrinter.cs b/src/Generator/Generators/CLI/CLITypePrinter.cs index e8cf6c83..1301fe3a 100644 --- a/src/Generator/Generators/CLI/CLITypePrinter.cs +++ b/src/Generator/Generators/CLI/CLITypePrinter.cs @@ -319,15 +319,25 @@ namespace CppSharp.Generators.CLI { var names = new List(); + string rootNamespace = null; if (Options.GenerateLibraryNamespace) - names.Add(Driver.Options.OutputNamespace); + names.Add(rootNamespace = Driver.Options.OutputNamespace); if (!string.IsNullOrEmpty(decl.Namespace.QualifiedName)) + { names.Add(decl.Namespace.QualifiedName); + if (string.IsNullOrEmpty(rootNamespace)) + rootNamespace = decl.Namespace.QualifiedName; + } names.Add(decl.Visit(this)); - return string.Join("::", names); + var result = string.Join("::", names); + var translationUnit = decl.Namespace as TranslationUnit; + if (translationUnit != null && translationUnit.HasFunctions && + rootNamespace == translationUnit.FileNameWithoutExtension) + return "::" + result; + return result; } public string VisitClassDecl(Class @class) diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs index 35804673..e944b27b 100644 --- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs +++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs @@ -553,7 +553,7 @@ namespace CppSharp.Generators.CSharp if (@class.IsStatic || ctor.IsMoveConstructor) continue; - if (!ctor.IsGenerated && !(Options.GenerateCopyConstructors && ctor.IsCopyConstructor)) + if (!ctor.IsGenerated) continue; if (ctor.IsDefaultConstructor && !@class.HasNonTrivialDefaultConstructor) @@ -1971,15 +1971,10 @@ namespace CppSharp.Generators.CSharp PushBlock(CSharpBlockKind.Method); WriteLine("private static {0}.Internal* __CopyValue({0}.Internal native)", className); WriteStartBraceIndent(); - if (@class.HasNonTrivialCopyConstructor && Options.GenerateCopyConstructors) + var copyCtorMethod = @class.Methods.FirstOrDefault(method => + method.IsCopyConstructor); + if (@class.HasNonTrivialCopyConstructor && copyCtorMethod != null && copyCtorMethod.IsGenerated) { - // Find a valid copy constructor overload. - var copyCtorMethod = @class.Methods.FirstOrDefault(method => - method.IsCopyConstructor); - - if (copyCtorMethod == null) - throw new NotSupportedException("Expected a valid copy constructor"); - // Allocate memory for a new native object and call the ctor. WriteLine("var ret = Marshal.AllocHGlobal({0});", @class.Layout.Size); WriteLine("{0}.Internal.{1}(ret, new global::System.IntPtr(&native));", diff --git a/src/Generator/Options.cs b/src/Generator/Options.cs index e26eb1e0..940f8b0a 100644 --- a/src/Generator/Options.cs +++ b/src/Generator/Options.cs @@ -96,7 +96,6 @@ namespace CppSharp public bool GenerateInternalImports; public bool GenerateClassMarshals; public bool GenerateInlines; - public bool GenerateCopyConstructors; public bool UseHeaderDirectories; /// diff --git a/src/Generator/Passes/FindSymbolsPass.cs b/src/Generator/Passes/FindSymbolsPass.cs index df445a89..2b7f7b3d 100644 --- a/src/Generator/Passes/FindSymbolsPass.cs +++ b/src/Generator/Passes/FindSymbolsPass.cs @@ -4,6 +4,18 @@ namespace CppSharp.Passes { public class FindSymbolsPass : TranslationUnitPass { + public FindSymbolsPass() + { + Options.VisitClassBases = false; + Options.VisitFunctionParameters = false; + Options.VisitFunctionReturnType = false; + Options.VisitNamespaceEnums = false; + Options.VisitNamespaceTemplates = false; + Options.VisitNamespaceTypedefs = false; + Options.VisitTemplateArguments = false; + Options.VisitClassFields = false; + } + public override bool VisitDeclaration(Declaration decl) { if (!base.VisitDeclaration(decl)) diff --git a/tests/CSharp/CSharp.cs b/tests/CSharp/CSharp.cs index 85ba1eb4..3a8ed4a4 100644 --- a/tests/CSharp/CSharp.cs +++ b/tests/CSharp/CSharp.cs @@ -128,7 +128,6 @@ namespace CppSharp.Tests { driver.Options.GenerateInterfacesForMultipleInheritance = true; driver.Options.GeneratePropertiesAdvanced = true; - driver.Options.GenerateCopyConstructors = true; // To ensure that calls to constructors in conversion operators // are not ambiguous with multiple inheritance pass enabled. driver.Options.GenerateConversionOperators = true; diff --git a/tests/Common/Common.cs b/tests/Common/Common.cs index e7a4c3ac..50c71d8d 100644 --- a/tests/Common/Common.cs +++ b/tests/Common/Common.cs @@ -23,7 +23,6 @@ namespace CppSharp.Tests public override void SetupPasses(Driver driver) { - driver.Options.GenerateCopyConstructors = true; driver.Options.MarshalCharAsManagedChar = true; driver.Options.GenerateProperties = true; driver.Options.GenerateConversionOperators = true; diff --git a/tests/TypeMaps/TypeMaps.cs b/tests/TypeMaps/TypeMaps.cs index 9f39bf51..00035a6d 100644 --- a/tests/TypeMaps/TypeMaps.cs +++ b/tests/TypeMaps/TypeMaps.cs @@ -15,7 +15,6 @@ namespace CppSharp.Tests public override void SetupPasses(Driver driver) { - driver.Options.GenerateCopyConstructors = true; driver.Options.MarshalCharAsManagedChar = true; driver.Options.GenerateProperties = true; driver.Options.GenerateConversionOperators = true; diff --git a/tests/VTables/VTables.cpp b/tests/VTables/VTables.cpp index 9d06b7fa..033d47ea 100644 --- a/tests/VTables/VTables.cpp +++ b/tests/VTables/VTables.cpp @@ -38,6 +38,10 @@ BaseClassVirtual::BaseClassVirtual() { } +BaseClassVirtual::BaseClassVirtual(const BaseClassVirtual& other) +{ +} + int BaseClassVirtual::virtualCallRetInt(BaseClassVirtual* base) { return base->retInt(); diff --git a/tests/VTables/VTables.h b/tests/VTables/VTables.h index 06100346..06f35b5f 100644 --- a/tests/VTables/VTables.h +++ b/tests/VTables/VTables.h @@ -23,6 +23,7 @@ class DLL_API BaseClassVirtual { public: BaseClassVirtual(); + BaseClassVirtual(const BaseClassVirtual& other); static int virtualCallRetInt(BaseClassVirtual* base); virtual int retInt(); static BaseClassVirtual getBase();