|  | // 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, ""); | 
|  | } |