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. 16
      src/Generator/Driver.cs
  2. 22
      src/Generator/Parser.cs
  3. 15
      src/Parser/Parser.cpp
  4. 2
      src/Parser/Parser.h

16
src/Generator/Driver.cs

@ -71,15 +71,19 @@ namespace Cxxi @@ -71,15 +71,19 @@ namespace Cxxi
Console.WriteLine(" {0}", diag.Message);
}
public void ParseCode()
public bool ParseCode()
{
Console.WriteLine("Parsing code...");
var parser = new Parser(Options);
parser.HeaderParsed += OnHeaderParsed;
parser.ParseHeaders(Options.Headers);
if( !parser.ParseHeaders(Options.Headers) )
return false;
Library = parser.Library;
return true;
}
public void ProcessCode()
@ -148,11 +152,14 @@ namespace Cxxi @@ -148,11 +152,14 @@ namespace Cxxi
var driver = new Driver(options, library);
driver.Setup();
driver.ParseCode();
if (driver.ParseCode())
{
driver.ProcessCode();
driver.GenerateCode();
}
}
}
public class DriverOptions
{
@ -169,6 +176,9 @@ namespace Cxxi @@ -169,6 +176,9 @@ namespace Cxxi
public bool Verbose = false;
public bool ShowHelpText = 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 GenerateLibraryNamespace;
public string OutputNamespace;

22
src/Generator/Parser.cs

@ -14,10 +14,28 @@ namespace Cxxi @@ -14,10 +14,28 @@ namespace Cxxi
Library = new Library(options.OutputNamespace, options.LibraryName);
}
public void ParseHeaders(IEnumerable<string> headers)
public bool ParseHeaders(IEnumerable<string> headers)
{
bool bHasErrors = false;
foreach (var header in headers)
ParseHeader(header);
{
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)

15
src/Parser/Parser.cpp

@ -1638,6 +1638,21 @@ ParserResult^ Parser::Parse(const std::string& File) @@ -1638,6 +1638,21 @@ ParserResult^ Parser::Parse(const std::string& File)
auto PDiag = ParserDiagnostic();
PDiag.FileName = marshalString<E_UTF8>(FileName.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 )
{

2
src/Parser/Parser.h

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

Loading…
Cancel
Save