diff --git a/examples/SDL/SDL.cs b/examples/SDL/SDL.cs index 63c75cbc..08da1d0e 100644 --- a/examples/SDL/SDL.cs +++ b/examples/SDL/SDL.cs @@ -9,11 +9,12 @@ namespace CppSharp { public void Setup(Driver driver) { + var parserOptions = driver.ParserOptions; var options = driver.Options; options.LibraryName = "SDL"; options.Headers.Add("SDL.h"); var sdlPath = Path.Combine(GetExamplesDirectory("SDL"), "SDL-2.0/include"); - options.addIncludeDirs(sdlPath); + parserOptions.addIncludeDirs(sdlPath); options.OutputDir = "SDL"; } diff --git a/src/Core/Platform.cs b/src/Core/Platform.cs index 05c40ae8..8653b2c1 100644 --- a/src/Core/Platform.cs +++ b/src/Core/Platform.cs @@ -57,5 +57,14 @@ namespace CppSharp { get { return Type.GetType("Mono.Runtime") != null; } } + + public static bool IsUnixPlatform + { + get + { + var platform = Environment.OSVersion.Platform; + return platform == PlatformID.Unix || platform == PlatformID.MacOSX; + } + } } } diff --git a/src/CppParser/ParserGen/ParserGen.cs b/src/CppParser/ParserGen/ParserGen.cs index 231c9c3b..8fcaa12e 100644 --- a/src/CppParser/ParserGen/ParserGen.cs +++ b/src/CppParser/ParserGen/ParserGen.cs @@ -7,6 +7,7 @@ using CppSharp.Generators; using CppSharp.Passes; using CppSharp.Types; using CppAbi = CppSharp.Parser.AST.CppAbi; +using CppSharp.Parser; namespace CppSharp { @@ -49,9 +50,11 @@ namespace CppSharp public void Setup(Driver driver) { + var parserOptions = driver.ParserOptions; + parserOptions.TargetTriple = Triple; + parserOptions.Abi = Abi; + var options = driver.Options; - options.TargetTriple = Triple; - options.Abi = Abi; options.LibraryName = "CppSharp.CppParser"; options.SharedLibraryName = "CppSharp.CppParser.dll"; options.GeneratorKind = Kind; @@ -64,17 +67,17 @@ namespace CppSharp options.Libraries.Add("CppSharp.CppParser.lib"); if (Abi == CppAbi.Microsoft) - options.MicrosoftMode = true; + parserOptions.MicrosoftMode = true; if (Triple.Contains("apple")) - SetupMacOptions(options); + SetupMacOptions(parserOptions); if (Triple.Contains("linux")) - SetupLinuxOptions(options); + SetupLinuxOptions(parserOptions); var basePath = Path.Combine(GetSourceDirectory("src"), "CppParser"); - options.addIncludeDirs(basePath); - options.addLibraryDirs("."); + parserOptions.addIncludeDirs(basePath); + parserOptions.addLibraryDirs("."); options.OutputDir = Path.Combine(GetSourceDirectory("src"), "CppParser", "Bindings", Kind.ToString()); @@ -82,15 +85,15 @@ namespace CppSharp var extraTriple = IsGnuCpp11Abi ? "-cxx11abi" : string.Empty; if (Kind == GeneratorKind.CSharp) - options.OutputDir = Path.Combine(options.OutputDir, options.TargetTriple + extraTriple); + options.OutputDir = Path.Combine(options.OutputDir, parserOptions.TargetTriple + extraTriple); options.OutputNamespace = string.Empty; options.CheckSymbols = false; - options.Verbose = true; + //options.Verbose = true; options.UnityBuild = true; } - private void SetupLinuxOptions(DriverOptions options) + private void SetupLinuxOptions(ParserOptions options) { options.MicrosoftMode = false; options.NoBuiltinIncludes = true; @@ -124,7 +127,7 @@ namespace CppSharp options.addDefines("_GLIBCXX_USE_CXX11_ABI=" + (IsGnuCpp11Abi ? "1" : "0")); } - private static void SetupMacOptions(DriverOptions options) + private static void SetupMacOptions(ParserOptions options) { options.MicrosoftMode = false; options.NoBuiltinIncludes = true; diff --git a/src/CppParser/ParserGen/premake5.lua b/src/CppParser/ParserGen/premake5.lua index f8e6e3ae..197faf02 100644 --- a/src/CppParser/ParserGen/premake5.lua +++ b/src/CppParser/ParserGen/premake5.lua @@ -6,6 +6,13 @@ project "CppSharp.Parser.Gen" debugdir "." files { "ParserGen.cs", "*.lua" } - links { "CppSharp", "CppSharp.AST", "CppSharp.Generator", "System.Core" } + links + { + "CppSharp", + "CppSharp.AST", + "CppSharp.Generator", + "CppSharp.Parser", + "System.Core" + } SetupParser() \ No newline at end of file diff --git a/src/Generator.Tests/ASTTestFixture.cs b/src/Generator.Tests/ASTTestFixture.cs index a768e9e6..fe830c40 100644 --- a/src/Generator.Tests/ASTTestFixture.cs +++ b/src/Generator.Tests/ASTTestFixture.cs @@ -1,6 +1,7 @@ using System; using CppSharp.AST; using CppSharp.Utils; +using CppSharp.Parser; namespace CppSharp.Generator.Tests { @@ -8,18 +9,24 @@ namespace CppSharp.Generator.Tests { protected Driver Driver; protected DriverOptions Options; + protected ParserOptions2 ParserOptions; protected ASTContext AstContext; protected void ParseLibrary(params string[] files) { Options = new DriverOptions(); + ParserOptions = new ParserOptions2(); var testsPath = GeneratorTest.GetTestsDirectory("Native"); - Options.addIncludeDirs(testsPath); + ParserOptions.addIncludeDirs(testsPath); Options.Headers.AddRange(files); - Driver = new Driver(Options, new TextDiagnosticPrinter()); + Driver = new Driver(Options, new TextDiagnosticPrinter()) + { + ParserOptions = this.ParserOptions + }; + foreach (var module in Driver.Options.Modules) module.LibraryName = "Test"; Driver.Setup(); diff --git a/src/Generator.Tests/GeneratorTest.cs b/src/Generator.Tests/GeneratorTest.cs index 0a6177b2..95938bab 100644 --- a/src/Generator.Tests/GeneratorTest.cs +++ b/src/Generator.Tests/GeneratorTest.cs @@ -41,11 +41,12 @@ namespace CppSharp.Utils if (!Platform.IsMono) options.SharedLibraryName += ".dll"; + var parserOptions = driver.ParserOptions; if (Platform.IsMacOS) - options.TargetTriple = Environment.Is64BitProcess ? "x86_64-apple-darwin" : "i686-apple-darwin"; + parserOptions.TargetTriple = Environment.Is64BitProcess ? "x86_64-apple-darwin" : "i686-apple-darwin"; var path = Path.GetFullPath(GetTestsDirectory(name)); - options.addIncludeDirs(path); + parserOptions.addIncludeDirs(path); driver.Diagnostics.Message("Looking for tests in: {0}", path); var files = Directory.EnumerateFiles(path, "*.h"); diff --git a/src/Generator.Tests/ReadNativeDependenciesTest.cs b/src/Generator.Tests/ReadNativeDependenciesTest.cs index b7b1242b..de7b60d9 100644 --- a/src/Generator.Tests/ReadNativeDependenciesTest.cs +++ b/src/Generator.Tests/ReadNativeDependenciesTest.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using CppSharp.Utils; using NUnit.Framework; +using CppSharp.Parser; namespace CppSharp.Generator.Tests { @@ -37,10 +38,14 @@ namespace CppSharp.Generator.Tests private static IList GetDependencies(string library) { + var parserOptions = new ParserOptions2(); + parserOptions.addLibraryDirs(GeneratorTest.GetTestsDirectory("Native")); var driverOptions = new DriverOptions(); - driverOptions.addLibraryDirs(GeneratorTest.GetTestsDirectory("Native")); driverOptions.Libraries.Add(library); - var driver = new Driver(driverOptions, new TextDiagnosticPrinter()); + var driver = new Driver(driverOptions, new TextDiagnosticPrinter()) + { + ParserOptions = parserOptions + }; foreach (var module in driver.Options.Modules) module.LibraryName = "Test"; driver.Setup(); diff --git a/src/Generator.Tests/premake5.lua b/src/Generator.Tests/premake5.lua index f8660fc6..2d50f25f 100644 --- a/src/Generator.Tests/premake5.lua +++ b/src/Generator.Tests/premake5.lua @@ -20,6 +20,7 @@ project "CppSharp.Generator.Tests" "CppSharp", "CppSharp.AST", "CppSharp.Generator", + "CppSharp.Parser", "nunit.framework", "NSubstitute" } diff --git a/src/Generator/BindingContext.cs b/src/Generator/BindingContext.cs index 4b8bf4f1..bba50e9c 100644 --- a/src/Generator/BindingContext.cs +++ b/src/Generator/BindingContext.cs @@ -1,10 +1,7 @@ using CppSharp.AST; -using CppSharp.Generators.CLI; -using CppSharp.Generators.CSharp; using CppSharp.Passes; using CppSharp.Types; using CppSharp.Parser; -using CppSharp.Utils; using System.Collections.Generic; namespace CppSharp.Generators @@ -12,7 +9,9 @@ namespace CppSharp.Generators public class BindingContext { public IDiagnostics Diagnostics { get; set; } + public DriverOptions Options { get; private set; } + public ParserOptions2 ParserOptions { get; set; } public ASTContext ASTContext { get; set; } public ParserTargetInfo TargetInfo { get; set; } diff --git a/src/Generator/Driver.cs b/src/Generator/Driver.cs index b3134e2b..bf40b74f 100644 --- a/src/Generator/Driver.cs +++ b/src/Generator/Driver.cs @@ -22,6 +22,7 @@ namespace CppSharp { public IDiagnostics Diagnostics { get; private set; } public DriverOptions Options { get; private set; } + public ParserOptions2 ParserOptions { get; set; } public Project Project { get; private set; } public BindingContext Context { get; private set; } public Generator Generator { get; private set; } @@ -33,6 +34,7 @@ namespace CppSharp Options = options; Diagnostics = diagnostics; Project = new Project(); + ParserOptions = new ParserOptions2(); } Generator CreateGeneratorFromKind(GeneratorKind kind) @@ -48,9 +50,9 @@ namespace CppSharp return null; } - static void ValidateOptions(DriverOptions options) + void ValidateOptions() { - foreach (var module in options.Modules) + foreach (var module in Options.Modules) { if (string.IsNullOrWhiteSpace(module.LibraryName)) throw new InvalidOptionException("One of your modules has no library name."); @@ -59,24 +61,25 @@ namespace CppSharp module.OutputNamespace = module.LibraryName; } - if (options.NoGenIncludeDirs != null) - foreach (var incDir in options.NoGenIncludeDirs) - options.addIncludeDirs(incDir); + if (Options.NoGenIncludeDirs != null) + foreach (var incDir in Options.NoGenIncludeDirs) + ParserOptions.addIncludeDirs(incDir); } public void SetupIncludes() { if (Platform.IsMacOS) - Options.SetupXcode(); - else if (Platform.IsWindows && !Options.NoBuiltinIncludes) - Options.SetupMSVC(); + ParserOptions.SetupXcode(); + else if (Platform.IsWindows && !ParserOptions.NoBuiltinIncludes) + ParserOptions.SetupMSVC(); } public void Setup() { - ValidateOptions(Options); + ValidateOptions(); SetupIncludes(); Context = new BindingContext(Diagnostics, Options); + Context.ParserOptions = ParserOptions; Generator = CreateGeneratorFromKind(Options.GeneratorKind); } @@ -127,14 +130,14 @@ namespace CppSharp { var options = new ParserOptions { - Abi = Options.Abi, - ToolSetToUse = Options.ToolSetToUse, - TargetTriple = Options.TargetTriple, - NoStandardIncludes = Options.NoStandardIncludes, - NoBuiltinIncludes = Options.NoBuiltinIncludes, - MicrosoftMode = Options.MicrosoftMode, - Verbose = Options.Verbose, - LanguageVersion = Options.LanguageVersion + Abi = ParserOptions.Abi, + ToolSetToUse = ParserOptions.ToolSetToUse, + TargetTriple = ParserOptions.TargetTriple, + NoStandardIncludes = ParserOptions.NoStandardIncludes, + NoBuiltinIncludes = ParserOptions.NoBuiltinIncludes, + MicrosoftMode = ParserOptions.MicrosoftMode, + Verbose = ParserOptions.Verbose, + LanguageVersion = ParserOptions.LanguageVersion }; // This eventually gets passed to Clang's MSCompatibilityVersion, which @@ -143,42 +146,42 @@ namespace CppSharp // version MSVC digit, so check if we still have the old version and // convert to the right format. - if (Options.ToolSetToUse.ToString(CultureInfo.InvariantCulture).Length == 4) - Options.ToolSetToUse *= 100000; + if (ParserOptions.ToolSetToUse.ToString(CultureInfo.InvariantCulture).Length == 4) + ParserOptions.ToolSetToUse *= 100000; - for (uint i = 0; i < Options.ArgumentsCount; ++i) + for (uint i = 0; i < ParserOptions.ArgumentsCount; ++i) { - var arg = Options.getArguments(i); + var arg = ParserOptions.getArguments(i); options.addArguments(arg); } - for (uint i = 0; i < Options.IncludeDirsCount; ++i) + for (uint i = 0; i < ParserOptions.IncludeDirsCount; ++i) { - var include = Options.getIncludeDirs(i); + var include = ParserOptions.getIncludeDirs(i); options.addIncludeDirs(include); } - for (uint i = 0; i < Options.SystemIncludeDirsCount; ++i) + for (uint i = 0; i < ParserOptions.SystemIncludeDirsCount; ++i) { - var include = Options.getSystemIncludeDirs(i); + var include = ParserOptions.getSystemIncludeDirs(i); options.addSystemIncludeDirs(include); } - for (uint i = 0; i < Options.DefinesCount; ++i) + for (uint i = 0; i < ParserOptions.DefinesCount; ++i) { - var define = Options.getDefines(i); + var define = ParserOptions.getDefines(i); options.addDefines(define); } - for (uint i = 0; i < Options.UndefinesCount; ++i) + for (uint i = 0; i < ParserOptions.UndefinesCount; ++i) { - var define = Options.getUndefines(i); + var define = ParserOptions.getUndefines(i); options.addUndefines(define); } - for (uint i = 0; i < Options.LibraryDirsCount; ++i) + for (uint i = 0; i < ParserOptions.LibraryDirsCount; ++i) { - var lib = Options.getLibraryDirs(i); + var lib = ParserOptions.getLibraryDirs(i); options.addLibraryDirs(lib); } @@ -208,7 +211,7 @@ namespace CppSharp parser.SourcesParsed += OnSourceFileParsed; parser.ParseProject(Project, Options.UnityBuild); - Context.TargetInfo = parser.GetTargetInfo(Options); + Context.TargetInfo = parser.GetTargetInfo(ParserOptions); Context.ASTContext = ClangParser.ConvertASTContext(parser.ASTContext); return !hasParsingErrors; @@ -248,7 +251,7 @@ namespace CppSharp foreach (var module in Options.Modules) { foreach (var libraryDir in module.LibraryDirs) - Options.addLibraryDirs(libraryDir); + ParserOptions.addLibraryDirs(libraryDir); foreach (var library in module.Libraries) { @@ -258,7 +261,7 @@ namespace CppSharp var parser = new ClangParser(); parser.LibraryParsed += OnFileParsed; - using (var res = parser.ParseLibrary(library, Options)) + using (var res = parser.ParseLibrary(library, ParserOptions)) { if (res.Kind != ParserResultKind.Success) continue; @@ -482,7 +485,7 @@ namespace CppSharp driver.Setup(); - if(driver.Options.Verbose) + if(driver.ParserOptions.Verbose) Log.Level = DiagnosticKind.Debug; if (!options.Quiet) diff --git a/src/Generator/Generators/CSharp/CSharpSources.cs b/src/Generator/Generators/CSharp/CSharpSources.cs index eb8eb707..4c651a2f 100644 --- a/src/Generator/Generators/CSharp/CSharpSources.cs +++ b/src/Generator/Generators/CSharp/CSharpSources.cs @@ -672,7 +672,7 @@ namespace CppSharp.Generators.CSharp retType = function.ReturnType.CSharpType(TypePrinter); - var @params = function.GatherInternalParams(Context.Options.IsItaniumLikeAbi).Select(p => + var @params = function.GatherInternalParams(Context.ParserOptions.IsItaniumLikeAbi).Select(p => string.Format("{0} {1}", p.CSharpType(TypePrinter), p.Name)).ToList(); TypePrinter.PopContext(); @@ -1486,7 +1486,7 @@ namespace CppSharp.Generators.CSharp private void AllocateNewVTables(Class @class, IList wrappedEntries, bool destructorOnly) { - if (Options.IsMicrosoftAbi) + if (Context.ParserOptions.IsMicrosoftAbi) AllocateNewVTablesMS(@class, wrappedEntries, destructorOnly); else AllocateNewVTablesItanium(@class, wrappedEntries, destructorOnly); @@ -1495,7 +1495,7 @@ namespace CppSharp.Generators.CSharp private void SaveOriginalVTablePointers(Class @class) { var suffix = Helpers.GetSuffixForInternal(@class); - if (Context.Options.IsMicrosoftAbi) + if (Context.ParserOptions.IsMicrosoftAbi) WriteLine("__OriginalVTables = new void*[] {{ {0} }};", string.Join(", ", @class.Layout.VTablePointers.Select(v => string.Format( @@ -1564,7 +1564,7 @@ namespace CppSharp.Generators.CSharp { var entry = entries[i]; var offset = pointerSize - * (i - (Options.IsMicrosoftAbi ? 0 : VTables.ItaniumOffsetToTopAndRTTI)); + * (i - (Context.ParserOptions.IsMicrosoftAbi ? 0 : VTables.ItaniumOffsetToTopAndRTTI)); var nativeVftableEntry = string.Format("*(void**)(native->{0} + {1})", vptr, offset); var managedVftableEntry = string.Format("*(void**)(vfptr{0} + {1})", tableIndex, offset); @@ -1953,7 +1953,7 @@ namespace CppSharp.Generators.CSharp var suffix = Helpers.GetSuffixForInternal(@class); if (@class.IsDynamic && GetUniqueVTableMethodEntries(@class).Count != 0) { - if (Options.IsMicrosoftAbi) + if (Context.ParserOptions.IsMicrosoftAbi) for (var i = 0; i < @class.Layout.VTablePointers.Count; i++) WriteLine("((Internal{0}*) {1})->{2} = new global::System.IntPtr(__OriginalVTables[{3}]);", suffix, Helpers.InstanceIdentifier, @@ -2816,7 +2816,7 @@ namespace CppSharp.Generators.CSharp private int GetInstanceParamIndex(Function method) { - if (Options.IsMicrosoftAbi) + if (Context.ParserOptions.IsMicrosoftAbi) return 0; var indirectReturnType = method.Parameters.FirstOrDefault( @@ -3161,9 +3161,9 @@ namespace CppSharp.Generators.CSharp if (Platform.IsMacOS) { var framework = libName + ".framework"; - for (uint i = 0; i < Context.Options.LibraryDirsCount; i++) + for (uint i = 0; i < Context.ParserOptions.LibraryDirsCount; i++) { - var libDir = Context.Options.getLibraryDirs(i); + var libDir = Context.ParserOptions.getLibraryDirs(i); if (Path.GetFileName(libDir) == framework && File.Exists(Path.Combine(libDir, libName))) { libName = string.Format("@executable_path/../Frameworks/{0}/{1}", framework, libName); diff --git a/src/Generator/Options.cs b/src/Generator/Options.cs index 7a9dd3eb..d2f909bc 100644 --- a/src/Generator/Options.cs +++ b/src/Generator/Options.cs @@ -4,27 +4,13 @@ using System.IO; using System.Text; using CppSharp.AST; using CppSharp.Generators; -using CppSharp.Parser; -using CppAbi = CppSharp.Parser.AST.CppAbi; namespace CppSharp { - public class DriverOptions : ParserOptions + public class DriverOptions { - public static bool IsUnixPlatform - { - get - { - var platform = Environment.OSVersion.Platform; - return platform == PlatformID.Unix || platform == PlatformID.MacOSX; - } - } - public DriverOptions() { - Abi = IsUnixPlatform ? CppAbi.Itanium : CppAbi.Microsoft; - MicrosoftMode = !IsUnixPlatform; - OutputDir = Directory.GetCurrentDirectory(); SystemModule = new Module { OutputNamespace = string.Empty, LibraryName = "Std" }; @@ -75,9 +61,6 @@ namespace CppSharp public bool IgnoreParseWarnings; public bool IgnoreParseErrors; - public bool IsItaniumLikeAbi { get { return Abi != CppAbi.Microsoft; } } - public bool IsMicrosoftAbi { get { return Abi == CppAbi.Microsoft; } } - // Library options public List Libraries { get { return MainModule.Libraries; } } public bool CheckSymbols; diff --git a/src/Generator/Passes/CheckAbiParameters.cs b/src/Generator/Passes/CheckAbiParameters.cs index 8242b3a0..54a3f866 100644 --- a/src/Generator/Passes/CheckAbiParameters.cs +++ b/src/Generator/Passes/CheckAbiParameters.cs @@ -67,7 +67,7 @@ namespace CppSharp.Passes // Deleting destructors (default in v-table) accept an i32 bitfield as a // second parameter.in MS ABI. - if (method != null && method.IsDestructor && Options.IsMicrosoftAbi) + if (method != null && method.IsDestructor && Context.ParserOptions.IsMicrosoftAbi) { method.Parameters.Add(new Parameter { diff --git a/src/Generator/Passes/CleanUnitPass.cs b/src/Generator/Passes/CleanUnitPass.cs index bd8fd036..72830216 100644 --- a/src/Generator/Passes/CleanUnitPass.cs +++ b/src/Generator/Passes/CleanUnitPass.cs @@ -38,9 +38,9 @@ namespace CppSharp.Passes var includePath = filePath; var shortestIncludePath = filePath; - for (uint i = 0; i < Options.IncludeDirsCount; ++i) + for (uint i = 0; i < Context.ParserOptions.IncludeDirsCount; ++i) { - var path = Options.getIncludeDirs(i); + var path = Context.ParserOptions.getIncludeDirs(i); int idx = filePath.IndexOf(path, System.StringComparison.Ordinal); if (idx == -1) diff --git a/src/Generator/Passes/DelegatesPass.cs b/src/Generator/Passes/DelegatesPass.cs index 3f90dc3b..9a8dc279 100644 --- a/src/Generator/Passes/DelegatesPass.cs +++ b/src/Generator/Passes/DelegatesPass.cs @@ -61,7 +61,7 @@ namespace CppSharp.Passes // dependent types with virtuals have no own virtual layouts // so virtuals are considered different objects in template instantiations // therefore the method itself won't be visited, so let's visit it through the v-table - if (Options.IsMicrosoftAbi) + if (Context.ParserOptions.IsMicrosoftAbi) { foreach (var method in from vfTable in @class.Layout.VFTables from component in vfTable.Layout.Components @@ -88,7 +88,7 @@ namespace CppSharp.Passes if (!base.VisitMethodDecl(method) || !method.IsVirtual || method.Ignore) return false; - var @params = method.GatherInternalParams(Options.IsItaniumLikeAbi, true).ToList(); + var @params = method.GatherInternalParams(Context.ParserOptions.IsItaniumLikeAbi, true).ToList(); var delegateName = GenerateDelegateSignature(@params, method.ReturnType); var module = method.TranslationUnit.Module; diff --git a/src/Parser/ParserOptions.cs b/src/Parser/ParserOptions.cs new file mode 100644 index 00000000..0ad35423 --- /dev/null +++ b/src/Parser/ParserOptions.cs @@ -0,0 +1,16 @@ +using CppSharp.Parser.AST; + +namespace CppSharp.Parser +{ + public class ParserOptions2 : ParserOptions + { + public ParserOptions2() + { + Abi = Platform.IsUnixPlatform ? CppAbi.Itanium : CppAbi.Microsoft; + MicrosoftMode = !Platform.IsUnixPlatform; + } + + public bool IsItaniumLikeAbi { get { return Abi != CppAbi.Microsoft; } } + public bool IsMicrosoftAbi { get { return Abi == CppAbi.Microsoft; } } + } +}