85 } |
86 } |
86 |
87 |
87 static boolean compatible(MethodKind mk, ModifierKind mod1, ModifierKind mod2, EnclosingKind ek) { |
88 static boolean compatible(MethodKind mk, ModifierKind mod1, ModifierKind mod2, EnclosingKind ek) { |
88 if (intersect(ABSTRACT, mod1, mod2) || intersect(NATIVE, mod1, mod2)) { |
89 if (intersect(ABSTRACT, mod1, mod2) || intersect(NATIVE, mod1, mod2)) { |
89 return mk == MethodKind.NO_BODY; |
90 return mk == MethodKind.NO_BODY; |
90 } else if (intersect(DEFAULT, mod1, mod2) || intersect(STATIC, mod1, mod2)) { |
91 } else if (intersect(DEFAULT, mod1, mod2) || intersect(STATIC, mod1, mod2) |
|
92 || intersect(PRIVATE, mod1, mod2)) { |
91 return mk == MethodKind.BODY; |
93 return mk == MethodKind.BODY; |
92 } else { |
94 } else { |
93 return ek == EnclosingKind.INTERFACE ? |
95 return ek == EnclosingKind.INTERFACE ? |
94 mk == MethodKind.NO_BODY : mk == MethodKind.BODY; |
96 mk == MethodKind.NO_BODY : mk == MethodKind.BODY; |
95 } |
97 } |
96 } |
98 } |
97 |
99 |
98 boolean compatible(EnclosingKind ek) { |
100 boolean compatible(EnclosingKind ek) { |
99 switch (this) { |
101 switch (this) { |
100 case PRIVATE: |
|
101 case PROTECTED: |
102 case PROTECTED: |
102 return ek != EnclosingKind.INTERFACE; |
103 return ek != EnclosingKind.INTERFACE; |
103 default: |
104 default: |
104 return true; |
105 return true; |
105 } |
106 } |
147 } |
148 } |
148 }; |
149 }; |
149 |
150 |
150 static Result[][] allowedModifierPairs = { |
151 static Result[][] allowedModifierPairs = { |
151 /* NONE PUBLIC PROTECTED PRIVATE ABSTRACT STATIC NATIVE SYNCHRONIZED FINAL STRICTFP DEFAULT */ |
152 /* NONE PUBLIC PROTECTED PRIVATE ABSTRACT STATIC NATIVE SYNCHRONIZED FINAL STRICTFP DEFAULT */ |
152 /* NONE */ { T , T , C , C , T , T , C , C , C , C , I }, |
153 /* NONE */ { T , T , C , T , T , T , C , C , C , C , I }, |
153 /* PUBLIC */ { T , F , F , F , T , T , C , C , C , C , I }, |
154 /* PUBLIC */ { T , F , F , F , T , T , C , C , C , C , I }, |
154 /* PROTECTED */ { C , F , F , F , C , C , C , C , C , C , F }, |
155 /* PROTECTED */ { C , F , F , F , C , C , C , C , C , C , F }, |
155 /* PRIVATE */ { C , F , F , F , F , C , C , C , C , C , F }, |
156 /* PRIVATE */ { T , F , F , F , F , T , C , C , C , T , F }, |
156 /* ABSTRACT */ { T , T , C , F , F , F , F , F , F , F , F }, |
157 /* ABSTRACT */ { T , T , C , F , F , F , F , F , F , F , F }, |
157 /* STATIC */ { T , T , C , C , F , F , C , C , C , T , F }, |
158 /* STATIC */ { T , T , C , T , F , F , C , C , C , T , F }, |
158 /* NATIVE */ { C , C , C , C , F , C , F , C , C , F , F }, |
159 /* NATIVE */ { C , C , C , C , F , C , F , C , C , F , F }, |
159 /* SYNCHRONIZED */ { C , C , C , C , F , C , C , F , C , C , F }, |
160 /* SYNCHRONIZED */ { C , C , C , C , F , C , C , F , C , C , F }, |
160 /* FINAL */ { C , C , C , C , F , C , C , C , F , C , F }, |
161 /* FINAL */ { C , C , C , C , F , C , C , C , F , C , F }, |
161 /* STRICTFP */ { C , C , C , C , F , T , F , C , C , F , I }, |
162 /* STRICTFP */ { C , C , C , T , F , T , F , C , C , F , I }, |
162 /* DEFAULT */ { I , I , F , F , F , F , F , F , F , I , F }}; |
163 /* DEFAULT */ { I , I , F , F , F , F , F , F , F , I , F }}; |
163 } |
164 } |
164 |
165 |
165 enum MethodKind { |
166 enum MethodKind { |
166 NO_BODY("void m();"), |
167 NO_BODY("void m();"), |