Clang: Print error code on parse error

Change-Id: Idecb0e9b78cc14c603de09fc460bbf17f43bb451
Reviewed-by: Christian Stenger <christian.stenger@theqtcompany.com>
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
This commit is contained in:
Nikolai Kosjar
2016-04-21 16:32:07 +02:00
parent 427bb8c363
commit 28b6820026
3 changed files with 34 additions and 6 deletions

View File

@@ -417,7 +417,9 @@ void TranslationUnit::checkTranslationUnitErrorCode(CXErrorCode errorCode) const
{ {
switch (errorCode) { switch (errorCode) {
case CXError_Success: break; case CXError_Success: break;
default: throw TranslationUnitParseErrorException(d->filePath, d->projectPart.projectPartId()); default: throw TranslationUnitParseErrorException(d->filePath,
d->projectPart.projectPartId(),
errorCode);
} }
} }

View File

@@ -27,9 +27,13 @@
namespace ClangBackEnd { namespace ClangBackEnd {
TranslationUnitParseErrorException::TranslationUnitParseErrorException(const Utf8String &filePath, const Utf8String &projectPartId) TranslationUnitParseErrorException::TranslationUnitParseErrorException(
const Utf8String &filePath,
const Utf8String &projectPartId,
CXErrorCode errorCode)
: filePath_(filePath), : filePath_(filePath),
projectPartId_(projectPartId) projectPartId_(projectPartId),
errorCode_(errorCode)
{ {
} }
@@ -43,14 +47,31 @@ const Utf8String &TranslationUnitParseErrorException::projectPartId() const
return projectPartId_; return projectPartId_;
} }
#define RETURN_TEXT_FOR_CASE(enumValue) case enumValue: return #enumValue
static const char *errorCodeToText(CXErrorCode errorCode)
{
switch (errorCode) {
RETURN_TEXT_FOR_CASE(CXError_Success);
RETURN_TEXT_FOR_CASE(CXError_Failure);
RETURN_TEXT_FOR_CASE(CXError_Crashed);
RETURN_TEXT_FOR_CASE(CXError_InvalidArguments);
RETURN_TEXT_FOR_CASE(CXError_ASTReadError);
}
return "UnknownCXErrorCode";
}
#undef RETURN_TEXT_FOR_CASE
const char *TranslationUnitParseErrorException::what() const Q_DECL_NOEXCEPT const char *TranslationUnitParseErrorException::what() const Q_DECL_NOEXCEPT
{ {
if (what_.isEmpty()) if (what_.isEmpty()) {
what_ += Utf8StringLiteral("Parse error for file ") what_ += Utf8StringLiteral("Parse error for file ")
+ filePath() + filePath()
+ Utf8StringLiteral(" in project ") + Utf8StringLiteral(" in project ")
+ projectPartId() + projectPartId()
+ Utf8StringLiteral("!"); + Utf8StringLiteral(": ")
+ Utf8String::fromUtf8(errorCodeToText(errorCode_));
}
return what_.constData(); return what_.constData();
} }

View File

@@ -28,6 +28,8 @@
#include <utf8string.h> #include <utf8string.h>
#include <clang-c/Index.h>
#include <exception> #include <exception>
namespace ClangBackEnd { namespace ClangBackEnd {
@@ -35,7 +37,9 @@ namespace ClangBackEnd {
class TranslationUnitParseErrorException : public std::exception class TranslationUnitParseErrorException : public std::exception
{ {
public: public:
TranslationUnitParseErrorException(const Utf8String &filePath, const Utf8String &projectPartId); TranslationUnitParseErrorException(const Utf8String &filePath,
const Utf8String &projectPartId,
CXErrorCode errorCode);
const Utf8String &filePath() const; const Utf8String &filePath() const;
const Utf8String &projectPartId() const; const Utf8String &projectPartId() const;
@@ -51,6 +55,7 @@ public:
private: private:
Utf8String filePath_; Utf8String filePath_;
Utf8String projectPartId_; Utf8String projectPartId_;
CXErrorCode errorCode_;
mutable Utf8String what_; mutable Utf8String what_;
}; };