Browse Source

Moved the method for building parser options specific to a file.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1005/head
Dimitar Dobrev 8 years ago
parent
commit
5e17200af8
  1. 83
      src/Generator/Driver.cs
  2. 88
      src/Parser/ParserOptions.cs

83
src/Generator/Driver.cs

@ -115,84 +115,6 @@ namespace CppSharp @@ -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 @@ -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 @@ -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));
}

88
src/Parser/ParserOptions.cs

@ -1,6 +1,9 @@ @@ -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 @@ -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 @@ -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 @@ -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 @@ -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;

Loading…
Cancel
Save