Changeset d55d7a6 for src/Common
- Timestamp:
- Feb 15, 2018, 3:58:56 PM (8 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 75e3cb2
- Parents:
- d27e340
- Location:
- src/Common
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Common/PassVisitor.impl.h
rd27e340 rd55d7a6 77 77 maybeAccept_impl( *i, visitor ); 78 78 } catch( SemanticError &e ) { 79 e.set_location( (*i)->location );80 79 errors.append( e ); 81 80 } … … 104 103 maybeMutate_impl( *i, mutator ); 105 104 } catch( SemanticError &e ) { 106 e.set_location( (*i)->location );107 105 errors.append( e ); 108 106 } … … 134 132 } 135 133 } catch( SemanticError &e ) { 136 e.set_location( (*i)->location );137 134 errors.append( e ); 138 135 } … … 163 160 } // if 164 161 } catch( SemanticError &e ) { 165 e.set_location( (*i)->location );166 162 errors.append( e ); 167 163 } // try … … 200 196 201 197 } catch ( SemanticError &e ) { 202 e.set_location( (*i)->location );203 198 errors.append( e ); 204 199 } -
src/Common/SemanticError.cc
rd27e340 rd55d7a6 23 23 #include "SemanticError.h" 24 24 25 SemanticError::SemanticError() { 26 } 27 28 SemanticError::SemanticError( std::string error ) { 29 append( error ); 25 SemanticError::SemanticError( CodeLocation location, std::string error ) { 26 append( location, error ); 30 27 } 31 28 … … 34 31 } 35 32 36 void SemanticError::append( const std::string & msg ) {37 errors.emplace_back( error_str() +msg );33 void SemanticError::append( CodeLocation location, const std::string & msg ) { 34 errors.emplace_back( location, msg ); 38 35 } 39 36 … … 42 39 } 43 40 44 void SemanticError::print( std::ostream &os) {41 void SemanticError::print() { 45 42 using std::to_string; 46 43 for( auto err : errors ) { 47 os << err.location<< err.description << std::endl;44 std::cerr << bold() << err.location << error_str() << reset_font() << err.description << std::endl; 48 45 } 49 46 } 50 47 51 void SemanticError::set_location( const CodeLocation& location) {52 errors.begin()->maybeSet( location );48 SemanticWarning::SemanticWarning( CodeLocation location, std::string msg ) { 49 std::cerr << bold() << location << warning_str() << reset_font() << msg << std::endl; 53 50 } 54 51 -
src/Common/SemanticError.h
rd27e340 rd55d7a6 24 24 #include "CodeLocation.h" // for CodeLocation, toString 25 25 26 //----------------------------------------------------------------------------- 27 // Errors 26 28 struct error { 29 CodeLocation location; 27 30 std::string description; 28 CodeLocation location;29 31 30 32 error() = default; 31 error( const std::string & str ) : description( str ) {} 32 33 void maybeSet( const CodeLocation & location ) { 34 if( this->location.isUnset() ) { 35 this->location = location; 36 } 37 } 33 error( CodeLocation loc, const std::string & str ) : location( loc ), description( str ) {} 38 34 }; 39 35 40 36 class SemanticError : public std::exception { 41 37 public: 42 SemanticError(); 43 SemanticError( std::string error ); 44 template< typename T > SemanticError( const std::string & error, const T * obj ); 38 SemanticError() = default; 39 SemanticError( CodeLocation location, std::string error ); 45 40 ~SemanticError() throw() {} 41 42 // constructs an exception using the given message and the printed representation of the obj (T must have a print method) 43 template< typename T > SemanticError(const T * obj, const std::string & error); 44 template< typename T > SemanticError( CodeLocation location, const T * obj, const std::string & error); 46 45 47 46 static inline const std::string & error_str() { … … 51 50 52 51 void append( SemanticError & other ); 53 void append( const std::string & );52 void append( CodeLocation location, const std::string & ); 54 53 bool isEmpty() const; 55 void print( std::ostream & os ); 56 57 void set_location( const CodeLocation & location ); 58 // constructs an exception using the given message and the printed representation of the obj (T must have a print 59 // method) 54 void print(); 60 55 private: 61 56 std::list< error > errors; … … 63 58 64 59 template< typename T > 65 SemanticError::SemanticError( const std::string & error, const T * obj ) { 66 append( toString( error, obj ) ); 60 SemanticError::SemanticError( const T * obj, const std::string & error ) 61 : SemanticError( obj->location, toString( error, obj ) ) 62 {} 63 64 template< typename T > 65 SemanticError::SemanticError( CodeLocation location, const T * obj, const std::string & error ) 66 : SemanticError( location, toString( error, obj ) ) 67 {} 68 69 //----------------------------------------------------------------------------- 70 // Warnings 71 class SemanticWarning { 72 public: 73 SemanticWarning( CodeLocation location, std::string error ); 74 ~SemanticWarning() throw() {} 75 76 // constructs an exception using the given message and the printed representation of the obj (T must have a print method) 77 template< typename T > SemanticWarning(const T * obj, const std::string & error); 78 template< typename T > SemanticWarning( CodeLocation location, const T * obj, const std::string & error); 79 80 static inline const std::string & warning_str() { 81 static std::string str = isatty( STDERR_FILENO ) ? "\e[95mwarning:\e[39m " : "warning: "; 82 return str; 83 } 84 85 private: 86 }; 87 88 template< typename T > 89 SemanticWarning::SemanticWarning( const T * obj, const std::string & error ) 90 : SemanticWarning( obj->location, toString( error, obj ) ) 91 {} 92 93 template< typename T > 94 SemanticWarning::SemanticWarning( CodeLocation location, const T * obj, const std::string & error ) 95 : SemanticWarning( location, toString( error, obj ) ) 96 {} 97 98 //----------------------------------------------------------------------------- 99 // Helpers 100 static inline const std::string & bold_ttycode() { 101 static std::string str = isatty( STDERR_FILENO ) ? "\e[1m" : ""; 102 return str; 103 } 104 105 static inline const std::string & reset_font_ttycode() { 106 static std::string str = isatty( STDERR_FILENO ) ? "\e[0m" : ""; 107 return str; 108 } 109 110 static inline std::string make_bold( const std::string & str ) { 111 return bold_ttycode() + str + reset_font_ttycode(); 112 } 113 114 struct bold {}; 115 static inline std::ostream & operator<<(std::ostream & os, bold) { 116 os << bold_ttycode(); 117 return os; 118 } 119 120 struct reset_font {}; 121 static inline std::ostream & operator<<(std::ostream & os, reset_font) { 122 os << reset_font_ttycode(); 123 return os; 67 124 } 68 125
Note:
See TracChangeset
for help on using the changeset viewer.