Home | History | Annotate | Download | only in preprocessor
      1 // Copyright 2017 The SwiftShader Authors. All Rights Reserved.
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //    http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 #ifndef COMPILER_PREPROCESSOR_DIAGNOSTICSBASE_H_
     16 #define COMPILER_PREPROCESSOR_DIAGNOSTICSBASE_H_
     17 
     18 #include <string>
     19 
     20 namespace pp
     21 {
     22 
     23 struct SourceLocation;
     24 
     25 // Base class for reporting diagnostic messages.
     26 // Derived classes are responsible for formatting and printing the messages.
     27 class Diagnostics
     28 {
     29 public:
     30 	// Severity is used to classify info log messages.
     31 	enum Severity
     32 	{
     33 		PP_WARNING,
     34 		PP_ERROR
     35 	};
     36 
     37 	enum ID
     38 	{
     39 		PP_ERROR_BEGIN,
     40 		PP_INTERNAL_ERROR,
     41 		PP_OUT_OF_MEMORY,
     42 		PP_INVALID_CHARACTER,
     43 		PP_INVALID_NUMBER,
     44 		PP_INTEGER_OVERFLOW,
     45 		PP_FLOAT_OVERFLOW,
     46 		PP_TOKEN_TOO_LONG,
     47 		PP_INVALID_EXPRESSION,
     48 		PP_DIVISION_BY_ZERO,
     49 		PP_EOF_IN_COMMENT,
     50 		PP_UNEXPECTED_TOKEN,
     51 		PP_DIRECTIVE_INVALID_NAME,
     52 		PP_MACRO_NAME_RESERVED,
     53 		PP_MACRO_REDEFINED,
     54 		PP_MACRO_PREDEFINED_REDEFINED,
     55 		PP_MACRO_PREDEFINED_UNDEFINED,
     56 		PP_MACRO_UNTERMINATED_INVOCATION,
     57 		PP_MACRO_UNDEFINED_WHILE_INVOKED,
     58 		PP_MACRO_TOO_FEW_ARGS,
     59 		PP_MACRO_TOO_MANY_ARGS,
     60 		PP_MACRO_DUPLICATE_PARAMETER_NAMES,
     61 		PP_MACRO_INVOCATION_CHAIN_TOO_DEEP,
     62 		PP_CONDITIONAL_ENDIF_WITHOUT_IF,
     63 		PP_CONDITIONAL_ELSE_WITHOUT_IF,
     64 		PP_CONDITIONAL_ELSE_AFTER_ELSE,
     65 		PP_CONDITIONAL_ELIF_WITHOUT_IF,
     66 		PP_CONDITIONAL_ELIF_AFTER_ELSE,
     67 		PP_CONDITIONAL_UNTERMINATED,
     68 		PP_CONDITIONAL_UNEXPECTED_TOKEN,
     69 		PP_INVALID_EXTENSION_NAME,
     70 		PP_INVALID_EXTENSION_BEHAVIOR,
     71 		PP_INVALID_EXTENSION_DIRECTIVE,
     72 		PP_INVALID_VERSION_NUMBER,
     73 		PP_INVALID_VERSION_DIRECTIVE,
     74 		PP_VERSION_NOT_FIRST_STATEMENT,
     75 		PP_VERSION_NOT_FIRST_LINE_ESSL3,
     76 		PP_INVALID_LINE_NUMBER,
     77 		PP_INVALID_FILE_NUMBER,
     78 		PP_INVALID_LINE_DIRECTIVE,
     79 		PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL3,
     80 		PP_UNDEFINED_SHIFT,
     81 		PP_TOKENIZER_ERROR,
     82 		PP_ERROR_END,
     83 
     84 		PP_WARNING_BEGIN,
     85 		PP_EOF_IN_DIRECTIVE,
     86 		PP_UNRECOGNIZED_PRAGMA,
     87 		PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL1,
     88 		PP_WARNING_MACRO_NAME_RESERVED,
     89 		PP_WARNING_END
     90 	};
     91 
     92 	virtual ~Diagnostics();
     93 
     94 	void report(ID id, const SourceLocation &loc, const std::string &text);
     95 
     96 protected:
     97 	bool isError(ID id);
     98 	const char *message(ID id);
     99 	Severity severity(ID id);
    100 
    101 	virtual void print(ID id, const SourceLocation &loc, const std::string &text) = 0;
    102 };
    103 
    104 }  // namespace pp
    105 
    106 #endif  // COMPILER_PREPROCESSOR_DIAGNOSTICSBASE_H_
    107