blob: 6ba4679c459a72a3108e27a40fd8a53e8a5184a2 [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
alokp@chromium.org6b495712012-06-29 00:06:58 +000014TDiagnostics::TDiagnostics(TInfoSink& infoSink) :
15 mInfoSink(infoSink),
16 mNumErrors(0),
17 mNumWarnings(0)
alokp@chromium.org8b851c62012-06-15 16:25:11 +000018{
19}
20
21TDiagnostics::~TDiagnostics()
22{
23}
24
25void TDiagnostics::writeInfo(Severity severity,
26 const pp::SourceLocation& loc,
27 const std::string& reason,
28 const std::string& token,
29 const std::string& extra)
30{
alokp@chromium.org6b495712012-06-29 00:06:58 +000031 TPrefixType prefix = EPrefixNone;
32 switch (severity)
33 {
Shannon Woods7f2d7942013-11-19 15:07:58 -050034 case PP_ERROR:
alokp@chromium.org6b495712012-06-29 00:06:58 +000035 ++mNumErrors;
36 prefix = EPrefixError;
37 break;
Shannon Woods7f2d7942013-11-19 15:07:58 -050038 case PP_WARNING:
alokp@chromium.org6b495712012-06-29 00:06:58 +000039 ++mNumWarnings;
40 prefix = EPrefixWarning;
41 break;
42 default:
43 UNREACHABLE();
44 break;
45 }
alokp@chromium.org8b851c62012-06-15 16:25:11 +000046
alokp@chromium.org6b495712012-06-29 00:06:58 +000047 TInfoSinkBase& sink = mInfoSink.info;
alokp@chromium.org8b851c62012-06-15 16:25:11 +000048 /* VC++ format: file(linenum) : error #: 'token' : extrainfo */
49 sink.prefix(prefix);
Jamie Madill075edd82013-07-08 13:30:19 -040050 sink.location(loc.file, loc.line);
alokp@chromium.org8b851c62012-06-15 16:25:11 +000051 sink << "'" << token << "' : " << reason << " " << extra << "\n";
52}
53
Olli Etuaho1cc598f2016-08-18 13:50:30 +030054void TDiagnostics::error(const TSourceLoc &loc,
55 const char *reason,
56 const char *token,
57 const char *extraInfo)
58{
59 pp::SourceLocation srcLoc;
60 srcLoc.file = loc.first_file;
61 srcLoc.line = loc.first_line;
62 writeInfo(pp::Diagnostics::PP_ERROR, srcLoc, reason, token, extraInfo);
63}
64
65void TDiagnostics::warning(const TSourceLoc &loc,
66 const char *reason,
67 const char *token,
68 const char *extraInfo)
69{
70 pp::SourceLocation srcLoc;
71 srcLoc.file = loc.first_file;
72 srcLoc.line = loc.first_line;
73 writeInfo(pp::Diagnostics::PP_WARNING, srcLoc, reason, token, extraInfo);
74}
75
alokp@chromium.org8b851c62012-06-15 16:25:11 +000076void TDiagnostics::print(ID id,
77 const pp::SourceLocation& loc,
78 const std::string& text)
79{
alokp@chromium.org6b495712012-06-29 00:06:58 +000080 writeInfo(severity(id), loc, message(id), text, "");
alokp@chromium.org8b851c62012-06-15 16:25:11 +000081}