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