diff --git a/src/Generator/CodeGenerator.cs b/src/Generator/CodeGenerator.cs index 200e94c4..58101ace 100644 --- a/src/Generator/CodeGenerator.cs +++ b/src/Generator/CodeGenerator.cs @@ -26,40 +26,35 @@ namespace Cxxi { library = new Library(options.OutputNamespace, options.LibraryName); - var parserOptions = new ParserOptions - { - Library = library, - Verbose = false, - IncludeDirs = options.IncludeDirs - }; - Console.WriteLine("Parsing code..."); - foreach (var file in options.Headers) - { - string path; + var headers = new List(); + transform.SetupHeaders(headers); - try - { - path = Path.GetFullPath(file); - } - catch (ArgumentException) - { - Console.WriteLine("Invalid path '" + file + "'."); - continue; - } + foreach (var header in headers) + ParseHeader(header); - var module = new TranslationUnit(path); - parserOptions.FileName = path; + foreach (var header in options.Headers) + ParseHeader(header); + } - if (!ClangParser.Parse(parserOptions)) + void ParseHeader(string file) + { + var parserOptions = new ParserOptions { - Console.WriteLine(" Could not parse '" + file + "'."); - continue; - } + Library = library, + Verbose = false, + IncludeDirs = options.IncludeDirs, + FileName = file + }; - Console.WriteLine(" Parsed '" + file + "'."); + if (!ClangParser.Parse(parserOptions)) + { + Console.WriteLine(" Could not parse '" + file + "'."); + return; } + + Console.WriteLine(" Parsed '" + file + "'."); } public void ProcessCode() diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index 25e9509a..4d55b94b 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -19,6 +19,8 @@ #include #include +#include +#include //-----------------------------------// @@ -1315,16 +1317,15 @@ bool Parser::Parse(const std::string& File) C->setASTConsumer(new ParseConsumer()); - // Get the file from the file system - const clang::FileEntry* file = C->getFileManager().getFile(File.c_str()); + // Create a virtual file that includes the header. This gets rid of some + // Clang warnings about parsing an header file as the main file. - if (!file) - { - Debug("Filename '%s' was not found.\n", File.c_str()); - return false; - } + std::string str; + str += "#include \"" + File + "\"" + "\n"; + str += "\0"; - C->getSourceManager().createMainFileID(file); + auto buffer = llvm::MemoryBuffer::getMemBuffer(str); + C->getSourceManager().createMainFileIDForMemBuffer(buffer); clang::DiagnosticConsumer* client = C->getDiagnostics().getClient(); client->BeginSourceFile(C->getLangOpts(), &C->getPreprocessor());