diff options
Diffstat (limited to 'src/tools/moc/parser.cpp')
-rw-r--r-- | src/tools/moc/parser.cpp | 76 |
1 files changed, 57 insertions, 19 deletions
diff --git a/src/tools/moc/parser.cpp b/src/tools/moc/parser.cpp index 6fa0e645d3..1cfb8ce486 100644 --- a/src/tools/moc/parser.cpp +++ b/src/tools/moc/parser.cpp @@ -8,42 +8,80 @@ QT_BEGIN_NAMESPACE -#ifdef USE_LEXEM_STORE -Symbol::LexemStore Symbol::lexemStore; -#endif - static const char *error_msg = nullptr; +/*! \internal + Base implementation for printing diagnostic messages. + + For example: + "/path/to/file:line:column: error: %s\n" + '%s' is replaced by \a msg. (Currently "column" is always 1). + + If sym.lineNum is -1, the line and column parts aren't printed: + "/path/to/file: error: %s\n" + + \a formatStringSuffix specifies the type of the message e.g.: + "error: %s\n" + "warning: %s\n" + "note: %s\n" + "Parse error at %s\n" (from defaultErrorMsg()) +*/ +void Parser::printMsg(QByteArrayView formatStringSuffix, QByteArrayView msg, const Symbol &sym) +{ + if (sym.lineNum != -1) { #ifdef Q_CC_MSVC -#define ErrorFormatString "%s(%d:%d): " + QByteArray formatString = "%s(%d:%d): " + formatStringSuffix; #else -#define ErrorFormatString "%s:%d:%d: " + QByteArray formatString = "%s:%d:%d: " + formatStringSuffix; #endif + fprintf(stderr, formatString.constData(), + currentFilenames.top().constData(), sym.lineNum, 1, msg.data()); + } else { + QByteArray formatString = "%s: " + formatStringSuffix; + fprintf(stderr, formatString.constData(), + currentFilenames.top().constData(), msg.data()); + } +} + +void Parser::defaultErrorMsg(const Symbol &sym) +{ + if (sym.lineNum != -1) + printMsg("error: Parse error at \"%s\"\n", sym.lexem().data(), sym); + else + printMsg("error: could not parse file\n", "", sym); +} -void Parser::error(int rollback) { - index -= rollback; - error(); +void Parser::error(const Symbol &sym) +{ + defaultErrorMsg(sym); + exit(EXIT_FAILURE); } -void Parser::error(const char *msg) { + +void Parser::error(const char *msg) +{ if (msg || error_msg) - fprintf(stderr, ErrorFormatString "error: %s\n", - currentFilenames.top().constData(), symbol().lineNum, 1, msg?msg:error_msg); + printMsg("error: %s\n", + msg ? msg : error_msg, + index > 0 ? symbol() : Symbol{}); else - fprintf(stderr, ErrorFormatString "error: Parse error at \"%s\"\n", - currentFilenames.top().constData(), symbol().lineNum, 1, symbol().lexem().data()); + defaultErrorMsg(symbol()); + exit(EXIT_FAILURE); } +void Parser::warning(const Symbol &sym, QByteArrayView msg) +{ + if (displayWarnings) + printMsg("warning: %s\n", msg, sym); +} + void Parser::warning(const char *msg) { - if (displayWarnings && msg) - fprintf(stderr, ErrorFormatString "warning: %s\n", - currentFilenames.top().constData(), qMax(0, index > 0 ? symbol().lineNum : 0), 1, msg); + warning(index > 0 ? symbol() : Symbol{}, msg); } void Parser::note(const char *msg) { if (displayNotes && msg) - fprintf(stderr, ErrorFormatString "note: %s\n", - currentFilenames.top().constData(), qMax(0, index > 0 ? symbol().lineNum : 0), 1, msg); + printMsg("note: %s\n", msg, index > 0 ? symbol() : Symbol{}); } QT_END_NAMESPACE |