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