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;