| // Copyright 2017 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 "DiagnosticsBase.h" | |
| #include <cassert> | |
| namespace pp | |
| { | |
| Diagnostics::~Diagnostics() | |
| { | |
| } | |
| void Diagnostics::report(ID id, const SourceLocation &loc, const std::string &text) | |
| { | |
| print(id, loc, text); | |
| } | |
| bool Diagnostics::isError(ID id) | |
| { | |
| if ((id > PP_ERROR_BEGIN) && (id < PP_ERROR_END)) | |
| return true; | |
| if ((id > PP_WARNING_BEGIN) && (id < PP_WARNING_END)) | |
| return false; | |
| assert(false); | |
| return true; | |
| } | |
| Diagnostics::Severity Diagnostics::severity(ID id) | |
| { | |
| if((id > PP_ERROR_BEGIN) && (id < PP_ERROR_END)) | |
| return PP_ERROR; | |
| if((id > PP_WARNING_BEGIN) && (id < PP_WARNING_END)) | |
| return PP_WARNING; | |
| assert(false); | |
| return PP_ERROR; | |
| } | |
| const char *Diagnostics::message(ID id) | |
| { | |
| switch (id) | |
| { | |
| // Errors begin. | |
| case PP_INTERNAL_ERROR: | |
| return "internal error"; | |
| case PP_OUT_OF_MEMORY: | |
| return "out of memory"; | |
| case PP_INVALID_CHARACTER: | |
| return "invalid character"; | |
| case PP_INVALID_NUMBER: | |
| return "invalid number"; | |
| case PP_INTEGER_OVERFLOW: | |
| return "integer overflow"; | |
| case PP_FLOAT_OVERFLOW: | |
| return "float overflow"; | |
| case PP_TOKEN_TOO_LONG: | |
| return "token too long"; | |
| case PP_INVALID_EXPRESSION: | |
| return "invalid expression"; | |
| case PP_DIVISION_BY_ZERO: | |
| return "division by zero"; | |
| case PP_EOF_IN_COMMENT: | |
| return "unexpected end of file found in comment"; | |
| case PP_UNEXPECTED_TOKEN: | |
| return "unexpected token"; | |
| case PP_DIRECTIVE_INVALID_NAME: | |
| return "invalid directive name"; | |
| case PP_MACRO_NAME_RESERVED: | |
| return "macro name is reserved"; | |
| case PP_MACRO_REDEFINED: | |
| return "macro redefined"; | |
| case PP_MACRO_PREDEFINED_REDEFINED: | |
| return "predefined macro redefined"; | |
| case PP_MACRO_PREDEFINED_UNDEFINED: | |
| return "predefined macro undefined"; | |
| case PP_MACRO_UNTERMINATED_INVOCATION: | |
| return "unterminated macro invocation"; | |
| case PP_MACRO_UNDEFINED_WHILE_INVOKED: | |
| return "macro undefined while being invoked"; | |
| case PP_MACRO_TOO_FEW_ARGS: | |
| return "Not enough arguments for macro"; | |
| case PP_MACRO_TOO_MANY_ARGS: | |
| return "Too many arguments for macro"; | |
| case PP_MACRO_DUPLICATE_PARAMETER_NAMES: | |
| return "duplicate macro parameter name"; | |
| case PP_MACRO_INVOCATION_CHAIN_TOO_DEEP: | |
| return "macro invocation chain too deep"; | |
| case PP_CONDITIONAL_ENDIF_WITHOUT_IF: | |
| return "unexpected #endif found without a matching #if"; | |
| case PP_CONDITIONAL_ELSE_WITHOUT_IF: | |
| return "unexpected #else found without a matching #if"; | |
| case PP_CONDITIONAL_ELSE_AFTER_ELSE: | |
| return "unexpected #else found after another #else"; | |
| case PP_CONDITIONAL_ELIF_WITHOUT_IF: | |
| return "unexpected #elif found without a matching #if"; | |
| case PP_CONDITIONAL_ELIF_AFTER_ELSE: | |
| return "unexpected #elif found after #else"; | |
| case PP_CONDITIONAL_UNTERMINATED: | |
| return "unexpected end of file found in conditional block"; | |
| case PP_INVALID_EXTENSION_NAME: | |
| return "invalid extension name"; | |
| case PP_INVALID_EXTENSION_BEHAVIOR: | |
| return "invalid extension behavior"; | |
| case PP_INVALID_EXTENSION_DIRECTIVE: | |
| return "invalid extension directive"; | |
| case PP_INVALID_VERSION_NUMBER: | |
| return "invalid version number"; | |
| case PP_INVALID_VERSION_DIRECTIVE: | |
| return "invalid version directive"; | |
| case PP_VERSION_NOT_FIRST_STATEMENT: | |
| return "#version directive must occur before anything else, " | |
| "except for comments and white space"; | |
| case PP_VERSION_NOT_FIRST_LINE_ESSL3: | |
| return "#version directive must occur on the first line of the shader"; | |
| case PP_INVALID_LINE_NUMBER: | |
| return "invalid line number"; | |
| case PP_INVALID_FILE_NUMBER: | |
| return "invalid file number"; | |
| case PP_INVALID_LINE_DIRECTIVE: | |
| return "invalid line directive"; | |
| case PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL3: | |
| return "extension directive must occur before any non-preprocessor tokens in ESSL3"; | |
| case PP_UNDEFINED_SHIFT: | |
| return "shift exponent is negative or undefined"; | |
| case PP_TOKENIZER_ERROR: | |
| return "internal tokenizer error"; | |
| // Errors end. | |
| // Warnings begin. | |
| case PP_EOF_IN_DIRECTIVE: | |
| return "unexpected end of file found in directive"; | |
| case PP_CONDITIONAL_UNEXPECTED_TOKEN: | |
| return "unexpected token after conditional expression"; | |
| case PP_UNRECOGNIZED_PRAGMA: | |
| return "unrecognized pragma"; | |
| case PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL1: | |
| return "extension directive should occur before any non-preprocessor tokens"; | |
| case PP_WARNING_MACRO_NAME_RESERVED: | |
| return "macro name with a double underscore is reserved - unintented behavior is " | |
| "possible"; | |
| // Warnings end. | |
| default: | |
| assert(false); | |
| return ""; | |
| } | |
| } | |
| } // namespace pp |