| // Copyright 2016 The SwiftShader Authors. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include "Diagnostics.h" |
| |
| #include "debug.h" |
| #include "InfoSink.h" |
| #include "preprocessor/SourceLocation.h" |
| |
| TDiagnostics::TDiagnostics(TInfoSink& infoSink) : |
| mShaderVersion(100), |
| mInfoSink(infoSink), |
| mNumErrors(0), |
| mNumWarnings(0), |
| mNumInfos(0) |
| { |
| } |
| |
| TDiagnostics::~TDiagnostics() |
| { |
| } |
| |
| void TDiagnostics::setShaderVersion(int version) |
| { |
| mShaderVersion = version; |
| } |
| |
| void TDiagnostics::writeInfo(Severity severity, |
| const pp::SourceLocation& loc, |
| const std::string& reason, |
| const std::string& token, |
| const std::string& extra) |
| { |
| TPrefixType prefix = EPrefixNone; |
| switch(severity) |
| { |
| case PP_ERROR: |
| ++mNumErrors; |
| prefix = EPrefixError; |
| break; |
| case PP_WARNING: |
| ++mNumWarnings; |
| prefix = EPrefixWarning; |
| break; |
| case PP_INFO: |
| ++mNumInfos; |
| prefix = EPrefixInfo; |
| break; |
| default: |
| UNREACHABLE(severity); |
| break; |
| } |
| |
| TInfoSinkBase& sink = mInfoSink.info; |
| /* VC++ format: file(linenum) : error #: 'token' : extrainfo */ |
| sink.prefix(prefix); |
| TSourceLoc sourceLoc; |
| sourceLoc.first_file = sourceLoc.last_file = loc.file; |
| sourceLoc.first_line = sourceLoc.last_line = loc.line; |
| sink.location(sourceLoc); |
| sink << "'" << token << "' : " << reason << " " << extra << "\n"; |
| } |
| |
| void TDiagnostics::writeDebug(const std::string& str) |
| { |
| mInfoSink.debug << str; |
| } |
| |
| void TDiagnostics::print(ID id, |
| const pp::SourceLocation& loc, |
| const std::string& text) |
| { |
| writeInfo(severity(id), loc, message(id), text, ""); |
| } |