Browse Source

Changed the generator to get the AST of each header individually. This fixes some problems that the old way had related to keeping track of forward references.

pull/1/head
triton 13 years ago
parent
commit
3c0b6e5620
  1. 47
      src/Generator/CodeGenerator.cs
  2. 17
      src/Parser/Parser.cpp

47
src/Generator/CodeGenerator.cs

@ -26,40 +26,35 @@ namespace Cxxi
{ {
library = new Library(options.OutputNamespace, options.LibraryName); library = new Library(options.OutputNamespace, options.LibraryName);
var parserOptions = new ParserOptions
{
Library = library,
Verbose = false,
IncludeDirs = options.IncludeDirs
};
Console.WriteLine("Parsing code..."); Console.WriteLine("Parsing code...");
foreach (var file in options.Headers) var headers = new List<string>();
{ transform.SetupHeaders(headers);
string path;
try foreach (var header in headers)
{ ParseHeader(header);
path = Path.GetFullPath(file);
}
catch (ArgumentException)
{
Console.WriteLine("Invalid path '" + file + "'.");
continue;
}
var module = new TranslationUnit(path); foreach (var header in options.Headers)
parserOptions.FileName = path; ParseHeader(header);
}
if (!ClangParser.Parse(parserOptions)) void ParseHeader(string file)
{
var parserOptions = new ParserOptions
{ {
Console.WriteLine(" Could not parse '" + file + "'."); Library = library,
continue; 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() public void ProcessCode()

17
src/Parser/Parser.cpp

@ -19,6 +19,8 @@
#include <clang/Driver/Util.h> #include <clang/Driver/Util.h>
#include <string> #include <string>
#include <iostream>
#include <sstream>
//-----------------------------------// //-----------------------------------//
@ -1315,16 +1317,15 @@ bool Parser::Parse(const std::string& File)
C->setASTConsumer(new ParseConsumer()); C->setASTConsumer(new ParseConsumer());
// Get the file from the file system // Create a virtual file that includes the header. This gets rid of some
const clang::FileEntry* file = C->getFileManager().getFile(File.c_str()); // Clang warnings about parsing an header file as the main file.
if (!file) std::string str;
{ str += "#include \"" + File + "\"" + "\n";
Debug("Filename '%s' was not found.\n", File.c_str()); str += "\0";
return false;
}
C->getSourceManager().createMainFileID(file); auto buffer = llvm::MemoryBuffer::getMemBuffer(str);
C->getSourceManager().createMainFileIDForMemBuffer(buffer);
clang::DiagnosticConsumer* client = C->getDiagnostics().getClient(); clang::DiagnosticConsumer* client = C->getDiagnostics().getClient();
client->BeginSourceFile(C->getLangOpts(), &C->getPreprocessor()); client->BeginSourceFile(C->getLangOpts(), &C->getPreprocessor());

Loading…
Cancel
Save