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 9 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
} }
} }
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() public bool ParseCode()
{ {
var astContext = new Parser.AST.ASTContext(); var astContext = new Parser.AST.ASTContext();
@ -204,7 +126,7 @@ namespace CppSharp
if (Options.UnityBuild) if (Options.UnityBuild)
{ {
var parserOptions = BuildParserOptions(); var parserOptions = ParserOptions.BuildForSourceFile(Options.Modules);
var result = parser.ParseSourceFiles(sourceFiles, parserOptions); var result = parser.ParseSourceFiles(sourceFiles, parserOptions);
result.Dispose(); result.Dispose();
} }
@ -214,7 +136,8 @@ namespace CppSharp
foreach (var sourceFile in sourceFiles) foreach (var sourceFile in sourceFiles)
{ {
var parserOptions = BuildParserOptions(sourceFile); var parserOptions = ParserOptions.BuildForSourceFile(
Options.Modules, sourceFile);
results.Add(parser.ParseSourceFile(sourceFile, parserOptions)); results.Add(parser.ParseSourceFile(sourceFile, parserOptions));
} }

88
src/Parser/ParserOptions.cs

@ -1,6 +1,9 @@
using CppSharp.Parser.AST; using CppSharp.Parser.AST;
using System.Reflection; using System.Reflection;
using LanguageVersion = CppSharp.Parser.LanguageVersion; using LanguageVersion = CppSharp.Parser.LanguageVersion;
using System.Globalization;
using System.Collections.Generic;
using System.Linq;
namespace CppSharp.Parser namespace CppSharp.Parser
{ {
@ -46,7 +49,7 @@ namespace CppSharp.Parser
/// C++ programming language (year 2017, GNU variant). /// C++ programming language (year 2017, GNU variant).
/// </summary> /// </summary>
CPP17_GNU, CPP17_GNU,
}; }
public class ParserOptions : CppParserOptions public class ParserOptions : CppParserOptions
{ {
@ -63,9 +66,88 @@ namespace CppSharp.Parser
public bool EnableRTTI { get; set; } public bool EnableRTTI { get; set; }
public LanguageVersion? LanguageVersion { 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() public void SetupMSVC()
{ {
VisualStudioVersion vsVersion = VisualStudioVersion.Latest; var vsVersion = VisualStudioVersion.Latest;
// Silence "warning CS0162: Unreachable code detected" // Silence "warning CS0162: Unreachable code detected"
#pragma warning disable 162 #pragma warning disable 162
@ -107,6 +189,7 @@ namespace CppSharp.Parser
foreach (var include in MSVCToolchain.GetSystemIncludes(vsVersion)) foreach (var include in MSVCToolchain.GetSystemIncludes(vsVersion))
AddSystemIncludeDirs(include); AddSystemIncludeDirs(include);
// do not remove the CppSharp prefix becase the Mono C# compiler breaks
if (!LanguageVersion.HasValue) if (!LanguageVersion.HasValue)
LanguageVersion = CppSharp.Parser.LanguageVersion.CPP14_GNU; LanguageVersion = CppSharp.Parser.LanguageVersion.CPP14_GNU;
@ -145,6 +228,7 @@ namespace CppSharp.Parser
private void SetupArguments() private void SetupArguments()
{ {
// do not remove the CppSharp prefix becase the Mono C# compiler breaks
if (!LanguageVersion.HasValue) if (!LanguageVersion.HasValue)
LanguageVersion = CppSharp.Parser.LanguageVersion.CPP14_GNU; LanguageVersion = CppSharp.Parser.LanguageVersion.CPP14_GNU;

Loading…
Cancel
Save