Some cleanup in the diagnostic client.

This commit is contained in:
Roberto Raggi
2010-08-10 17:30:20 +02:00
parent 91c909120b
commit 1458476c4e
3 changed files with 41 additions and 62 deletions

View File

@@ -50,8 +50,7 @@
#define CPLUSPLUS_DIAGNOSTICCLIENT_H #define CPLUSPLUS_DIAGNOSTICCLIENT_H
#include "CPlusPlusForwardDeclarations.h" #include "CPlusPlusForwardDeclarations.h"
#include "stdarg.h" #include <cstdarg>
namespace CPlusPlus { namespace CPlusPlus {

View File

@@ -389,7 +389,7 @@ bool TranslationUnit::blockErrors(bool block)
return previous; return previous;
} }
void TranslationUnit::warning(unsigned index, const char *format, ...) void TranslationUnit::message(DiagnosticClient::Level level, unsigned index, const char *format, va_list args)
{ {
if (f._blockErrors) if (f._blockErrors)
return; return;
@@ -401,23 +401,37 @@ void TranslationUnit::warning(unsigned index, const char *format, ...)
getTokenPosition(index, &line, &column, &fileName); getTokenPosition(index, &line, &column, &fileName);
if (DiagnosticClient *client = control()->diagnosticClient()) { if (DiagnosticClient *client = control()->diagnosticClient()) {
va_list args; client->report(level, fileName, line, column, format, args);
va_start(args, format);
client->report(DiagnosticClient::Warning, fileName, line, column,
format, args);
va_end(args);
} else { } else {
fprintf(stderr, "%s:%d: ", fileName->chars(), line); fprintf(stderr, "%s:%d: ", fileName->chars(), line);
fprintf(stderr, "warning: "); const char *l = "error";
if (level == DiagnosticClient::Warning)
l = "warning";
else if (level == DiagnosticClient::Fatal)
l = "fatal";
fprintf(stderr, "%s: ", l);
va_list args;
va_start(args, format);
vfprintf(stderr, format, args); vfprintf(stderr, format, args);
va_end(args);
fputc('\n', stderr); fputc('\n', stderr);
showErrorLine(index, column, stderr); showErrorLine(index, column, stderr);
} }
if (level == DiagnosticClient::Fatal)
exit(EXIT_FAILURE);
}
void TranslationUnit::warning(unsigned index, const char *format, ...)
{
if (f._blockErrors)
return;
va_list args, ap;
va_start(args, format);
va_copy(ap, args);
message(DiagnosticClient::Fatal, index, format, args);
va_end(ap);
va_end(args);
} }
void TranslationUnit::error(unsigned index, const char *format, ...) void TranslationUnit::error(unsigned index, const char *format, ...)
@@ -425,30 +439,12 @@ void TranslationUnit::error(unsigned index, const char *format, ...)
if (f._blockErrors) if (f._blockErrors)
return; return;
index = std::min(index, tokenCount() - 1); va_list args, ap;
unsigned line = 0, column = 0;
const StringLiteral *fileName = 0;
getTokenPosition(index, &line, &column, &fileName);
if (DiagnosticClient *client = control()->diagnosticClient()) {
va_list args;
va_start(args, format); va_start(args, format);
client->report(DiagnosticClient::Error, fileName, line, column, va_copy(ap, args);
format, args); message(DiagnosticClient::Error, index, format, args);
va_end(ap);
va_end(args); va_end(args);
} else {
fprintf(stderr, "%s:%d: ", fileName->chars(), line);
fprintf(stderr, "error: ");
va_list args;
va_start(args, format);
vfprintf(stderr, format, args);
va_end(args);
fputc('\n', stderr);
showErrorLine(index, column, stderr);
}
} }
void TranslationUnit::fatal(unsigned index, const char *format, ...) void TranslationUnit::fatal(unsigned index, const char *format, ...)
@@ -456,32 +452,12 @@ void TranslationUnit::fatal(unsigned index, const char *format, ...)
if (f._blockErrors) if (f._blockErrors)
return; return;
index = std::min(index, tokenCount() - 1); va_list args, ap;
unsigned line = 0, column = 0;
const StringLiteral *fileName = 0;
getTokenPosition(index, &line, &column, &fileName);
if (DiagnosticClient *client = control()->diagnosticClient()) {
va_list args;
va_start(args, format); va_start(args, format);
client->report(DiagnosticClient::Fatal, fileName, line, column, va_copy(ap, args);
format, args); message(DiagnosticClient::Fatal, index, format, args);
va_end(ap);
va_end(args); va_end(args);
} else {
fprintf(stderr, "%s:%d: ", fileName->chars(), line);
fprintf(stderr, "fatal: ");
va_list args;
va_start(args, format);
vfprintf(stderr, format, args);
va_end(args);
fputc('\n', stderr);
showErrorLine(index, column, stderr);
}
exit(EXIT_FAILURE);
} }
unsigned TranslationUnit::findPreviousLineOffset(unsigned tokenIndex) const unsigned TranslationUnit::findPreviousLineOffset(unsigned tokenIndex) const

View File

@@ -52,6 +52,7 @@
#include "CPlusPlusForwardDeclarations.h" #include "CPlusPlusForwardDeclarations.h"
#include "ASTfwd.h" #include "ASTfwd.h"
#include "Token.h" #include "Token.h"
#include "DiagnosticClient.h"
#include <cstdio> #include <cstdio>
#include <vector> #include <vector>
@@ -108,6 +109,9 @@ public:
void error(unsigned index, const char *fmt, ...); void error(unsigned index, const char *fmt, ...);
void fatal(unsigned index, const char *fmt, ...); void fatal(unsigned index, const char *fmt, ...);
void message(DiagnosticClient::Level level, unsigned index,
const char *format, va_list ap);
bool isTokenized() const; bool isTokenized() const;
void tokenize(); void tokenize();