75 |
75 |
76 private ModifierKind(String modStr) { |
76 private ModifierKind(String modStr) { |
77 this.modStr = modStr; |
77 this.modStr = modStr; |
78 } |
78 } |
79 |
79 |
80 boolean isAllowed(EnclosingKind ek, ModifierKind otherMod) { |
|
81 if (this == otherMod) return false; |
|
82 switch (this) { |
|
83 case NONE: |
|
84 return true; |
|
85 case ABSTRACT: |
|
86 return otherMod != PRIVATE; |
|
87 case NATIVE: |
|
88 return otherMod != ABSTRACT && |
|
89 otherMod != STRICTFP; |
|
90 case FINAL: |
|
91 case STATIC: |
|
92 case SYNCHRONIZED: |
|
93 case STRICTFP: |
|
94 return otherMod != ABSTRACT; |
|
95 case PUBLIC: |
|
96 return true; |
|
97 case PROTECTED: |
|
98 return ek == EnclosingKind.ABSTRACT_CLASS; |
|
99 case DEFAULT: |
|
100 return otherMod != ABSTRACT; |
|
101 default: |
|
102 return true; |
|
103 } |
|
104 } |
|
105 |
|
106 static boolean intersect(ModifierKind mk, ModifierKind... mks) { |
80 static boolean intersect(ModifierKind mk, ModifierKind... mks) { |
107 for (ModifierKind mk2 : mks) { |
81 for (ModifierKind mk2 : mks) { |
108 if (mk == mk2) return true; |
82 if (mk == mk2) return true; |
109 } |
83 } |
110 return false; |
84 return false; |
111 } |
85 } |
112 |
86 |
113 static boolean compatible(MethodKind mk, ModifierKind mod1, ModifierKind mod2, EnclosingKind ek) { |
87 static boolean compatible(MethodKind mk, ModifierKind mod1, ModifierKind mod2, EnclosingKind ek) { |
114 if (intersect(ABSTRACT, mod1, mod2) || intersect(NATIVE, mod1, mod2)) { |
88 if (intersect(ABSTRACT, mod1, mod2) || intersect(NATIVE, mod1, mod2)) { |
115 return mk == MethodKind.NO_BODY; |
89 return mk == MethodKind.NO_BODY; |
116 } else if (intersect(DEFAULT, mod1, mod2)) { |
90 } else if (intersect(DEFAULT, mod1, mod2) || intersect(STATIC, mod1, mod2)) { |
117 return mk == MethodKind.BODY; |
91 return mk == MethodKind.BODY; |
118 } else { |
92 } else { |
119 return ek == EnclosingKind.INTERFACE ? |
93 return ek == EnclosingKind.INTERFACE ? |
120 mk == MethodKind.NO_BODY : mk == MethodKind.BODY; |
94 mk == MethodKind.NO_BODY : mk == MethodKind.BODY; |
121 } |
95 } |
122 } |
96 } |
123 |
97 |
124 boolean compatible(EnclosingKind ek) { |
98 boolean compatible(EnclosingKind ek) { |
125 switch (this) { |
99 switch (this) { |
126 case STATIC: |
|
127 case PRIVATE: |
100 case PRIVATE: |
128 case PROTECTED: |
101 case PROTECTED: |
129 return ek != EnclosingKind.INTERFACE; |
102 return ek != EnclosingKind.INTERFACE; |
130 default: |
103 default: |
131 return true; |
104 return true; |
174 } |
147 } |
175 }; |
148 }; |
176 |
149 |
177 static Result[][] allowedModifierPairs = { |
150 static Result[][] allowedModifierPairs = { |
178 /* NONE PUBLIC PROTECTED PRIVATE ABSTRACT STATIC NATIVE SYNCHRONIZED FINAL STRICTFP DEFAULT */ |
151 /* NONE PUBLIC PROTECTED PRIVATE ABSTRACT STATIC NATIVE SYNCHRONIZED FINAL STRICTFP DEFAULT */ |
179 /* NONE */ { T , T , C , C , T , C , C , C , C , C , I }, |
152 /* NONE */ { T , T , C , C , T , T , C , C , C , C , I }, |
180 /* PUBLIC */ { T , F , F , F , T , C , C , C , C , C , I }, |
153 /* PUBLIC */ { T , F , F , F , T , T , C , C , C , C , I }, |
181 /* PROTECTED */ { C , F , F , F , C , C , C , C , C , C , F }, |
154 /* PROTECTED */ { C , F , F , F , C , C , C , C , C , C , F }, |
182 /* PRIVATE */ { C , F , F , F , F , C , C , C , C , C , F }, |
155 /* PRIVATE */ { C , F , F , F , F , C , C , C , C , C , F }, |
183 /* ABSTRACT */ { T , T , C , F , F , F , F , F , F , F , F }, |
156 /* ABSTRACT */ { T , T , C , F , F , F , F , F , F , F , F }, |
184 /* STATIC */ { C , C , C , C , F , F , C , C , C , C , F }, |
157 /* STATIC */ { T , T , C , C , F , F , C , C , C , T , F }, |
185 /* NATIVE */ { C , C , C , C , F , C , F , C , C , F , F }, |
158 /* NATIVE */ { C , C , C , C , F , C , F , C , C , F , F }, |
186 /* SYNCHRONIZED */ { C , C , C , C , F , C , C , F , C , C , F }, |
159 /* SYNCHRONIZED */ { C , C , C , C , F , C , C , F , C , C , F }, |
187 /* FINAL */ { C , C , C , C , F , C , C , C , F , C , F }, |
160 /* FINAL */ { C , C , C , C , F , C , C , C , F , C , F }, |
188 /* STRICTFP */ { C , C , C , C , F , C , F , C , C , F , I }, |
161 /* STRICTFP */ { C , C , C , C , F , T , F , C , C , F , I }, |
189 /* DEFAULT */ { I , I , F , F , F , F , F , F , F , I , F }}; |
162 /* DEFAULT */ { I , I , F , F , F , F , F , F , F , I , F }}; |
190 } |
163 } |
191 |
164 |
192 enum MethodKind { |
165 enum MethodKind { |
193 NO_BODY("void m();"), |
166 NO_BODY("void m();"), |