test/tools/javac/defaultMethods/syntax/TestDefaultMethodsSyntax.java

changeset 1513
cf84b07a82db
parent 1512
b12ffdfa1341
child 2227
998b10c43157
equal deleted inserted replaced
1512:b12ffdfa1341 1513:cf84b07a82db
21 * questions. 21 * questions.
22 */ 22 */
23 23
24 /* 24 /*
25 * @test 25 * @test
26 * @bug 7192245 8005851 26 * @bug 7192245 8005851 8005166
27 * @summary Automatic test for checking set of allowed modifiers on interface methods 27 * @summary Automatic test for checking set of allowed modifiers on interface methods
28 */ 28 */
29 29
30 import com.sun.source.util.JavacTask; 30 import com.sun.source.util.JavacTask;
31 import java.net.URI; 31 import java.net.URI;
52 VersionKind(String versionString) { 52 VersionKind(String versionString) {
53 this.versionString = versionString; 53 this.versionString = versionString;
54 } 54 }
55 55
56 List<String> getOptions() { 56 List<String> getOptions() {
57 return Arrays.asList("-source", versionString); 57 return Arrays.asList("-XDallowStaticInterfaceMethods", "-source", versionString);
58 } 58 }
59 } 59 }
60 60
61 enum ModifierKind { 61 enum ModifierKind {
62 NONE(""), 62 NONE(""),
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();"),
289 errorExpected |= !modk1.compatible(ek) || !modk2.compatible(ek); 262 errorExpected |= !modk1.compatible(ek) || !modk2.compatible(ek);
290 263
291 errorExpected |= ModifierKind.intersect(ModifierKind.DEFAULT, modk1, modk2) && 264 errorExpected |= ModifierKind.intersect(ModifierKind.DEFAULT, modk1, modk2) &&
292 vk == VersionKind.PRE_LAMBDA; 265 vk == VersionKind.PRE_LAMBDA;
293 266
267 errorExpected |= ModifierKind.intersect(ModifierKind.STATIC, modk1, modk2) &&
268 ek == EnclosingKind.INTERFACE && vk == VersionKind.PRE_LAMBDA;
269
294 checkCount++; 270 checkCount++;
295 if (diagChecker.errorFound != errorExpected) { 271 if (diagChecker.errorFound != errorExpected) {
296 throw new AssertionError("Problem when compiling source:\n" + source.getCharContent(true) + 272 throw new AssertionError("Problem when compiling source:\n" + source.getCharContent(true) +
297 "\nfound error: " + diagChecker.errorFound); 273 "\nfound error: " + diagChecker.errorFound);
298 } 274 }

mercurial