зеркало из https://github.com/microsoft/clang-1.git
Since multiple diagnostics can share one diagnostic client, have the client keeping track
of the total number of warnings/errors reported. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@119731 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
33e4e70c8c
Коммит
f2224d89a6
|
@ -894,7 +894,15 @@ public:
|
|||
/// DiagnosticClient - This is an abstract interface implemented by clients of
|
||||
/// the front-end, which formats and prints fully processed diagnostics.
|
||||
class DiagnosticClient {
|
||||
unsigned NumWarnings; // Number of warnings reported
|
||||
unsigned NumErrors; // Number of errors reported
|
||||
|
||||
public:
|
||||
DiagnosticClient() : NumWarnings(0), NumErrors(0) { }
|
||||
|
||||
unsigned getNumErrors() const { return NumErrors; }
|
||||
unsigned getNumWarnings() const { return NumWarnings; }
|
||||
|
||||
virtual ~DiagnosticClient();
|
||||
|
||||
/// BeginSourceFile - Callback to inform the diagnostic client that processing
|
||||
|
@ -924,8 +932,11 @@ public:
|
|||
|
||||
/// HandleDiagnostic - Handle this diagnostic, reporting it to the user or
|
||||
/// capturing it to a log as needed.
|
||||
///
|
||||
/// Default implementation just keeps track of the total number of warnings
|
||||
/// and errors.
|
||||
virtual void HandleDiagnostic(Diagnostic::Level DiagLevel,
|
||||
const DiagnosticInfo &Info) = 0;
|
||||
const DiagnosticInfo &Info);
|
||||
};
|
||||
|
||||
} // end namespace clang
|
||||
|
|
|
@ -145,6 +145,16 @@ bool DiagnosticBuilder::Emit() {
|
|||
|
||||
DiagnosticClient::~DiagnosticClient() {}
|
||||
|
||||
void DiagnosticClient::HandleDiagnostic(Diagnostic::Level DiagLevel,
|
||||
const DiagnosticInfo &Info) {
|
||||
if (!IncludeInDiagnosticCounts())
|
||||
return;
|
||||
|
||||
if (DiagLevel == Diagnostic::Warning)
|
||||
++NumWarnings;
|
||||
else if (DiagLevel >= Diagnostic::Error)
|
||||
++NumErrors;
|
||||
}
|
||||
|
||||
/// ModifierIs - Return true if the specified modifier matches specified string.
|
||||
template <std::size_t StrLen>
|
||||
|
|
|
@ -84,6 +84,8 @@ PathDiagnostic::PathDiagnostic(llvm::StringRef bugtype, llvm::StringRef desc,
|
|||
|
||||
void PathDiagnosticClient::HandleDiagnostic(Diagnostic::Level DiagLevel,
|
||||
const DiagnosticInfo &Info) {
|
||||
// Default implementation (Warnings/errors count).
|
||||
DiagnosticClient::HandleDiagnostic(DiagLevel, Info);
|
||||
|
||||
// Create a PathDiagnostic with a single piece.
|
||||
|
||||
|
|
|
@ -69,15 +69,6 @@ void ASTMergeAction::ExecuteAction() {
|
|||
Importer.Import(*D);
|
||||
}
|
||||
|
||||
// Aggregate the number of warnings/errors from all diagnostics so
|
||||
// that at CompilerInstance::ExecuteAction we can report the total numbers.
|
||||
// FIXME: This is hacky, maybe keep track of total number of warnings/errors
|
||||
// in DiagnosticClient and have CompilerInstance query that ?
|
||||
CI.getDiagnostics().setNumWarnings(CI.getDiagnostics().getNumWarnings() +
|
||||
Diags->getNumWarnings());
|
||||
CI.getDiagnostics().setNumErrors(CI.getDiagnostics().getNumErrors() +
|
||||
Diags->getNumErrors());
|
||||
|
||||
delete Unit;
|
||||
}
|
||||
|
||||
|
|
|
@ -440,6 +440,9 @@ public:
|
|||
|
||||
void StoredDiagnosticClient::HandleDiagnostic(Diagnostic::Level Level,
|
||||
const DiagnosticInfo &Info) {
|
||||
// Default implementation (Warnings/errors count).
|
||||
DiagnosticClient::HandleDiagnostic(Level, Info);
|
||||
|
||||
StoredDiags.push_back(StoredDiagnostic(Level, Info));
|
||||
}
|
||||
|
||||
|
|
|
@ -553,9 +553,10 @@ bool CompilerInstance::ExecuteAction(FrontendAction &Act) {
|
|||
}
|
||||
|
||||
if (getDiagnosticOpts().ShowCarets) {
|
||||
unsigned NumWarnings = getDiagnostics().getNumWarnings();
|
||||
unsigned NumErrors = getDiagnostics().getNumErrors() -
|
||||
getDiagnostics().getNumErrorsSuppressed();
|
||||
// We can have multiple diagnostics sharing one diagnostic client.
|
||||
// Get the total number of warnings/errors from the client.
|
||||
unsigned NumWarnings = getDiagnostics().getClient()->getNumWarnings();
|
||||
unsigned NumErrors = getDiagnostics().getClient()->getNumErrors();
|
||||
|
||||
if (NumWarnings)
|
||||
OS << NumWarnings << " warning" << (NumWarnings == 1 ? "" : "s");
|
||||
|
|
|
@ -20,6 +20,9 @@ using namespace clang;
|
|||
///
|
||||
void TextDiagnosticBuffer::HandleDiagnostic(Diagnostic::Level Level,
|
||||
const DiagnosticInfo &Info) {
|
||||
// Default implementation (Warnings/errors count).
|
||||
DiagnosticClient::HandleDiagnostic(Level, Info);
|
||||
|
||||
llvm::SmallString<100> Buf;
|
||||
Info.FormatDiagnostic(Buf);
|
||||
switch (Level) {
|
||||
|
|
|
@ -764,6 +764,9 @@ static bool PrintWordWrapped(llvm::raw_ostream &OS,
|
|||
|
||||
void TextDiagnosticPrinter::HandleDiagnostic(Diagnostic::Level Level,
|
||||
const DiagnosticInfo &Info) {
|
||||
// Default implementation (Warnings/errors count).
|
||||
DiagnosticClient::HandleDiagnostic(Level, Info);
|
||||
|
||||
// Keeps track of the the starting position of the location
|
||||
// information (e.g., "foo.c:10:4:") that precedes the error
|
||||
// message. We use this information to determine how long the
|
||||
|
|
Загрузка…
Ссылка в новой задаче