2013-01-21 20:19:53 +00:00
|
|
|
/*
|
2015-05-21 11:41:04 -07:00
|
|
|
* Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
|
2013-01-21 20:19:53 +00:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
|
|
*
|
|
|
|
* This code is free software; you can redistribute it and/or modify it
|
|
|
|
* under the terms of the GNU General Public License version 2 only, as
|
|
|
|
* published by the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
|
|
* version 2 for more details (a copy is included in the LICENSE file that
|
|
|
|
* accompanied this code).
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License version
|
|
|
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
|
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
*
|
|
|
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
|
|
* or visit www.oracle.com if you need additional information or have any
|
|
|
|
* questions.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @test
|
2015-08-31 17:33:34 +01:00
|
|
|
* @bug 8005166 8129962
|
2013-01-21 20:19:53 +00:00
|
|
|
* @summary Add support for static interface methods
|
|
|
|
* Smoke test for static interface method hiding
|
2015-08-31 17:33:34 +01:00
|
|
|
* @library /tools/javac/lib
|
|
|
|
* @modules jdk.compiler/com.sun.tools.javac.api
|
|
|
|
* jdk.compiler/com.sun.tools.javac.code
|
|
|
|
* jdk.compiler/com.sun.tools.javac.comp
|
|
|
|
* jdk.compiler/com.sun.tools.javac.main
|
|
|
|
* jdk.compiler/com.sun.tools.javac.tree
|
|
|
|
* jdk.compiler/com.sun.tools.javac.util
|
|
|
|
* @build combo.ComboTestHelper
|
|
|
|
* @run main InterfaceMethodHidingTest
|
2013-01-21 20:19:53 +00:00
|
|
|
*/
|
|
|
|
|
2015-08-31 17:33:34 +01:00
|
|
|
import java.io.IOException;
|
2013-01-21 20:19:53 +00:00
|
|
|
|
2015-08-31 17:33:34 +01:00
|
|
|
import combo.ComboInstance;
|
|
|
|
import combo.ComboParameter;
|
|
|
|
import combo.ComboTask.Result;
|
|
|
|
import combo.ComboTestHelper;
|
2013-01-21 20:19:53 +00:00
|
|
|
|
2015-08-31 17:33:34 +01:00
|
|
|
public class InterfaceMethodHidingTest extends ComboInstance<InterfaceMethodHidingTest> {
|
2013-01-21 20:19:53 +00:00
|
|
|
|
2015-08-31 17:33:34 +01:00
|
|
|
enum SignatureKind implements ComboParameter {
|
|
|
|
VOID_INTEGER("void m(Integer s)", false),
|
|
|
|
STRING_INTEGER("String m(Integer s)", true),
|
|
|
|
VOID_STRING("void m(String s)", false),
|
|
|
|
STRING_STRING("String m(String s)", true);
|
2013-01-21 20:19:53 +00:00
|
|
|
|
|
|
|
String sigStr;
|
2015-08-31 17:33:34 +01:00
|
|
|
boolean needsReturn;
|
2013-01-21 20:19:53 +00:00
|
|
|
|
2015-08-31 17:33:34 +01:00
|
|
|
SignatureKind(String sigStr, boolean needsReturn) {
|
2013-01-21 20:19:53 +00:00
|
|
|
this.sigStr = sigStr;
|
2015-08-31 17:33:34 +01:00
|
|
|
this.needsReturn = needsReturn;
|
2013-01-21 20:19:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
boolean overrideEquivalentWith(SignatureKind s2) {
|
|
|
|
switch (this) {
|
|
|
|
case VOID_INTEGER:
|
|
|
|
case STRING_INTEGER:
|
|
|
|
return s2 == VOID_INTEGER || s2 == STRING_INTEGER;
|
|
|
|
case VOID_STRING:
|
|
|
|
case STRING_STRING:
|
|
|
|
return s2 == VOID_STRING || s2 == STRING_STRING;
|
|
|
|
default:
|
|
|
|
throw new AssertionError("bad signature kind");
|
|
|
|
}
|
|
|
|
}
|
2015-08-31 17:33:34 +01:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public String expand(String optParameter) {
|
|
|
|
return sigStr;
|
|
|
|
}
|
2013-01-21 20:19:53 +00:00
|
|
|
}
|
|
|
|
|
2015-08-31 17:33:34 +01:00
|
|
|
enum MethodKind implements ComboParameter {
|
|
|
|
VIRTUAL("#{SIG[#IDX]};"),
|
|
|
|
STATIC("static #{SIG[#IDX]} { #{BODY[#IDX]}; #{RET.#IDX} }"),
|
|
|
|
DEFAULT("default #{SIG[#IDX]} { #{BODY[#IDX]}; #{RET.#IDX} }");
|
2013-01-21 20:19:53 +00:00
|
|
|
|
|
|
|
String methTemplate;
|
|
|
|
|
2015-08-31 17:33:34 +01:00
|
|
|
MethodKind(String methTemplate) {
|
2013-01-21 20:19:53 +00:00
|
|
|
this.methTemplate = methTemplate;
|
|
|
|
}
|
|
|
|
|
|
|
|
boolean inherithed() {
|
|
|
|
return this != STATIC;
|
|
|
|
}
|
|
|
|
|
|
|
|
static boolean overrides(MethodKind mk1, SignatureKind sk1, MethodKind mk2, SignatureKind sk2) {
|
|
|
|
return sk1 == sk2 &&
|
|
|
|
mk2.inherithed() &&
|
|
|
|
mk1 != STATIC;
|
|
|
|
}
|
|
|
|
|
2015-08-31 17:33:34 +01:00
|
|
|
@Override
|
|
|
|
public String expand(String optParameter) {
|
|
|
|
return methTemplate.replaceAll("#IDX", optParameter);
|
2013-01-21 20:19:53 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-08-31 17:33:34 +01:00
|
|
|
enum BodyExpr implements ComboParameter {
|
2013-01-21 20:19:53 +00:00
|
|
|
NONE(""),
|
|
|
|
THIS("Object o = this");
|
|
|
|
|
|
|
|
String bodyExprStr;
|
|
|
|
|
|
|
|
BodyExpr(String bodyExprStr) {
|
|
|
|
this.bodyExprStr = bodyExprStr;
|
|
|
|
}
|
|
|
|
|
|
|
|
boolean allowed(MethodKind mk) {
|
|
|
|
return this == NONE ||
|
|
|
|
mk != MethodKind.STATIC;
|
|
|
|
}
|
|
|
|
|
2015-08-31 17:33:34 +01:00
|
|
|
@Override
|
|
|
|
public String expand(String optParameter) {
|
|
|
|
return bodyExprStr;
|
2013-01-21 20:19:53 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-08-31 17:33:34 +01:00
|
|
|
public static void main(String... args) throws Exception {
|
|
|
|
new ComboTestHelper<InterfaceMethodHidingTest>()
|
|
|
|
.withArrayDimension("SIG", (x, sig, idx) -> x.signatureKinds[idx] = sig, 3, SignatureKind.values())
|
|
|
|
.withArrayDimension("BODY", (x, body, idx) -> x.bodyExprs[idx] = body, 3, BodyExpr.values())
|
|
|
|
.withArrayDimension("MET", (x, meth, idx) -> x.methodKinds[idx] = meth, 3, MethodKind.values())
|
|
|
|
.run(InterfaceMethodHidingTest::new);
|
2013-01-21 20:19:53 +00:00
|
|
|
}
|
|
|
|
|
2015-08-31 17:33:34 +01:00
|
|
|
MethodKind[] methodKinds = new MethodKind[3];
|
|
|
|
SignatureKind[] signatureKinds = new SignatureKind[3];
|
|
|
|
BodyExpr[] bodyExprs = new BodyExpr[3];
|
2013-01-21 20:19:53 +00:00
|
|
|
|
2015-08-31 17:33:34 +01:00
|
|
|
String template = "interface Sup {\n" +
|
2013-01-21 20:19:53 +00:00
|
|
|
" default void sup() { }\n" +
|
|
|
|
"}\n" +
|
|
|
|
"interface A extends Sup {\n" +
|
2015-08-31 17:33:34 +01:00
|
|
|
" #{MET[0].0}\n" +
|
2013-01-21 20:19:53 +00:00
|
|
|
"}\n" +
|
|
|
|
"interface B extends A, Sup {\n" +
|
2015-08-31 17:33:34 +01:00
|
|
|
" #{MET[1].1}\n" +
|
2013-01-21 20:19:53 +00:00
|
|
|
"}\n" +
|
|
|
|
"interface C extends B, Sup {\n" +
|
2015-08-31 17:33:34 +01:00
|
|
|
" #{MET[2].2}\n" +
|
2013-01-21 20:19:53 +00:00
|
|
|
"}\n";
|
|
|
|
|
2015-08-31 17:33:34 +01:00
|
|
|
@Override
|
|
|
|
public void doWork() throws IOException {
|
|
|
|
check(newCompilationTask()
|
|
|
|
.withOption("-XDallowStaticInterfaceMethods")
|
|
|
|
.withSourceFromTemplate(template, this::returnExpr)
|
|
|
|
.analyze());
|
2013-01-21 20:19:53 +00:00
|
|
|
}
|
|
|
|
|
2015-08-31 17:33:34 +01:00
|
|
|
ComboParameter returnExpr(String name) {
|
|
|
|
switch (name) {
|
|
|
|
case "RET":
|
|
|
|
return optParameter -> {
|
|
|
|
int idx = new Integer(optParameter);
|
|
|
|
return signatureKinds[idx].needsReturn ? "return null;" : "return;";
|
|
|
|
};
|
|
|
|
default:
|
|
|
|
return null;
|
2013-01-21 20:19:53 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-08-31 17:33:34 +01:00
|
|
|
void check(Result<?> res) {
|
|
|
|
boolean errorExpected = !bodyExprs[0].allowed(methodKinds[0]) ||
|
|
|
|
!bodyExprs[1].allowed(methodKinds[1]) ||
|
|
|
|
!bodyExprs[2].allowed(methodKinds[2]);
|
2013-01-21 20:19:53 +00:00
|
|
|
|
2015-08-31 17:33:34 +01:00
|
|
|
if (methodKinds[0].inherithed()) {
|
|
|
|
errorExpected |= signatureKinds[1].overrideEquivalentWith(signatureKinds[0]) &&
|
|
|
|
!MethodKind.overrides(methodKinds[1], signatureKinds[1], methodKinds[0], signatureKinds[0]) ||
|
|
|
|
signatureKinds[2].overrideEquivalentWith(signatureKinds[0]) &&
|
|
|
|
!MethodKind.overrides(methodKinds[2], signatureKinds[2], methodKinds[0], signatureKinds[0]);
|
2013-01-21 20:19:53 +00:00
|
|
|
}
|
|
|
|
|
2015-08-31 17:33:34 +01:00
|
|
|
if (methodKinds[1].inherithed()) {
|
|
|
|
errorExpected |= signatureKinds[2].overrideEquivalentWith(signatureKinds[1]) &&
|
|
|
|
!MethodKind.overrides(methodKinds[2], signatureKinds[2], methodKinds[1], signatureKinds[1]);
|
2013-01-21 20:19:53 +00:00
|
|
|
}
|
|
|
|
|
2015-08-31 17:33:34 +01:00
|
|
|
if (res.hasErrors() != errorExpected) {
|
|
|
|
fail("Problem when compiling source:\n" + res.compilationInfo() +
|
|
|
|
"\nfound error: " + res.hasErrors());
|
2013-01-21 20:19:53 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|