jdk-24/test/langtools/tools/javac/patterns/UninitializedThisException.java
2024-05-24 06:27:45 +00:00

391 lines
14 KiB
Java

/*
* Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
* 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
* @bug 8332106
* @summary Verify the synthetic catch clauses are generated correctly for constructors
* @enablePreview
* @compile UninitializedThisException.java
* @run main UninitializedThisException
*/
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Objects;
import java.util.function.Supplier;
public class UninitializedThisException extends Base {
public UninitializedThisException(String s1, String s2) {
super(s1, s2);
}
public UninitializedThisException(R o1, R o2, R o3) {
out.println("-pre(" + o1.fail() + ")" +
"-nest(" + o2.fail() + ")" +
"-post(" + o3.fail() + ")");
String val1 = o1 instanceof R(String s, _) ? s : null;
out.println("check1");
this(val1, o2 instanceof R(String s, _) ? s : null);
out.println("check2");
String val2 = o3 instanceof R(String s, _) ? s : null;
out.println("check3");
Objects.requireNonNull(val2);
}
public UninitializedThisException(String o1, R o2, R o3) {
out.println("-nest(" + o2.fail() + ")" +
"-post(" + o3.fail() + ")");
String val1 = o1;
out.println("check1");
this(val1, o2 instanceof R(String s, _) ? s : null);
out.println("check2");
String val2 = o3 instanceof R(String s, _) ? s : null;
out.println("check3");
Objects.requireNonNull(val2);
}
public UninitializedThisException(R o1, String o2, R o3) {
out.println("-pre(" + o1.fail() + ")" +
"-post(" + o3.fail() + ")");
String val1 = o1 instanceof R(String s, _) ? s : null;
out.println("check1");
this(val1, o2);
out.println("check2");
String val2 = o3 instanceof R(String s, _) ? s : null;
out.println("check3");
Objects.requireNonNull(val2);
}
public UninitializedThisException(R o1, R o2, String o3) {
out.println("-pre(" + o1.fail() + ")" +
"-nest(" + o2.fail() + ")");
String val1 = o1 instanceof R(String s, _) ? s : null;
out.println("check1");
this(val1, o2 instanceof R(String s, _) ? s : null);
out.println("check2");
String val2 = o3;
out.println("check3");
Objects.requireNonNull(val2);
}
public UninitializedThisException(R o1, String o2, String o3) {
out.println("-pre(" + o1.fail() + ")");
String val1 = o1 instanceof R(String s, _) ? s : null;
out.println("check1");
this(val1, o2);
out.println("check2");
String val2 = o3;
out.println("check3");
Objects.requireNonNull(val2);
}
public UninitializedThisException(String o1, R o2, String o3) {
out.println("-nest(" + o2.fail() + ")");
String val1 = o1;
out.println("check1");
this(val1, o2 instanceof R(String s, _) ? s : null);
out.println("check2");
String val2 = o3;
out.println("check3");
Objects.requireNonNull(val2);
}
public UninitializedThisException(String o1, String o2, R o3) {
out.println("-post(" + o3.fail() + ")");
String val1 = o1;
out.println("check1");
this(val1, o2);
out.println("check2");
String val2 = o3 instanceof R(String s, _) ? s : null;
out.println("check3");
Objects.requireNonNull(val2);
}
public UninitializedThisException(R o1, R o2, R o3, boolean superMarker) {
out.println("-pre(" + o1.fail() + ")" +
"-nest(" + o2.fail() + ")" +
"-post(" + o3.fail() + ")" +
"-super");
String val1 = o1 instanceof R(String s, _) ? s : null;
out.println("check1");
super(val1, o2 instanceof R(String s, _) ? s : null);
out.println("check2");
String val2 = o3 instanceof R(String s, _) ? s : null;
out.println("check3");
Objects.requireNonNull(val2);
}
public UninitializedThisException(String o1, R o2, R o3, boolean superMarker) {
out.println("-nest(" + o2.fail() + ")" +
"-post(" + o3.fail() + ")" +
"-super");
String val1 = o1;
out.println("check1");
super(val1, o2 instanceof R(String s, _) ? s : null);
out.println("check2");
String val2 = o3 instanceof R(String s, _) ? s : null;
out.println("check3");
Objects.requireNonNull(val2);
}
public UninitializedThisException(R o1, String o2, R o3, boolean superMarker) {
out.println("-pre(" + o1.fail() + ")" +
"-post(" + o3.fail() + ")" +
"-super");
String val1 = o1 instanceof R(String s, _) ? s : null;
out.println("check1");
super(val1, o2);
out.println("check2");
String val2 = o3 instanceof R(String s, _) ? s : null;
out.println("check3");
Objects.requireNonNull(val2);
}
public UninitializedThisException(R o1, R o2, String o3, boolean superMarker) {
out.println("-pre(" + o1.fail() + ")" +
"-nest(" + o2.fail() + ")" +
"-super");
String val1 = o1 instanceof R(String s, _) ? s : null;
out.println("check1");
super(val1, o2 instanceof R(String s, _) ? s : null);
out.println("check2");
String val2 = o3;
out.println("check3");
Objects.requireNonNull(val2);
}
public UninitializedThisException(R o1, String o2, String o3, boolean superMarker) {
out.println("-pre(" + o1.fail() + ")" +
"-super");
String val1 = o1 instanceof R(String s, _) ? s : null;
out.println("check1");
super(val1, o2);
out.println("check2");
String val2 = o3;
out.println("check3");
Objects.requireNonNull(val2);
}
public UninitializedThisException(String o1, R o2, String o3, boolean superMarker) {
out.println("-nest(" + o2.fail() + ")" +
"-super");
String val1 = o1;
out.println("check1");
super(val1, o2 instanceof R(String s, _) ? s : null);
out.println("check2");
String val2 = o3;
out.println("check3");
Objects.requireNonNull(val2);
}
public UninitializedThisException(String o1, String o2, R o3, boolean superMarker) {
out.println("-post(" + o3.fail() + ")" +
"-super");
String val1 = o1;
out.println("check1");
super(val1, o2);
out.println("check2");
String val2 = o3 instanceof R(String s, _) ? s : null;
out.println("check3");
Objects.requireNonNull(val2);
}
public static void main(String... args) {
runAndCatch(() -> new UninitializedThisException(new R("", true), new R("", false), new R("", false)));
runAndCatch(() -> new UninitializedThisException(new R("", false), new R("", true), new R("", false)));
runAndCatch(() -> new UninitializedThisException(new R("", false), new R("", false), new R("", true)));
new UninitializedThisException(new R("", false), new R("", false), new R("", false));
out.println();
runAndCatch(() -> new UninitializedThisException("", new R("", true), new R("", false)));
runAndCatch(() -> new UninitializedThisException("", new R("", false), new R("", true)));
new UninitializedThisException("", new R("", false), new R("", false));
out.println();
runAndCatch(() -> new UninitializedThisException(new R("", true), "", new R("", false)));
runAndCatch(() -> new UninitializedThisException(new R("", false), "", new R("", true)));
new UninitializedThisException(new R("", false), "", new R("", false));
out.println();
runAndCatch(() -> new UninitializedThisException(new R("", true), new R("", false), ""));
runAndCatch(() -> new UninitializedThisException(new R("", false), new R("", true), ""));
new UninitializedThisException(new R("", false), new R("", false), "");
out.println();
runAndCatch(() -> new UninitializedThisException(new R("", true), "", ""));
new UninitializedThisException(new R("", false), "", "");
out.println();
runAndCatch(() -> new UninitializedThisException("", new R("", true), ""));
new UninitializedThisException("", new R("", false), "");
out.println();
runAndCatch(() -> new UninitializedThisException("", "", new R("", true)));
new UninitializedThisException("", "", new R("", false));
runAndCatch(() -> new UninitializedThisException(new R("", true), new R("", false), new R("", false), true));
runAndCatch(() -> new UninitializedThisException(new R("", false), new R("", true), new R("", false), true));
runAndCatch(() -> new UninitializedThisException(new R("", false), new R("", false), new R("", true), true));
new UninitializedThisException(new R("", false), new R("", false), new R("", false), true);
out.println();
runAndCatch(() -> new UninitializedThisException("", new R("", true), new R("", false), true));
runAndCatch(() -> new UninitializedThisException("", new R("", false), new R("", true), true));
new UninitializedThisException("", new R("", false), new R("", false), true);
out.println();
runAndCatch(() -> new UninitializedThisException(new R("", true), "", new R("", false), true));
runAndCatch(() -> new UninitializedThisException(new R("", false), "", new R("", true), true));
new UninitializedThisException(new R("", false), "", new R("", false), true);
out.println();
runAndCatch(() -> new UninitializedThisException(new R("", true), new R("", false), "", true));
runAndCatch(() -> new UninitializedThisException(new R("", false), new R("", true), "", true));
new UninitializedThisException(new R("", false), new R("", false), "", true);
out.println();
runAndCatch(() -> new UninitializedThisException(new R("", true), "", "", true));
new UninitializedThisException(new R("", false), "", "", true);
out.println();
runAndCatch(() -> new UninitializedThisException("", new R("", true), "", true));
new UninitializedThisException("", new R("", false), "", true);
out.println();
runAndCatch(() -> new UninitializedThisException("", "", new R("", true), true));
new UninitializedThisException("", "", new R("", false), true);
String actualLog = log.toString().replaceAll("\\R", "\n");
String expectedLog = EXPECTED_LOG_PATTERN.replace("${super}", "") +
EXPECTED_LOG_PATTERN.replace("${super}", "-super");
if (!Objects.equals(actualLog, expectedLog)) {
throw new AssertionError("Expected log:\n" + expectedLog +
", but got: " + actualLog);
}
}
static final String EXPECTED_LOG_PATTERN =
"""
-pre(true)-nest(false)-post(false)${super}
-pre(false)-nest(true)-post(false)${super}
check1
-pre(false)-nest(false)-post(true)${super}
check1
check2
-pre(false)-nest(false)-post(false)${super}
check1
check2
check3
-nest(true)-post(false)${super}
check1
-nest(false)-post(true)${super}
check1
check2
-nest(false)-post(false)${super}
check1
check2
check3
-pre(true)-post(false)${super}
-pre(false)-post(true)${super}
check1
check2
-pre(false)-post(false)${super}
check1
check2
check3
-pre(true)-nest(false)${super}
-pre(false)-nest(true)${super}
check1
-pre(false)-nest(false)${super}
check1
check2
check3
-pre(true)${super}
-pre(false)${super}
check1
check2
check3
-nest(true)${super}
check1
-nest(false)${super}
check1
check2
check3
-post(true)${super}
check1
check2
-post(false)${super}
check1
check2
check3
""";
static final StringWriter log = new StringWriter();
static final PrintWriter out = new PrintWriter(log);
static void runAndCatch(Supplier<Object> toRun) {
try {
toRun.get();
throw new AssertionError("Didn't get the expected exception!");
} catch (MatchException ex) {
//OK
}
}
record R(String s, boolean fail) {
public String s() {
if (fail) {
throw new NullPointerException();
} else {
return s;
}
}
}
}
class Base {
public Base(String s1, String s2) {
Objects.requireNonNull(s1);
Objects.requireNonNull(s2);
}
}