Browse Source

Error handling - report compiler error when it occurs. Add extra option for ignoring errors.

pull/1/head
Tarmo Pikaro 13 years ago committed by triton
parent
commit
d99858e436
  1. 20
      src/Generator/Driver.cs
  2. 26
      src/Generator/Parser.cs
  3. 15
      src/Parser/Parser.cpp
  4. 2
      src/Parser/Parser.h

20
src/Generator/Driver.cs

@ -71,15 +71,19 @@ namespace Cxxi
Console.WriteLine(" {0}", diag.Message); Console.WriteLine(" {0}", diag.Message);
} }
public void ParseCode() public bool ParseCode()
{ {
Console.WriteLine("Parsing code..."); Console.WriteLine("Parsing code...");
var parser = new Parser(Options); var parser = new Parser(Options);
parser.HeaderParsed += OnHeaderParsed; parser.HeaderParsed += OnHeaderParsed;
parser.ParseHeaders(Options.Headers); if( !parser.ParseHeaders(Options.Headers) )
return false;
Library = parser.Library; Library = parser.Library;
return true;
} }
public void ProcessCode() public void ProcessCode()
@ -148,9 +152,12 @@ namespace Cxxi
var driver = new Driver(options, library); var driver = new Driver(options, library);
driver.Setup(); driver.Setup();
driver.ParseCode();
driver.ProcessCode(); if (driver.ParseCode())
driver.GenerateCode(); {
driver.ProcessCode();
driver.GenerateCode();
}
} }
} }
@ -169,6 +176,9 @@ namespace Cxxi
public bool Verbose = false; public bool Verbose = false;
public bool ShowHelpText = false; public bool ShowHelpText = false;
public bool OutputDebug = false; public bool OutputDebug = false;
// When set to true - compiler errors are ignored and intermediate
// parsing results still can be used.
public bool IgnoreErrors = false;
public bool OutputInteropIncludes = true; public bool OutputInteropIncludes = true;
public bool GenerateLibraryNamespace; public bool GenerateLibraryNamespace;
public string OutputNamespace; public string OutputNamespace;

26
src/Generator/Parser.cs

@ -14,10 +14,28 @@ namespace Cxxi
Library = new Library(options.OutputNamespace, options.LibraryName); Library = new Library(options.OutputNamespace, options.LibraryName);
} }
public void ParseHeaders(IEnumerable<string> headers) public bool ParseHeaders(IEnumerable<string> headers)
{ {
foreach (var header in headers) bool bHasErrors = false;
ParseHeader(header); foreach (var header in headers)
{
var result = ParseHeader(header);
// If we have some error, report to end-user.
if (!options.IgnoreErrors)
{
foreach (var diag in result.Diagnostics)
{
if (diag.Level == ParserDiagnosticLevel.Error || diag.Level == ParserDiagnosticLevel.Fatal)
{
Console.WriteLine(String.Format("{0}({1},{2}): error: {3}", diag.FileName, diag.lineNumber, diag.columnNumber, diag.Message));
bHasErrors = true;
}
}
} //if
}
return !bHasErrors;
} }
public ParserResult ParseHeader(string file) public ParserResult ParseHeader(string file)

15
src/Parser/Parser.cpp

@ -1638,6 +1638,21 @@ ParserResult^ Parser::Parse(const std::string& File)
auto PDiag = ParserDiagnostic(); auto PDiag = ParserDiagnostic();
PDiag.FileName = marshalString<E_UTF8>(FileName.str()); PDiag.FileName = marshalString<E_UTF8>(FileName.str());
PDiag.Message = marshalString<E_UTF8>(Diag.Message.str()); PDiag.Message = marshalString<E_UTF8>(Diag.Message.str());
PDiag.lineNumber = 0;
PDiag.columnNumber = 0;
//
// Idea copied from CGDebugInfo::getLineNumber
//
if( !Diag.Location.isInvalid() )
{
clang::PresumedLoc PLoc = Source.getPresumedLoc(Diag.Location);
if( PLoc.isValid() )
{
PDiag.lineNumber = PLoc.getLine();
PDiag.columnNumber = PLoc.getColumn();
}
}
switch( Diag.Level ) switch( Diag.Level )
{ {

2
src/Parser/Parser.h

@ -69,6 +69,8 @@ public enum struct ParserDiagnosticLevel
public value struct ParserDiagnostic public value struct ParserDiagnostic
{ {
System::String^ FileName; System::String^ FileName;
int lineNumber;
int columnNumber;
System::String^ Message; System::String^ Message;
ParserDiagnosticLevel Level; ParserDiagnosticLevel Level;
}; };

Loading…
Cancel
Save