blob: 3b4168617425c77dd8c19432c842987674989132 [file] [log] [blame]
alokp@chromium.org8b851c62012-06-15 16:25:11 +00001//
shannon.woods%transgaming.com@gtempaccount.com0bbed382013-04-13 03:38:07 +00002// Copyright (c) 2012-2013 The ANGLE Project Authors. All rights reserved.
alokp@chromium.org8b851c62012-06-15 16:25:11 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
Geoff Lang17732822013-08-29 13:46:49 -04007#include "compiler/translator/Diagnostics.h"
alokp@chromium.org8b851c62012-06-15 16:25:11 +00008
Olli Etuahod57e0db2015-04-24 15:05:08 +03009#include "common/debug.h"
daniel@transgaming.comb401a922012-10-26 18:58:24 +000010#include "compiler/preprocessor/SourceLocation.h"
Olli Etuaho1cc598f2016-08-18 13:50:30 +030011#include "compiler/translator/Common.h"
12#include "compiler/translator/InfoSink.h"
alokp@chromium.org8b851c62012-06-15 16:25:11 +000013
Jamie Madill45bcc782016-11-07 13:58:48 -050014namespace sh
15{
16
alokp@chromium.org6b495712012-06-29 00:06:58 +000017TDiagnostics::TDiagnostics(TInfoSink& infoSink) :
18 mInfoSink(infoSink),
19 mNumErrors(0),
20 mNumWarnings(0)
alokp@chromium.org8b851c62012-06-15 16:25:11 +000021{
22}
23
24TDiagnostics::~TDiagnostics()
25{
26}
27
28void TDiagnostics::writeInfo(Severity severity,
29 const pp::SourceLocation& loc,
30 const std::string& reason,
31 const std::string& token,
32 const std::string& extra)
33{
alokp@chromium.org6b495712012-06-29 00:06:58 +000034 TPrefixType prefix = EPrefixNone;
35 switch (severity)
36 {
Shannon Woods7f2d7942013-11-19 15:07:58 -050037 case PP_ERROR:
alokp@chromium.org6b495712012-06-29 00:06:58 +000038 ++mNumErrors;
39 prefix = EPrefixError;
40 break;
Shannon Woods7f2d7942013-11-19 15:07:58 -050041 case PP_WARNING:
alokp@chromium.org6b495712012-06-29 00:06:58 +000042 ++mNumWarnings;
43 prefix = EPrefixWarning;
44 break;
45 default:
46 UNREACHABLE();
47 break;
48 }
alokp@chromium.org8b851c62012-06-15 16:25:11 +000049
alokp@chromium.org6b495712012-06-29 00:06:58 +000050 TInfoSinkBase& sink = mInfoSink.info;
alokp@chromium.org8b851c62012-06-15 16:25:11 +000051 /* VC++ format: file(linenum) : error #: 'token' : extrainfo */
52 sink.prefix(prefix);
Jamie Madill075edd82013-07-08 13:30:19 -040053 sink.location(loc.file, loc.line);
alokp@chromium.org8b851c62012-06-15 16:25:11 +000054 sink << "'" << token << "' : " << reason << " " << extra << "\n";
55}
56
Olli Etuaho1cc598f2016-08-18 13:50:30 +030057void TDiagnostics::error(const TSourceLoc &loc,
58 const char *reason,
59 const char *token,
60 const char *extraInfo)
61{
62 pp::SourceLocation srcLoc;
63 srcLoc.file = loc.first_file;
64 srcLoc.line = loc.first_line;
65 writeInfo(pp::Diagnostics::PP_ERROR, srcLoc, reason, token, extraInfo);
66}
67
68void TDiagnostics::warning(const TSourceLoc &loc,
69 const char *reason,
70 const char *token,
71 const char *extraInfo)
72{
73 pp::SourceLocation srcLoc;
74 srcLoc.file = loc.first_file;
75 srcLoc.line = loc.first_line;
76 writeInfo(pp::Diagnostics::PP_WARNING, srcLoc, reason, token, extraInfo);
77}
78
alokp@chromium.org8b851c62012-06-15 16:25:11 +000079void TDiagnostics::print(ID id,
80 const pp::SourceLocation& loc,
81 const std::string& text)
82{
alokp@chromium.org6b495712012-06-29 00:06:58 +000083 writeInfo(severity(id), loc, message(id), text, "");
alokp@chromium.org8b851c62012-06-15 16:25:11 +000084}
Jamie Madill45bcc782016-11-07 13:58:48 -050085
86} // namespace sh