diff --git a/src/Generator/Driver.cs b/src/Generator/Driver.cs index 548e8fa2..4e9ffdc2 100644 --- a/src/Generator/Driver.cs +++ b/src/Generator/Driver.cs @@ -115,84 +115,6 @@ namespace CppSharp } } - public ParserOptions BuildParserOptions(string file = null) - { - var options = new ParserOptions - { - 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 - // is in turn used to derive the value of the built-in define _MSC_VER. - // It used to receive a 4-digit based identifier but now expects a full - // version MSVC digit, so check if we still have the old version and - // convert to the right format. - - if (ParserOptions.ToolSetToUse.ToString(CultureInfo.InvariantCulture).Length == 4) - ParserOptions.ToolSetToUse *= 100000; - - for (uint i = 0; i < ParserOptions.ArgumentsCount; ++i) - { - var arg = ParserOptions.GetArguments(i); - options.AddArguments(arg); - } - - for (uint i = 0; i < ParserOptions.IncludeDirsCount; ++i) - { - var include = ParserOptions.GetIncludeDirs(i); - options.AddIncludeDirs(include); - } - - for (uint i = 0; i < ParserOptions.SystemIncludeDirsCount; ++i) - { - var include = ParserOptions.GetSystemIncludeDirs(i); - options.AddSystemIncludeDirs(include); - } - - for (uint i = 0; i < ParserOptions.DefinesCount; ++i) - { - var define = ParserOptions.GetDefines(i); - options.AddDefines(define); - } - - for (uint i = 0; i < ParserOptions.UndefinesCount; ++i) - { - var define = ParserOptions.GetUndefines(i); - options.AddUndefines(define); - } - - for (uint i = 0; i < ParserOptions.LibraryDirsCount; ++i) - { - var lib = ParserOptions.GetLibraryDirs(i); - options.AddLibraryDirs(lib); - } - - foreach (var module in Options.Modules.Where( - m => file == null || m.Headers.Contains(file))) - { - foreach (var include in module.IncludeDirs) - options.AddIncludeDirs(include); - - foreach (var define in module.Defines) - options.AddDefines(define); - - foreach (var undefine in module.Undefines) - options.AddUndefines(undefine); - - foreach (var libraryDir in module.LibraryDirs) - options.AddLibraryDirs(libraryDir); - } - - return options; - } - public bool ParseCode() { var astContext = new Parser.AST.ASTContext(); @@ -204,7 +126,7 @@ namespace CppSharp if (Options.UnityBuild) { - var parserOptions = BuildParserOptions(); + var parserOptions = ParserOptions.BuildForSourceFile(Options.Modules); var result = parser.ParseSourceFiles(sourceFiles, parserOptions); result.Dispose(); } @@ -214,7 +136,8 @@ namespace CppSharp foreach (var sourceFile in sourceFiles) { - var parserOptions = BuildParserOptions(sourceFile); + var parserOptions = ParserOptions.BuildForSourceFile( + Options.Modules, sourceFile); results.Add(parser.ParseSourceFile(sourceFile, parserOptions)); } diff --git a/src/Parser/ParserOptions.cs b/src/Parser/ParserOptions.cs index 19efa455..fb0110cb 100644 --- a/src/Parser/ParserOptions.cs +++ b/src/Parser/ParserOptions.cs @@ -1,6 +1,9 @@ using CppSharp.Parser.AST; using System.Reflection; using LanguageVersion = CppSharp.Parser.LanguageVersion; +using System.Globalization; +using System.Collections.Generic; +using System.Linq; namespace CppSharp.Parser { @@ -46,7 +49,7 @@ namespace CppSharp.Parser /// C++ programming language (year 2017, GNU variant). /// </summary> CPP17_GNU, - }; + } public class ParserOptions : CppParserOptions { @@ -63,9 +66,88 @@ namespace CppSharp.Parser public bool EnableRTTI { get; set; } public LanguageVersion? LanguageVersion { get; set; } + public ParserOptions BuildForSourceFile( + IEnumerable<CppSharp.AST.Module> modules, string file = null) + { + var options = new ParserOptions + { + Abi = this.Abi, + ToolSetToUse = this.ToolSetToUse, + TargetTriple = this.TargetTriple, + NoStandardIncludes = this.NoStandardIncludes, + NoBuiltinIncludes = this.NoBuiltinIncludes, + MicrosoftMode = this.MicrosoftMode, + Verbose = this.Verbose, + LanguageVersion = this.LanguageVersion + }; + + // This eventually gets passed to Clang's MSCompatibilityVersion, which + // is in turn used to derive the value of the built-in define _MSC_VER. + // It used to receive a 4-digit based identifier but now expects a full + // version MSVC digit, so check if we still have the old version and + // convert to the right format. + + if (ToolSetToUse.ToString(CultureInfo.InvariantCulture).Length == 4) + ToolSetToUse *= 100000; + + for (uint i = 0; i < ArgumentsCount; ++i) + { + var arg = GetArguments(i); + options.AddArguments(arg); + } + + for (uint i = 0; i < IncludeDirsCount; ++i) + { + var include = GetIncludeDirs(i); + options.AddIncludeDirs(include); + } + + for (uint i = 0; i < SystemIncludeDirsCount; ++i) + { + var include = GetSystemIncludeDirs(i); + options.AddSystemIncludeDirs(include); + } + + for (uint i = 0; i < DefinesCount; ++i) + { + var define = GetDefines(i); + options.AddDefines(define); + } + + for (uint i = 0; i < UndefinesCount; ++i) + { + var define = GetUndefines(i); + options.AddUndefines(define); + } + + for (uint i = 0; i < LibraryDirsCount; ++i) + { + var lib = GetLibraryDirs(i); + options.AddLibraryDirs(lib); + } + + foreach (var module in modules.Where( + m => file == null || m.Headers.Contains(file))) + { + foreach (var include in module.IncludeDirs) + options.AddIncludeDirs(include); + + foreach (var define in module.Defines) + options.AddDefines(define); + + foreach (var undefine in module.Undefines) + options.AddUndefines(undefine); + + foreach (var libraryDir in module.LibraryDirs) + options.AddLibraryDirs(libraryDir); + } + + return options; + } + public void SetupMSVC() { - VisualStudioVersion vsVersion = VisualStudioVersion.Latest; + var vsVersion = VisualStudioVersion.Latest; // Silence "warning CS0162: Unreachable code detected" #pragma warning disable 162 @@ -107,6 +189,7 @@ namespace CppSharp.Parser foreach (var include in MSVCToolchain.GetSystemIncludes(vsVersion)) AddSystemIncludeDirs(include); + // do not remove the CppSharp prefix becase the Mono C# compiler breaks if (!LanguageVersion.HasValue) LanguageVersion = CppSharp.Parser.LanguageVersion.CPP14_GNU; @@ -145,6 +228,7 @@ namespace CppSharp.Parser private void SetupArguments() { + // do not remove the CppSharp prefix becase the Mono C# compiler breaks if (!LanguageVersion.HasValue) LanguageVersion = CppSharp.Parser.LanguageVersion.CPP14_GNU;