1 // $Id: error.h,v 1.107 2004/09/26 22:40:41 elliott-oss Exp $ -*- c++ -*- 2 // 3 // This software is subject to the terms of the IBM Jikes Compiler 4 // License Agreement available at the following URL: 5 // http://ibm.com/developerworks/opensource/jikes. 6 // Copyright (C) 1996, 2004 IBM Corporation and others. All Rights Reserved. 7 // You must accept the terms of that agreement to use this software. 8 // 9 10 #ifndef error_INCLUDED 11 #define error_INCLUDED 12 13 #include "platform.h" 14 #include "tuple.h" 15 #include "jikesapi.h" 16 17 #ifdef HAVE_JIKES_NAMESPACE 18 namespace Jikes { // Open namespace Jikes block 19 #endif 20 21 class Control; 22 class LexStream; 23 class FileSymbol; 24 class SymbolSet; 25 class Semantic; 26 class SemanticError; 27 28 // 29 // Since basic_ostringstream<wchar_t> is not supported correctly by all 30 // compilers, we now use this workaround class. 31 // WARNING: It is not thread-safe - calling Array() in multiple threads may 32 // cause a race condition, getting the wrong string as a result. 33 // 34 class ErrorString : public ConvertibleArray<wchar_t> 35 { 36 public: 37 ErrorString(); ~ErrorString()38 ~ErrorString() {} 39 40 ErrorString& operator<<(const wchar_t* s); 41 ErrorString& operator<<(const wchar_t c); 42 ErrorString& operator<<(const char* s); 43 ErrorString& operator<<(const char c); 44 ErrorString& operator<<(int n); 45 ErrorString& operator<<(ostream&(*f)(ostream&)) 46 { 47 assert(f == (ostream&(*)(ostream&)) endl); 48 return *this << '\n'; 49 } 50 51 void width(int w); 52 void fill(const char c); 53 54 // 55 // The returned value is not thread-safe, and is only guaranteed valid 56 // until the next call to Array(). 57 // 58 const wchar_t* Array(); 59 60 // 61 // The returned value is safe, but the caller is responsible for 62 // freeing the returned memory. 63 // 64 const wchar_t* SafeArray(); 65 66 private: 67 void DoFill(int n); 68 char fill_char; 69 int field_width; 70 }; 71 72 73 class ErrorInfo : public JikesError 74 { 75 friend class SemanticError; 76 77 public: 78 virtual const wchar_t* getErrorMessage(); 79 virtual const wchar_t* getErrorReport(); 80 81 virtual JikesErrorSeverity getSeverity(); 82 virtual const char* getFileName(); 83 84 virtual int getLeftLineNo(); 85 virtual int getLeftColumnNo(); 86 virtual int getRightLineNo(); 87 virtual int getRightColumnNo(); 88 89 const wchar_t* getInsert(unsigned which); 90 91 ErrorInfo(); 92 virtual ~ErrorInfo(); 93 94 private: 95 int left_line_no; 96 int left_column_no; 97 int right_line_no; 98 int right_column_no; 99 100 TokenIndex left_token; 101 TokenIndex right_token; 102 103 enum { MAX_INSERTS = 9 }; 104 const wchar_t* insert[MAX_INSERTS]; 105 const wchar_t* msg; 106 unsigned num; 107 short msg_code; 108 JikesErrorSeverity severity; 109 110 static bool emacs_style_report; 111 LexStream* lex_stream; 112 113 const wchar_t* regularErrorString(); 114 const wchar_t* emacsErrorString(); 115 116 void Initialize(LexStream*); 117 }; 118 119 class SemanticError 120 { 121 friend class ErrorInfo; 122 friend class JikesAPI; 123 124 public: 125 enum WarningLevel 126 { 127 MANDATORY_ERROR = ErrorInfo::JIKES_ERROR, 128 STRONG_WARNING = ErrorInfo::JIKES_CAUTION, 129 WEAK_WARNING = ErrorInfo::JIKES_WARNING, 130 DISABLED, 131 NAMED_STRONG_ON, 132 NAMED_STRONG_OFF, 133 NAMED_WEAK_ON, 134 NAMED_WEAK_OFF 135 }; 136 137 enum SemanticErrorKind 138 { 139 BAD_ERROR, 140 DEFAULT_ERROR, 141 142 // File related errors. 143 NO_CURRENT_DIRECTORY, 144 CANNOT_OPEN_ZIP_FILE, 145 CANNOT_OPEN_PATH_DIRECTORY, 146 PACKAGE_NOT_FOUND, 147 CANNOT_OPEN_DIRECTORY, 148 BAD_INPUT_FILE, 149 UNREADABLE_INPUT_FILE, 150 NON_STANDARD_LIBRARY_TYPE, 151 LIBRARY_METHOD_NOT_FOUND, 152 CANNOT_REOPEN_FILE, 153 CANNOT_WRITE_FILE, 154 ASSERT_UNSUPPORTED_IN_TARGET, 155 CONSTANT_POOL_OVERFLOW, 156 INTERFACES_OVERFLOW, 157 METHODS_OVERFLOW, 158 STRING_OVERFLOW, 159 PARAMETER_OVERFLOW, 160 ARRAY_OVERFLOW, 161 FIELDS_OVERFLOW, 162 LOCAL_VARIABLES_OVERFLOW, 163 STACK_OVERFLOW, 164 CODE_OVERFLOW, 165 COMPRESSED_ZIP_FILE, 166 INVALID_CLASS_FILE, 167 CANNOT_OPEN_CLASS_FILE, 168 IO_ERROR, 169 IO_WARNING, 170 171 // Warnings and pedantic errors. 172 NEGATIVE_ARRAY_SIZE, 173 NEGATIVE_SHIFT_COUNT, 174 SHIFT_COUNT_TOO_LARGE, 175 UNNECESSARY_PARENTHESIS, 176 EMPTY_DECLARATION, 177 REDUNDANT_MODIFIER, 178 RECOMMENDED_MODIFIER_ORDER, 179 SWITCH_FALLTHROUGH, 180 OBSOLESCENT_BRACKETS, 181 NO_TYPES, 182 MULTIPLE_PUBLIC_TYPES, 183 TYPE_IN_MULTIPLE_FILES, 184 PACKAGE_TYPE_CONFLICT, 185 FILE_FILE_CONFLICT, 186 MISMATCHED_TYPE_AND_FILE_NAMES, 187 REFERENCE_TO_TYPE_IN_MISMATCHED_FILE, 188 ZERO_DIVIDE_CAUTION, 189 VOID_TO_STRING, 190 CLASS_METHOD_INVOKED_VIA_INSTANCE, 191 CLASS_FIELD_ACCESSED_VIA_INSTANCE, 192 CONSTANT_OVERFLOW, 193 LOCAL_SHADOWS_FIELD, 194 HIDDEN_FIELD, 195 ASSIGNMENT_USED_AS_TRUTH_VALUE, 196 NON_STATIC_FINAL_CONSTANT_FIELD, 197 AMBIGUOUS_NULL_VARARG, 198 199 // "Effective Java" warnings. 200 EJ_AVOID_OVERLOADING_EQUALS, 201 EJ_EMPTY_CATCH_BLOCK, 202 EJ_EMPTY_FINALLY_BLOCK, 203 EJ_EQUALS_WITHOUT_HASH_CODE, 204 EJ_HASH_CODE_WITHOUT_EQUALS, 205 EJ_INTERFACE_DOES_NOT_DEFINE_TYPE, 206 EJ_MISSING_PRIVATE_CONSTRUCTOR, 207 EJ_OVERLY_GENERAL_THROWS_CLAUSE, 208 EJ_PUBLIC_STATIC_FINAL_ARRAY_FIELD, 209 EJ_RETURN_OF_NULL_ARRAY, 210 EJ_SERIALIZABLE_INNER_CLASS, 211 212 // serialVersionUID warnings. 213 UNNEEDED_SERIAL_VERSION_UID, 214 BAD_SERIAL_VERSION_UID, 215 MISSING_SERIAL_VERSION_UID, 216 217 // Naming convention warnings. 218 UNCONVENTIONAL_CLASS_NAME, 219 UNCONVENTIONAL_CONSTANT_FIELD_NAME, 220 UNCONVENTIONAL_FIELD_NAME, 221 UNCONVENTIONAL_METHOD_NAME, 222 UNCONVENTIONAL_VARIABLE_NAME, 223 224 // Type and package related errors. 225 DUPLICATE_INNER_TYPE_NAME, 226 DUPLICATE_TYPE_DECLARATION, 227 DUPLICATE_IMPORT_NAME, 228 UNNECESSARY_TYPE_IMPORT, 229 UNUSED_TYPE_IMPORT, 230 UNUSED_PACKAGE_IMPORT, 231 DUPLICATE_ACCESS_MODIFIER, 232 DUPLICATE_MODIFIER, 233 FINAL_ABSTRACT_ENTITY, 234 VOLATILE_FINAL_FIELD, 235 INVALID_MODIFIER, 236 RECOMPILATION, 237 PACKAGE_NOT_TYPE, 238 TYPE_NOT_FOUND, 239 INVALID_TYPE_FOUND, 240 IMPORT_FROM_UNNAMED_PACKAGE, 241 DUPLICATE_ON_DEMAND_IMPORT, 242 UNKNOWN_ON_DEMAND_IMPORT, 243 IMPORT_NOT_CANONICAL, 244 NOT_A_TYPE, 245 NOT_A_CLASS, 246 NOT_AN_INTERFACE, 247 SUPER_IS_FINAL, 248 OBJECT_WITH_SUPER_TYPE, 249 OBJECT_HAS_NO_SUPER_TYPE, 250 DUPLICATE_FIELD, 251 DUPLICATE_METHOD, 252 DUPLICATE_CONSTRUCTOR, 253 MISMATCHED_INHERITED_METHOD, 254 MISMATCHED_IMPLICIT_METHOD, 255 UNIMPLEMENTABLE_INTERFACE, 256 UNIMPLEMENTABLE_CLASS, 257 MISMATCHED_INHERITED_METHOD_EXTERNALLY, 258 DUPLICATE_FORMAL_PARAMETER, 259 MISSPELLED_CONSTRUCTOR_NAME, 260 MISMATCHED_CONSTRUCTOR_NAME, 261 METHOD_WITH_CONSTRUCTOR_NAME, 262 263 // Statement and expression related errors. 264 DUPLICATE_LOCAL_VARIABLE_DECLARATION, 265 MULTIPLE_DEFAULT_LABEL, 266 UNDECLARED_LABEL, 267 DUPLICATE_LABEL, 268 AMBIGUOUS_FIELD, 269 AMBIGUOUS_TYPE, 270 FIELD_NOT_FOUND, 271 FIELD_NAME_MISSPELLED, 272 METHOD_NOT_FIELD, 273 NAME_NOT_YET_AVAILABLE, 274 NAME_NOT_CLASS_VARIABLE, 275 NOT_A_VARIABLE, 276 NOT_A_NUMERIC_VARIABLE, 277 METHOD_OVERLOAD_NOT_FOUND, 278 METHOD_NOT_FOUND, 279 METHOD_NAME_MISSPELLED, 280 HIDDEN_METHOD_IN_ENCLOSING_CLASS, 281 FIELD_NOT_METHOD, 282 TYPE_NOT_METHOD, 283 TYPE_NOT_FIELD, 284 METHOD_NOT_CLASS_METHOD, 285 AMBIGUOUS_CONSTRUCTOR_INVOCATION, 286 AMBIGUOUS_METHOD_INVOCATION, 287 CONSTRUCTOR_NOT_FOUND, 288 METHOD_FOUND_FOR_CONSTRUCTOR, 289 CONSTRUCTOR_OVERLOAD_NOT_FOUND, 290 ABSTRACT_TYPE_CREATION, 291 INVALID_INSTANCEOF_CONVERSION, 292 INVALID_CAST_CONVERSION, 293 INCOMPATIBLE_TYPE_FOR_INITIALIZATION, 294 INCOMPATIBLE_TYPE_FOR_ASSIGNMENT, 295 INCOMPATIBLE_TYPE_FOR_BINARY_EXPRESSION, 296 INCOMPATIBLE_TYPE_FOR_CONDITIONAL_EXPRESSION, 297 INCOMPATIBLE_TYPE_FOR_FOREACH, 298 VOID_ARRAY, 299 DUPLICATE_THROWS_CLAUSE_CLASS, 300 REDUNDANT_THROWS_CLAUSE_CLASS, 301 UNCHECKED_THROWS_CLAUSE_CLASS, 302 TYPE_NOT_THROWABLE, 303 TYPE_NOT_INTEGRAL, 304 TYPE_NOT_NUMERIC, 305 TYPE_NOT_INTEGER, 306 TYPE_NOT_BOOLEAN, 307 TYPE_NOT_ARRAY, 308 TYPE_NOT_REFERENCE, 309 TYPE_NOT_ITERABLE, 310 TYPE_IS_VOID, 311 VALUE_NOT_REPRESENTABLE_IN_SWITCH_TYPE, 312 DUPLICATE_CASE_VALUE, 313 MISPLACED_THIS_EXPRESSION, 314 MISPLACED_SUPER_EXPRESSION, 315 316 // Definite assignment related errors. 317 VARIABLE_NOT_DEFINITELY_UNASSIGNED, 318 VARIABLE_NOT_DEFINITELY_UNASSIGNED_IN_LOOP, 319 FINAL_VARIABLE_NOT_BLANK, 320 FINAL_FIELD_ASSIGNMENT_NOT_SIMPLE, 321 UNINITIALIZED_FINAL_VARIABLE, 322 UNINITIALIZED_STATIC_FINAL_VARIABLE, 323 UNINITIALIZED_FINAL_VARIABLE_IN_CONSTRUCTOR, 324 INIT_SCALAR_WITH_ARRAY, 325 INIT_ARRAY_WITH_SCALAR, 326 INVALID_BYTE_VALUE, 327 INVALID_SHORT_VALUE, 328 INVALID_CHARACTER_VALUE, 329 INVALID_INT_VALUE, 330 INVALID_LONG_VALUE, 331 INVALID_FLOAT_VALUE, 332 INVALID_DOUBLE_VALUE, 333 RETURN_STATEMENT_IN_INITIALIZER, 334 ABRUPT_INITIALIZER, 335 MISPLACED_RETURN_WITH_EXPRESSION, 336 MISPLACED_RETURN_WITH_NO_EXPRESSION, 337 MISMATCHED_RETURN_AND_METHOD_TYPE, 338 EXPRESSION_NOT_THROWABLE, 339 MISPLACED_BREAK_STATEMENT, 340 MISPLACED_CONTINUE_STATEMENT, 341 MISPLACED_EXPLICIT_CONSTRUCTOR, 342 INVALID_CONTINUE_TARGET, 343 344 // JDK 1.5 (JLS3) feature-related errors. 345 HEX_FLOATING_POINT_UNSUPPORTED, 346 FOREACH_UNSUPPORTED, 347 VARARGS_UNSUPPORTED, 348 STATIC_IMPORT_UNSUPPORTED, 349 ANNOTATION_MODIFIER_UNSUPPORTED, 350 RECOMMENDED_ANNOTATION_ORDER, 351 DUPLICATE_ANNOTATION, 352 ANNOTATION_TYPE_UNSUPPORTED, 353 ENUM_TYPE_UNSUPPORTED, 354 SUPER_IS_ENUM, 355 CANNOT_CONSTRUCT_ENUM, 356 TYPE_ARGUMENTS_UNSUPPORTED, 357 TYPE_PARAMETERS_UNSUPPORTED, 358 COVARIANCE_UNSUPPORTED, 359 WILDCARD_UNSUPPORTED, 360 EXPLICIT_TYPE_ARGUMENTS_UNSUPPORTED, 361 UNCHECKED_TYPE_CONVERSION, 362 363 // Type parameterization related errors. 364 DUPLICATE_TYPE_PARAMETER, 365 TYPE_PARAMETER_FORWARD_REFERENCE, 366 TYPE_PARAMETER_IN_MULTIPLE_BOUNDS, 367 TYPE_NOT_PARAMETERIZED, 368 MISMATCHED_TYPE_PARAMETER_COUNT, 369 TYPE_ARGUMENT_FAILS_BOUNDS, 370 TYPE_PARAMETER_NOT_TYPE, 371 TYPE_MAY_NOT_HAVE_PARAMETERS, 372 373 // More type-related errors. 374 NON_ABSTRACT_TYPE_CONTAINS_ABSTRACT_METHOD, 375 NON_ABSTRACT_TYPE_INHERITS_ABSTRACT_METHOD, 376 NON_ABSTRACT_TYPE_CANNOT_OVERRIDE_DEFAULT_ABSTRACT_METHOD, 377 ANONYMOUS_TYPE_CANNOT_OVERRIDE_DEFAULT_ABSTRACT_METHOD, 378 DUPLICATE_INTERFACE, 379 UNKNOWN_AMBIGUOUS_NAME, 380 CIRCULAR_INTERFACE, 381 CIRCULAR_CLASS, 382 TYPE_NOT_ACCESSIBLE, 383 FIELD_NOT_ACCESSIBLE, 384 PROTECTED_INSTANCE_FIELD_NOT_ACCESSIBLE, 385 METHOD_NOT_ACCESSIBLE, 386 PROTECTED_INSTANCE_METHOD_NOT_ACCESSIBLE, 387 PROTECTED_INTERFACE_METHOD_NOT_ACCESSIBLE, 388 CONSTRUCTOR_NOT_ACCESSIBLE, 389 BAD_ABSTRACT_METHOD_MODIFIER, 390 STRICTFP_NATIVE_METHOD, 391 ABSTRACT_METHOD_INVOCATION, 392 FINAL_METHOD_OVERRIDE, 393 FINAL_IMPLICIT_METHOD_OVERRIDE, 394 INSTANCE_METHOD_OVERRIDE, 395 INSTANCE_METHOD_OVERRIDE_EXTERNALLY, 396 CLASS_METHOD_OVERRIDE, 397 MISMATCHED_OVERRIDDEN_EXCEPTION, 398 MISMATCHED_IMPLICIT_OVERRIDDEN_EXCEPTION, 399 MISMATCHED_OVERRIDDEN_EXCEPTION_EXTERNALLY, 400 ABSTRACT_METHOD_WITH_BODY, 401 NON_ABSTRACT_METHOD_WITHOUT_BODY, 402 BAD_ACCESS_METHOD_OVERRIDE, 403 BAD_ACCESS_METHOD_OVERRIDE_EXTERNALLY, 404 CIRCULAR_THIS_CALL, 405 INSTANCE_VARIABLE_IN_EXPLICIT_CONSTRUCTOR, 406 INSTANCE_METHOD_IN_EXPLICIT_CONSTRUCTOR, 407 SYNTHETIC_VARIABLE_ACCESS, 408 SYNTHETIC_METHOD_INVOCATION, 409 SYNTHETIC_CONSTRUCTOR_INVOCATION, 410 SYNTHETIC_TYPE_ACCESS, 411 UNNAMED_TYPE_ACCESS, 412 SELF_IN_EXPLICIT_CONSTRUCTOR, 413 EXPRESSION_NOT_CONSTANT, 414 UNCAUGHT_METHOD_EXCEPTION, 415 UNCAUGHT_CONSTRUCTOR_EXCEPTION, 416 UNCAUGHT_ANONYMOUS_CONSTRUCTOR_EXCEPTION, 417 UNCAUGHT_THROWN_EXCEPTION, 418 UNCAUGHT_EXPLICIT_THIS_EXCEPTION, 419 UNCAUGHT_EXPLICIT_SUPER_EXCEPTION, 420 UNREACHABLE_CATCH_CLAUSE, 421 UNREACHABLE_STATEMENT, 422 UNREACHABLE_STATEMENTS, 423 BLOCKED_CATCH_CLAUSE, 424 VARIABLE_NOT_DEFINITELY_ASSIGNED, 425 TYPED_METHOD_WITH_NO_RETURN, 426 DEFAULT_METHOD_NOT_OVERRIDDEN, 427 DEPRECATED_METHOD_OVERRIDE, 428 429 // Package related errors. 430 WRONG_TYPE_IN_CLASSFILE, 431 TYPE_NAME_MISMATCH, 432 DEPRECATED_TYPE, 433 DEPRECATED_FIELD, 434 DEPRECATED_METHOD, 435 DEPRECATED_CONSTRUCTOR, 436 437 // Inner type related errors. 438 INTERFACE_NOT_INNER_CLASS, 439 STATIC_NOT_INNER_CLASS, 440 SUPER_TYPE_NOT_INNER_CLASS, 441 STATIC_FIELD_IN_INNER_CLASS_NOT_FINAL, 442 STATIC_FIELD_IN_INNER_CLASS_NOT_CONSTANT, 443 STATIC_METHOD_IN_INNER_CLASS, 444 STATIC_TYPE_IN_INNER_CLASS, 445 STATIC_INITIALIZER_IN_INNER_CLASS, 446 INNER_CLASS_REFERENCE_TO_NON_FINAL_LOCAL_VARIABLE, 447 INHERITANCE_AND_LEXICAL_SCOPING_CONFLICT_WITH_LOCAL, 448 INHERITANCE_AND_LEXICAL_SCOPING_CONFLICT_WITH_MEMBER, 449 INHERITANCE_AND_LEXICAL_SCOPING_CONFLICT_WITH_TYPE, 450 ILLEGAL_THIS_FIELD_ACCESS, 451 CONSTRUCTOR_FOUND_IN_ANONYMOUS_CLASS, 452 ENCLOSING_INSTANCE_ACCESS_FROM_CONSTRUCTOR_INVOCATION, 453 ENCLOSING_INSTANCE_ACCESS_ACROSS_STATIC_REGION, 454 ENCLOSING_INSTANCE_NOT_ACCESSIBLE, 455 INVALID_ENCLOSING_INSTANCE, 456 STATIC_TYPE_ACCESSING_MEMBER_TYPE, 457 458 // This counts the number of legitimate types in the enum 459 // it must follow all of the real error types. 460 _num_kinds, 461 462 // This is a made up, bogus, error type. It is used in lists 463 // of SemanticErrorKinds to mark the end of the list. 464 // It is not used as an index into 465 // the tables that are indexed by the above... no point 466 // wasting space in those tables for it. 467 END 468 }; 469 470 static void StaticInitializer(); 471 static void InitializeMessages(); 472 static void InitializeMessageGroups(); 473 static void SetWarningLevel(SemanticErrorKind, WarningLevel); 474 475 static bool ProcessWarningSwitch(const char*); 476 static void PrintNamedWarnings(); 477 static void EnableDefaultWarnings(); 478 479 void Report(SemanticErrorKind, TokenIndex, TokenIndex, 480 const wchar_t* = NULL, const wchar_t* = NULL, 481 const wchar_t* = NULL, const wchar_t* = NULL, 482 const wchar_t* = NULL, const wchar_t* = NULL, 483 const wchar_t* = NULL, const wchar_t* = NULL, 484 const wchar_t* = NULL); 485 486 SemanticError(Control&, FileSymbol*); ~SemanticError()487 ~SemanticError() 488 { 489 for (unsigned i = 0; i < buffer.Length(); i++) 490 delete [] buffer[i]; 491 } 492 493 int num_errors; 494 int num_warnings; 495 EnteringClone()496 void EnteringClone() { clone_count++; } ExitingClone()497 void ExitingClone() { clone_count--; } InClone()498 bool InClone() { return clone_count > 0; } 499 500 int PrintMessages(); 501 502 private: 503 friend class Semantic; 504 505 void reportError(int k); 506 void FormatError(ErrorInfo& err); 507 508 Control& control; 509 LexStream* lex_stream; 510 511 int clone_count; 512 513 Tuple<wchar_t*> buffer; 514 Tuple<ErrorInfo> error; 515 516 static WarningLevel warning[_num_kinds]; 517 static const char* messages[_num_kinds]; 518 519 void SortMessages(); 520 }; 521 522 #ifdef HAVE_JIKES_NAMESPACE 523 } // Close namespace Jikes block 524 #endif 525 526 #endif // error_INCLUDED 527 528