1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2012 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker
7*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/Diagnostics.h"
8*8975f5c5SAndroid Build Coastguard Worker
9*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h"
10*8975f5c5SAndroid Build Coastguard Worker #include "compiler/preprocessor/SourceLocation.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/Common.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/InfoSink.h"
13*8975f5c5SAndroid Build Coastguard Worker
14*8975f5c5SAndroid Build Coastguard Worker namespace sh
15*8975f5c5SAndroid Build Coastguard Worker {
16*8975f5c5SAndroid Build Coastguard Worker
TDiagnostics(TInfoSinkBase & infoSink)17*8975f5c5SAndroid Build Coastguard Worker TDiagnostics::TDiagnostics(TInfoSinkBase &infoSink)
18*8975f5c5SAndroid Build Coastguard Worker : mInfoSink(infoSink), mNumErrors(0), mNumWarnings(0)
19*8975f5c5SAndroid Build Coastguard Worker {}
20*8975f5c5SAndroid Build Coastguard Worker
~TDiagnostics()21*8975f5c5SAndroid Build Coastguard Worker TDiagnostics::~TDiagnostics() {}
22*8975f5c5SAndroid Build Coastguard Worker
writeInfo(Severity severity,const angle::pp::SourceLocation & loc,const char * reason,const char * token)23*8975f5c5SAndroid Build Coastguard Worker void TDiagnostics::writeInfo(Severity severity,
24*8975f5c5SAndroid Build Coastguard Worker const angle::pp::SourceLocation &loc,
25*8975f5c5SAndroid Build Coastguard Worker const char *reason,
26*8975f5c5SAndroid Build Coastguard Worker const char *token)
27*8975f5c5SAndroid Build Coastguard Worker {
28*8975f5c5SAndroid Build Coastguard Worker switch (severity)
29*8975f5c5SAndroid Build Coastguard Worker {
30*8975f5c5SAndroid Build Coastguard Worker case SH_ERROR:
31*8975f5c5SAndroid Build Coastguard Worker ++mNumErrors;
32*8975f5c5SAndroid Build Coastguard Worker break;
33*8975f5c5SAndroid Build Coastguard Worker case SH_WARNING:
34*8975f5c5SAndroid Build Coastguard Worker ++mNumWarnings;
35*8975f5c5SAndroid Build Coastguard Worker break;
36*8975f5c5SAndroid Build Coastguard Worker default:
37*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
38*8975f5c5SAndroid Build Coastguard Worker break;
39*8975f5c5SAndroid Build Coastguard Worker }
40*8975f5c5SAndroid Build Coastguard Worker
41*8975f5c5SAndroid Build Coastguard Worker /* VC++ format: file(linenum) : error #: 'token' : extrainfo */
42*8975f5c5SAndroid Build Coastguard Worker mInfoSink.prefix(severity);
43*8975f5c5SAndroid Build Coastguard Worker mInfoSink.location(loc.file, loc.line);
44*8975f5c5SAndroid Build Coastguard Worker mInfoSink << "'" << token << "' : " << reason << "\n";
45*8975f5c5SAndroid Build Coastguard Worker }
46*8975f5c5SAndroid Build Coastguard Worker
globalError(const char * message)47*8975f5c5SAndroid Build Coastguard Worker void TDiagnostics::globalError(const char *message)
48*8975f5c5SAndroid Build Coastguard Worker {
49*8975f5c5SAndroid Build Coastguard Worker ++mNumErrors;
50*8975f5c5SAndroid Build Coastguard Worker mInfoSink.prefix(SH_ERROR);
51*8975f5c5SAndroid Build Coastguard Worker mInfoSink << message << "\n";
52*8975f5c5SAndroid Build Coastguard Worker }
53*8975f5c5SAndroid Build Coastguard Worker
error(const angle::pp::SourceLocation & loc,const char * reason,const char * token)54*8975f5c5SAndroid Build Coastguard Worker void TDiagnostics::error(const angle::pp::SourceLocation &loc,
55*8975f5c5SAndroid Build Coastguard Worker const char *reason,
56*8975f5c5SAndroid Build Coastguard Worker const char *token)
57*8975f5c5SAndroid Build Coastguard Worker {
58*8975f5c5SAndroid Build Coastguard Worker writeInfo(SH_ERROR, loc, reason, token);
59*8975f5c5SAndroid Build Coastguard Worker }
60*8975f5c5SAndroid Build Coastguard Worker
warning(const angle::pp::SourceLocation & loc,const char * reason,const char * token)61*8975f5c5SAndroid Build Coastguard Worker void TDiagnostics::warning(const angle::pp::SourceLocation &loc,
62*8975f5c5SAndroid Build Coastguard Worker const char *reason,
63*8975f5c5SAndroid Build Coastguard Worker const char *token)
64*8975f5c5SAndroid Build Coastguard Worker {
65*8975f5c5SAndroid Build Coastguard Worker writeInfo(SH_WARNING, loc, reason, token);
66*8975f5c5SAndroid Build Coastguard Worker }
67*8975f5c5SAndroid Build Coastguard Worker
error(const TSourceLoc & loc,const char * reason,const char * token)68*8975f5c5SAndroid Build Coastguard Worker void TDiagnostics::error(const TSourceLoc &loc, const char *reason, const char *token)
69*8975f5c5SAndroid Build Coastguard Worker {
70*8975f5c5SAndroid Build Coastguard Worker angle::pp::SourceLocation srcLoc;
71*8975f5c5SAndroid Build Coastguard Worker srcLoc.file = loc.first_file;
72*8975f5c5SAndroid Build Coastguard Worker srcLoc.line = loc.first_line;
73*8975f5c5SAndroid Build Coastguard Worker error(srcLoc, reason, token);
74*8975f5c5SAndroid Build Coastguard Worker }
75*8975f5c5SAndroid Build Coastguard Worker
warning(const TSourceLoc & loc,const char * reason,const char * token)76*8975f5c5SAndroid Build Coastguard Worker void TDiagnostics::warning(const TSourceLoc &loc, const char *reason, const char *token)
77*8975f5c5SAndroid Build Coastguard Worker {
78*8975f5c5SAndroid Build Coastguard Worker angle::pp::SourceLocation srcLoc;
79*8975f5c5SAndroid Build Coastguard Worker srcLoc.file = loc.first_file;
80*8975f5c5SAndroid Build Coastguard Worker srcLoc.line = loc.first_line;
81*8975f5c5SAndroid Build Coastguard Worker warning(srcLoc, reason, token);
82*8975f5c5SAndroid Build Coastguard Worker }
83*8975f5c5SAndroid Build Coastguard Worker
print(ID id,const angle::pp::SourceLocation & loc,const std::string & text)84*8975f5c5SAndroid Build Coastguard Worker void TDiagnostics::print(ID id, const angle::pp::SourceLocation &loc, const std::string &text)
85*8975f5c5SAndroid Build Coastguard Worker {
86*8975f5c5SAndroid Build Coastguard Worker writeInfo(isError(id) ? SH_ERROR : SH_WARNING, loc, message(id), text.c_str());
87*8975f5c5SAndroid Build Coastguard Worker }
88*8975f5c5SAndroid Build Coastguard Worker
resetErrorCount()89*8975f5c5SAndroid Build Coastguard Worker void TDiagnostics::resetErrorCount()
90*8975f5c5SAndroid Build Coastguard Worker {
91*8975f5c5SAndroid Build Coastguard Worker mNumErrors = 0;
92*8975f5c5SAndroid Build Coastguard Worker mNumWarnings = 0;
93*8975f5c5SAndroid Build Coastguard Worker }
94*8975f5c5SAndroid Build Coastguard Worker
PerformanceDiagnostics(TDiagnostics * diagnostics)95*8975f5c5SAndroid Build Coastguard Worker PerformanceDiagnostics::PerformanceDiagnostics(TDiagnostics *diagnostics)
96*8975f5c5SAndroid Build Coastguard Worker : mDiagnostics(diagnostics)
97*8975f5c5SAndroid Build Coastguard Worker {
98*8975f5c5SAndroid Build Coastguard Worker ASSERT(diagnostics);
99*8975f5c5SAndroid Build Coastguard Worker }
100*8975f5c5SAndroid Build Coastguard Worker
warning(const TSourceLoc & loc,const char * reason,const char * token)101*8975f5c5SAndroid Build Coastguard Worker void PerformanceDiagnostics::warning(const TSourceLoc &loc, const char *reason, const char *token)
102*8975f5c5SAndroid Build Coastguard Worker {
103*8975f5c5SAndroid Build Coastguard Worker mDiagnostics->warning(loc, reason, token);
104*8975f5c5SAndroid Build Coastguard Worker }
105*8975f5c5SAndroid Build Coastguard Worker
106*8975f5c5SAndroid Build Coastguard Worker } // namespace sh
107