summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/compiler/translator/Diagnostics.cpp
blob: 1744e5ab3ef1fff58ec9ef75d75c33d09746e87b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
//
// Copyright (c) 2012-2013 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 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 pp::SourceLocation &loc, const char *reason, const char *token)
{
    writeInfo(SH_ERROR, loc, reason, token);
}

void TDiagnostics::warning(const 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)
{
    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)
{
    pp::SourceLocation srcLoc;
    srcLoc.file = loc.first_file;
    srcLoc.line = loc.first_line;
    warning(srcLoc, reason, token);
}

void TDiagnostics::print(ID id, const 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