| // | |
| // Copyright 2012 The ANGLE Project Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // | |
| #include "compiler/translator/Diagnostics.h" | |
| #include "common/debug.h" | |
| #include "compiler/preprocessor/SourceLocation.h" | |
| #include "compiler/translator/Common.h" | |
| #include "compiler/translator/InfoSink.h" | |
| namespace sh | |
| { | |
| TDiagnostics::TDiagnostics(TInfoSinkBase &infoSink) | |
| : mInfoSink(infoSink), mNumErrors(0), mNumWarnings(0) | |
| {} | |
| TDiagnostics::~TDiagnostics() {} | |
| void TDiagnostics::writeInfo(Severity severity, | |
| const angle::pp::SourceLocation &loc, | |
| const char *reason, | |
| const char *token) | |
| { | |
| switch (severity) | |
| { | |
| case SH_ERROR: | |
| ++mNumErrors; | |
| break; | |
| case SH_WARNING: | |
| ++mNumWarnings; | |
| break; | |
| default: | |
| UNREACHABLE(); | |
| break; | |
| } | |
| /* VC++ format: file(linenum) : error #: 'token' : extrainfo */ | |
| mInfoSink.prefix(severity); | |
| mInfoSink.location(loc.file, loc.line); | |
| mInfoSink << "'" << token << "' : " << reason << "\n"; | |
| } | |
| void TDiagnostics::globalError(const char *message) | |
| { | |
| ++mNumErrors; | |
| mInfoSink.prefix(SH_ERROR); | |
| mInfoSink << message << "\n"; | |
| } | |
| void TDiagnostics::error(const angle::pp::SourceLocation &loc, | |
| const char *reason, | |
| const char *token) | |
| { | |
| writeInfo(SH_ERROR, loc, reason, token); | |
| } | |
| void TDiagnostics::warning(const angle::pp::SourceLocation &loc, | |
| const char *reason, | |
| const char *token) | |
| { | |
| writeInfo(SH_WARNING, loc, reason, token); | |
| } | |
| void TDiagnostics::error(const TSourceLoc &loc, const char *reason, const char *token) | |
| { | |
| angle::pp::SourceLocation srcLoc; | |
| srcLoc.file = loc.first_file; | |
| srcLoc.line = loc.first_line; | |
| error(srcLoc, reason, token); | |
| } | |
| void TDiagnostics::warning(const TSourceLoc &loc, const char *reason, const char *token) | |
| { | |
| angle::pp::SourceLocation srcLoc; | |
| srcLoc.file = loc.first_file; | |
| srcLoc.line = loc.first_line; | |
| warning(srcLoc, reason, token); | |
| } | |
| void TDiagnostics::print(ID id, const angle::pp::SourceLocation &loc, const std::string &text) | |
| { | |
| writeInfo(isError(id) ? SH_ERROR : SH_WARNING, loc, message(id), text.c_str()); | |
| } | |
| void TDiagnostics::resetErrorCount() | |
| { | |
| mNumErrors = 0; | |
| mNumWarnings = 0; | |
| } | |
| PerformanceDiagnostics::PerformanceDiagnostics(TDiagnostics *diagnostics) | |
| : mDiagnostics(diagnostics) | |
| { | |
| ASSERT(diagnostics); | |
| } | |
| void PerformanceDiagnostics::warning(const TSourceLoc &loc, const char *reason, const char *token) | |
| { | |
| mDiagnostics->warning(loc, reason, token); | |
| } | |
| } // namespace sh |