trick/trick_source/codegen/Interface_Code_Gen/ICGDiagnosticConsumer.cpp
Hong Chen d72312c602
Customize clang diagnostic handling. (#1707)
* Cutomize clang diagnostic handling.

* Removed code that was commented out.
2024-05-14 10:53:11 -05:00

40 lines
1.5 KiB
C++

#include <iostream>
#include "clang/Basic/SourceManager.h"
#include "clang/Basic/SourceLocation.h"
#include "ICGDiagnosticConsumer.hh"
#include "HeaderSearchDirs.hh"
#include "Utilities.hh"
ICGDiagnosticConsumer::ICGDiagnosticConsumer(llvm::raw_ostream &os, clang::DiagnosticOptions *diags, clang::CompilerInstance &in_ci, HeaderSearchDirs &in_hsd)
: clang::TextDiagnosticPrinter(os, diags), ci(in_ci), hsd(in_hsd) {
error_in_user_code = false;
};
ICGDiagnosticConsumer::~ICGDiagnosticConsumer() {
};
/**
* @details
* -# Check the diagnostic level to see if an error is from user code.
* -# Terminate the build if yes, continue otherwise.
*/
void ICGDiagnosticConsumer::HandleDiagnostic(clang::DiagnosticsEngine::Level DiagLevel, const clang::Diagnostic &Info) {
// Use TextDiagnosticPrinter to handle diagnostic if the code is user code.
// Otherwise use base DiagnosticConsumer to handle diagnostic for system code.
if (isInUserCode(ci , Info.getLocation(), hsd)) {
// Parent class implementation for handling diagnostic
clang::TextDiagnosticPrinter::HandleDiagnostic(DiagLevel, Info);
// Flag it if an error is from user code
if (DiagLevel == clang::DiagnosticsEngine::Level::Fatal || DiagLevel == clang::DiagnosticsEngine::Level::Error) {
error_in_user_code = true;
}
} else {
// Base class implementation for handling diagnostic
clang::DiagnosticConsumer::HandleDiagnostic(DiagLevel, Info);
}
}