Browse Source

Improve error handling for failed library parsing.

pull/1765/head
Joao Matos 2 years ago
parent
commit
53e20e9f88
  1. 6
      src/CppParser/CppParser.h
  2. 8
      src/CppParser/Parser.cpp
  3. 19
      src/Generator/Driver.cs

6
src/CppParser/CppParser.h

@ -82,9 +82,9 @@ struct CS_API ParserDiagnostic
~ParserDiagnostic(); ~ParserDiagnostic();
std::string fileName; std::string fileName;
std::string message; std::string message;
ParserDiagnosticLevel level; ParserDiagnosticLevel level { ParserDiagnosticLevel::Ignored };
int lineNumber; int lineNumber {0};
int columnNumber; int columnNumber {0};
}; };
enum class ParserResultKind enum class ParserResultKind

8
src/CppParser/Parser.cpp

@ -4713,7 +4713,13 @@ ParserResult* Parser::ParseLibrary(const CppLinkerOptions* Opts)
auto BinaryOrErr = llvm::object::createBinary(FileEntry); auto BinaryOrErr = llvm::object::createBinary(FileEntry);
if (!BinaryOrErr) if (!BinaryOrErr)
{ {
auto Error = BinaryOrErr.takeError(); auto ErrMsg = llvm::toString(BinaryOrErr.takeError());
auto Diag = ParserDiagnostic();
Diag.fileName = FileEntry;
Diag.message = ErrMsg;
Diag.level = ParserDiagnosticLevel::Error;
res->Diagnostics.push_back(Diag);
res->kind = ParserResultKind::Error; res->kind = ParserResultKind::Error;
return res; return res;
} }

19
src/Generator/Driver.cs

@ -137,9 +137,17 @@ namespace CppSharp
if (diag.Level == ParserDiagnosticLevel.Note) if (diag.Level == ParserDiagnosticLevel.Note)
continue; continue;
Diagnostics.Message("{0}({1},{2}): {3}: {4}", if (diag.LineNumber == 0 && diag.ColumnNumber == 0)
diag.FileName, diag.LineNumber, diag.ColumnNumber, {
diag.Level.ToString().ToLower(), diag.Message); Diagnostics.Message("{0}: {1}: {2}",
diag.FileName, diag.Level.ToString().ToLower(), diag.Message);
}
else
{
Diagnostics.Message("{0}({1},{2}): {3}: {4}",
diag.FileName, diag.LineNumber, diag.ColumnNumber,
diag.Level.ToString().ToLower(), diag.Message);
}
} }
} }
@ -196,7 +204,10 @@ namespace CppSharp
using var res = ClangParser.ParseLibrary(linkerOptions); using var res = ClangParser.ParseLibrary(linkerOptions);
if (res.Kind != ParserResultKind.Success) if (res.Kind != ParserResultKind.Success)
{
res.Dispose();
continue; continue;
}
for (uint i = 0; i < res.LibrariesCount; i++) for (uint i = 0; i < res.LibrariesCount; i++)
Context.Symbols.Libraries.Add(ClangParser.ConvertLibrary(res.GetLibraries(i))); Context.Symbols.Libraries.Add(ClangParser.ConvertLibrary(res.GetLibraries(i)));
@ -206,7 +217,7 @@ namespace CppSharp
Context.Symbols.IndexSymbols(); Context.Symbols.IndexSymbols();
SortModulesByDependencies(); SortModulesByDependencies();
return true; return !hasParsingErrors;
} }
public void SetupPasses(ILibrary library) public void SetupPasses(ILibrary library)

Loading…
Cancel
Save