Skip to content

Commit 5e17200

Browse files
committed
Moved the method for building parser options specific to a file.
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent af8a758 commit 5e17200

File tree

2 files changed

+89
-82
lines changed

2 files changed

+89
-82
lines changed

src/Generator/Driver.cs

Lines changed: 3 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -115,84 +115,6 @@ void OnFileParsed(IEnumerable<string> files, ParserResult result)
115115
}
116116
}
117117

118-
public ParserOptions BuildParserOptions(string file = null)
119-
{
120-
var options = new ParserOptions
121-
{
122-
Abi = ParserOptions.Abi,
123-
ToolSetToUse = ParserOptions.ToolSetToUse,
124-
TargetTriple = ParserOptions.TargetTriple,
125-
NoStandardIncludes = ParserOptions.NoStandardIncludes,
126-
NoBuiltinIncludes = ParserOptions.NoBuiltinIncludes,
127-
MicrosoftMode = ParserOptions.MicrosoftMode,
128-
Verbose = ParserOptions.Verbose,
129-
LanguageVersion = ParserOptions.LanguageVersion
130-
};
131-
132-
// This eventually gets passed to Clang's MSCompatibilityVersion, which
133-
// is in turn used to derive the value of the built-in define _MSC_VER.
134-
// It used to receive a 4-digit based identifier but now expects a full
135-
// version MSVC digit, so check if we still have the old version and
136-
// convert to the right format.
137-
138-
if (ParserOptions.ToolSetToUse.ToString(CultureInfo.InvariantCulture).Length == 4)
139-
ParserOptions.ToolSetToUse *= 100000;
140-
141-
for (uint i = 0; i < ParserOptions.ArgumentsCount; ++i)
142-
{
143-
var arg = ParserOptions.GetArguments(i);
144-
options.AddArguments(arg);
145-
}
146-
147-
for (uint i = 0; i < ParserOptions.IncludeDirsCount; ++i)
148-
{
149-
var include = ParserOptions.GetIncludeDirs(i);
150-
options.AddIncludeDirs(include);
151-
}
152-
153-
for (uint i = 0; i < ParserOptions.SystemIncludeDirsCount; ++i)
154-
{
155-
var include = ParserOptions.GetSystemIncludeDirs(i);
156-
options.AddSystemIncludeDirs(include);
157-
}
158-
159-
for (uint i = 0; i < ParserOptions.DefinesCount; ++i)
160-
{
161-
var define = ParserOptions.GetDefines(i);
162-
options.AddDefines(define);
163-
}
164-
165-
for (uint i = 0; i < ParserOptions.UndefinesCount; ++i)
166-
{
167-
var define = ParserOptions.GetUndefines(i);
168-
options.AddUndefines(define);
169-
}
170-
171-
for (uint i = 0; i < ParserOptions.LibraryDirsCount; ++i)
172-
{
173-
var lib = ParserOptions.GetLibraryDirs(i);
174-
options.AddLibraryDirs(lib);
175-
}
176-
177-
foreach (var module in Options.Modules.Where(
178-
m => file == null || m.Headers.Contains(file)))
179-
{
180-
foreach (var include in module.IncludeDirs)
181-
options.AddIncludeDirs(include);
182-
183-
foreach (var define in module.Defines)
184-
options.AddDefines(define);
185-
186-
foreach (var undefine in module.Undefines)
187-
options.AddUndefines(undefine);
188-
189-
foreach (var libraryDir in module.LibraryDirs)
190-
options.AddLibraryDirs(libraryDir);
191-
}
192-
193-
return options;
194-
}
195-
196118
public bool ParseCode()
197119
{
198120
var astContext = new Parser.AST.ASTContext();
@@ -204,7 +126,7 @@ public bool ParseCode()
204126

205127
if (Options.UnityBuild)
206128
{
207-
var parserOptions = BuildParserOptions();
129+
var parserOptions = ParserOptions.BuildForSourceFile(Options.Modules);
208130
var result = parser.ParseSourceFiles(sourceFiles, parserOptions);
209131
result.Dispose();
210132
}
@@ -214,7 +136,8 @@ public bool ParseCode()
214136

215137
foreach (var sourceFile in sourceFiles)
216138
{
217-
var parserOptions = BuildParserOptions(sourceFile);
139+
var parserOptions = ParserOptions.BuildForSourceFile(
140+
Options.Modules, sourceFile);
218141
results.Add(parser.ParseSourceFile(sourceFile, parserOptions));
219142
}
220143

src/Parser/ParserOptions.cs

Lines changed: 86 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
using CppSharp.Parser.AST;
22
using System.Reflection;
33
using LanguageVersion = CppSharp.Parser.LanguageVersion;
4+
using System.Globalization;
5+
using System.Collections.Generic;
6+
using System.Linq;
47

58
namespace CppSharp.Parser
69
{
@@ -46,7 +49,7 @@ public enum LanguageVersion
4649
/// C++ programming language (year 2017, GNU variant).
4750
/// </summary>
4851
CPP17_GNU,
49-
};
52+
}
5053

5154
public class ParserOptions : CppParserOptions
5255
{
@@ -63,9 +66,88 @@ public ParserOptions()
6366
public bool EnableRTTI { get; set; }
6467
public LanguageVersion? LanguageVersion { get; set; }
6568

69+
public ParserOptions BuildForSourceFile(
70+
IEnumerable<CppSharp.AST.Module> modules, string file = null)
71+
{
72+
var options = new ParserOptions
73+
{
74+
Abi = this.Abi,
75+
ToolSetToUse = this.ToolSetToUse,
76+
TargetTriple = this.TargetTriple,
77+
NoStandardIncludes = this.NoStandardIncludes,
78+
NoBuiltinIncludes = this.NoBuiltinIncludes,
79+
MicrosoftMode = this.MicrosoftMode,
80+
Verbose = this.Verbose,
81+
LanguageVersion = this.LanguageVersion
82+
};
83+
84+
// This eventually gets passed to Clang's MSCompatibilityVersion, which
85+
// is in turn used to derive the value of the built-in define _MSC_VER.
86+
// It used to receive a 4-digit based identifier but now expects a full
87+
// version MSVC digit, so check if we still have the old version and
88+
// convert to the right format.
89+
90+
if (ToolSetToUse.ToString(CultureInfo.InvariantCulture).Length == 4)
91+
ToolSetToUse *= 100000;
92+
93+
for (uint i = 0; i < ArgumentsCount; ++i)
94+
{
95+
var arg = GetArguments(i);
96+
options.AddArguments(arg);
97+
}
98+
99+
for (uint i = 0; i < IncludeDirsCount; ++i)
100+
{
101+
var include = GetIncludeDirs(i);
102+
options.AddIncludeDirs(include);
103+
}
104+
105+
for (uint i = 0; i < SystemIncludeDirsCount; ++i)
106+
{
107+
var include = GetSystemIncludeDirs(i);
108+
options.AddSystemIncludeDirs(include);
109+
}
110+
111+
for (uint i = 0; i < DefinesCount; ++i)
112+
{
113+
var define = GetDefines(i);
114+
options.AddDefines(define);
115+
}
116+
117+
for (uint i = 0; i < UndefinesCount; ++i)
118+
{
119+
var define = GetUndefines(i);
120+
options.AddUndefines(define);
121+
}
122+
123+
for (uint i = 0; i < LibraryDirsCount; ++i)
124+
{
125+
var lib = GetLibraryDirs(i);
126+
options.AddLibraryDirs(lib);
127+
}
128+
129+
foreach (var module in modules.Where(
130+
m => file == null || m.Headers.Contains(file)))
131+
{
132+
foreach (var include in module.IncludeDirs)
133+
options.AddIncludeDirs(include);
134+
135+
foreach (var define in module.Defines)
136+
options.AddDefines(define);
137+
138+
foreach (var undefine in module.Undefines)
139+
options.AddUndefines(undefine);
140+
141+
foreach (var libraryDir in module.LibraryDirs)
142+
options.AddLibraryDirs(libraryDir);
143+
}
144+
145+
return options;
146+
}
147+
66148
public void SetupMSVC()
67149
{
68-
VisualStudioVersion vsVersion = VisualStudioVersion.Latest;
150+
var vsVersion = VisualStudioVersion.Latest;
69151

70152
// Silence "warning CS0162: Unreachable code detected"
71153
#pragma warning disable 162
@@ -107,6 +189,7 @@ public void SetupMSVC(VisualStudioVersion vsVersion)
107189
foreach (var include in MSVCToolchain.GetSystemIncludes(vsVersion))
108190
AddSystemIncludeDirs(include);
109191

192+
// do not remove the CppSharp prefix becase the Mono C# compiler breaks
110193
if (!LanguageVersion.HasValue)
111194
LanguageVersion = CppSharp.Parser.LanguageVersion.CPP14_GNU;
112195

@@ -145,6 +228,7 @@ public void Setup()
145228

146229
private void SetupArguments()
147230
{
231+
// do not remove the CppSharp prefix becase the Mono C# compiler breaks
148232
if (!LanguageVersion.HasValue)
149233
LanguageVersion = CppSharp.Parser.LanguageVersion.CPP14_GNU;
150234

0 commit comments

Comments
 (0)