Skip to content
Permalink
Browse files
8245147: Refactor and improve utility of test/langtools/tools/javac/v…
…ersions/Versions.java

Reviewed-by: mdoerr
Backport-of: 6cbf57a
  • Loading branch information
GoeLin committed Oct 12, 2021
1 parent 9512c47 commit aa5d5f31751c2d5ad453322871798a0055bee563
Showing with 114 additions and 103 deletions.
  1. +114 −103 test/langtools/tools/javac/versions/Versions.java
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2014, 2020, 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
@@ -23,7 +23,7 @@

/*
* @test
* @bug 4981566 5028634 5094412 6304984 7025786 7025789 8001112 8028545 8000961 8030610 8028546 8188870 8173382 8173382
* @bug 4981566 5028634 5094412 6304984 7025786 7025789 8001112 8028545 8000961 8030610 8028546 8188870 8173382 8173382 8245147
* @summary Check interpretation of -target and -source options
* @modules java.compiler
* jdk.compiler
@@ -43,6 +43,7 @@
import java.util.Arrays;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

/*
* If not explicitly specified the latest source and latest target
@@ -74,27 +75,27 @@ public static void main(String... args) throws IOException {
public static final String LATEST_MAJOR_VERSION = "55.0";

static enum SourceTarget {
SIX(true, "50.0", "6", Versions::checksrc16),
SEVEN(true, "51.0", "7", Versions::checksrc17),
EIGHT(true, "52.0", "8", Versions::checksrc18),
NINE(true, "53.0", "9", Versions::checksrc19),
TEN(true, "54.0", "10", Versions::checksrc110),
ELEVEN(false, "55.0", "11", Versions::checksrc111);
SIX(true, "50.0", "6", Versions::checksrc6),
SEVEN(true, "51.0", "7", Versions::checksrc7),
EIGHT(true, "52.0", "8", Versions::checksrc8),
NINE(true, "53.0", "9", Versions::checksrc9),
TEN(true, "54.0", "10", Versions::checksrc10),
ELEVEN(false, "55.0", "11", Versions::checksrc11);

private final boolean dotOne;
private final String classFileVer;
private final String target;
private final BiConsumer<Versions, String[]> checker;
private final BiConsumer<Versions, List<String>> checker;

private SourceTarget(boolean dotOne, String classFileVer, String target,
BiConsumer<Versions, String[]> checker) {
BiConsumer<Versions, List<String>> checker) {
this.dotOne = dotOne;
this.classFileVer = classFileVer;
this.target = target;
this.checker = checker;
}

public void checksrc(Versions version, String... args) {
public void checksrc(Versions version, List<String> args) {
checker.accept(version, args);
}

@@ -117,7 +118,7 @@ void run() {

check(LATEST_MAJOR_VERSION);
for (String source : VALID_SOURCES) {
check(LATEST_MAJOR_VERSION, "-source " + source);
check(LATEST_MAJOR_VERSION, List.of("-source " + source));
}

// Verify that a -source value less than a -target value is
@@ -129,10 +130,10 @@ void run() {
String classFileVer = st.classFileVer();
String target = st.target();
boolean dotOne = st.dotOne();
check_source_target(dotOne, classFileVer, target, target);
check_source_target(dotOne, List.of(classFileVer, target, target));
for (int j = i; j > 0; j--) {
String source = sourceTargets[j].target();
check_source_target(dotOne, classFileVer, source, target);
check_source_target(dotOne, List.of(classFileVer, source, target));
}
}

@@ -141,19 +142,19 @@ void run() {
for (int i = 0; i < sourceTargets.length; i++) {
SourceTarget st = sourceTargets[i];

st.checksrc(this, "-source " + st.target());
st.checksrc(this, "-source " + st.target(), "-target " + st.target());
st.checksrc(this, List.of("-source " + st.target()));
st.checksrc(this, List.of("-source " + st.target(), "-target " + st.target()));

if (st.dotOne()) {
st.checksrc(this, "-source 1." + st.target());
st.checksrc(this, "-source 1." + st.target(), "-target 1." + st.target());
st.checksrc(this, List.of("-source 1." + st.target()));
st.checksrc(this, List.of("-source 1." + st.target(), "-target 1." + st.target()));
}

if (i == sourceTargets.length) {
// Can use -target without -source setting only for
// most recent target since the most recent source is
// the default.
st.checksrc(this, "-target " + st.target());
st.checksrc(this, List.of("-target " + st.target()));

if (!st.classFileVer().equals(LATEST_MAJOR_VERSION)) {
throw new RuntimeException(st +
@@ -165,14 +166,14 @@ void run() {

// Verify that -source N -target (N-1) is rejected
for (int i = 1 /* Skip zeroth value */; i < sourceTargets.length; i++) {
fail("-source " + sourceTargets[i].target(),
fail(List.of("-source " + sourceTargets[i].target(),
"-target " + sourceTargets[i-1].target(),
"Base.java");
"Base.java"));
}

// Previously supported source/target values
for (String source : RETIRED_SOURCES) {
fail("-source " + source, "-target " + source, "Base.java");
fail(List.of("-source " + source, "-target " + source, "Base.java"));
}

if (failedCases > 0) {
@@ -182,30 +183,34 @@ void run() {

}

protected void printargs(String fname,String... args) {
protected void printargs(String fname, List<String> args) {
System.out.printf("test: %s", fname);
for (String onearg : args) {
System.out.printf(" %s", onearg);
}
System.out.printf("\n", fname);
}

protected void check_source_target(boolean dotOne, String... args) {
protected void check_source_target(boolean dotOne, List<String> args) {
printargs("check_source_target", args);
check_target(dotOne, args[0], args[1], args[2]);
check_target(dotOne, List.of(args.get(0), args.get(1), args.get(2)));
if (dotOne) {
check_target(dotOne, args[0], "1." + args[1], args[2]);
check_target(dotOne, List.of(args.get(0), "1." + args.get(1), args.get(2)));
}
}

protected void check_target(boolean dotOne, String... args) {
check(args[0], "-source " + args[1], "-target " + args[2]);
protected void check_target(boolean dotOne, List<String> args) {
check(args.get(0), List.of("-source " + args.get(1), "-target " + args.get(2)));
if (dotOne) {
check(args[0], "-source " + args[1], "-target 1." + args[2]);
check(args.get(0), List.of("-source " + args.get(1), "-target 1." + args.get(2)));
}
}

protected void check(String major, String... args) {
protected void check(String major) {
check(major, List.of());
}

protected void check(String major, List<String> args) {
printargs("check", args);
List<String> jcargs = new ArrayList<>();
jcargs.add("-Xlint:-options");
@@ -231,78 +236,65 @@ protected void check(String major, String... args) {
}
}

protected void checksrc16(String... args) {
printargs("checksrc16", args);
int asize = args.length;
String[] newargs = new String[asize + 1];
System.arraycopy(args, 0, newargs, 0, asize);
newargs[asize] = "Base.java";
pass(newargs);
newargs[asize] = "New17.java";
fail(newargs);
protected void checksrc6(List<String> args) {
printargs("checksrc6", args);
expectedPass(args, List.of("Base.java"));
expectedFail(args, List.of("New7.java"));
}

protected void checksrc17(String... args) {
printargs("checksrc17", args);
int asize = args.length;
String[] newargs = new String[asize+1];
System.arraycopy(args, 0, newargs,0 , asize);
newargs[asize] = "New17.java";
pass(newargs);
newargs[asize] = "New18.java";
fail(newargs);
protected void checksrc7(List<String> args) {
printargs("checksrc7", args);
expectedPass(args, List.of("New7.java"));
expectedFail(args, List.of("New8.java"));
}

protected void checksrc18(String... args) {
printargs("checksrc18", args);
int asize = args.length;
String[] newargs = new String[asize+1];
System.arraycopy(args, 0, newargs,0 , asize);
newargs[asize] = "New17.java";
pass(newargs);
newargs[asize] = "New18.java";
pass(newargs);
newargs[asize] = "New110.java";
fail(newargs);
protected void checksrc8(List<String> args) {
printargs("checksrc8", args);
expectedPass(args, List.of("New7.java", "New8.java"));
expectedFail(args, List.of("New10.java"));
}

protected void checksrc19(String... args) {
printargs("checksrc19", args);
checksrc18(args);
protected void checksrc9(List<String> args) {
printargs("checksrc9", args);
expectedPass(args, List.of("New7.java", "New8.java"));
expectedFail(args, List.of("New10.java"));
}

protected void checksrc10(List<String> args) {
printargs("checksrc10", args);
expectedPass(args, List.of("New7.java", "New8.java", "New10.java"));
expectedFail(args, List.of("New11.java"));
}

protected void checksrc11(List<String> args) {
printargs("checksrc11", args);
expectedPass(args, List.of("New7.java", "New8.java", "New10.java", "New11.java"));
expectedFail(args, List.of("New14.java"));
}

protected void expected(List<String> args, List<String> fileNames,
Consumer<List<String>> passOrFail) {
ArrayList<String> fullArguments = new ArrayList<>(args);
// Issue compile with each filename in turn.
for(String fileName : fileNames) {
fullArguments.add(fileName);
passOrFail.accept(fullArguments);
fullArguments.remove(fullArguments.size() - 1);
}
}

protected void checksrc110(String... args) {
printargs("checksrc110", args);
int asize = args.length;
String[] newargs = new String[asize+1];
System.arraycopy(args, 0, newargs,0 , asize);
newargs[asize] = "New17.java";
pass(newargs);
newargs[asize] = "New18.java";
pass(newargs);
newargs[asize] = "New110.java";
pass(newargs);
protected void expectedPass(List<String> args, List<String> fileNames) {
expected(args, fileNames, this::pass);
}

protected void checksrc111(String... args) {
printargs("checksrc111", args);
int asize = args.length;
String[] newargs = new String[asize+1];
System.arraycopy(args, 0, newargs,0 , asize);
newargs[asize] = "New17.java";
pass(newargs);
newargs[asize] = "New18.java";
pass(newargs);
newargs[asize] = "New110.java";
pass(newargs);
newargs[asize] = "New111.java";
pass(newargs);
protected void expectedFail(List<String> args, List<String> fileNames) {
expected(args, fileNames, this::fail);
}

protected void pass(String... args) {
protected void pass(List<String> args) {
printargs("pass", args);

List<String> jcargs = new ArrayList<String>();
List<String> jcargs = new ArrayList<>();
jcargs.add("-Xlint:-options");

// add in args conforming to List requrements of JavaCompiler
@@ -337,10 +329,10 @@ protected void pass(String... args) {

}

protected void fail(String... args) {
protected void fail(List<String> args) {
printargs("fail", args);

List<String> jcargs = new ArrayList<String>();
List<String> jcargs = new ArrayList<>();
jcargs.add("-Xlint:-options");

// add in args conforming to List requrements of JavaCompiler
@@ -369,11 +361,13 @@ protected void fail(String... args) {
System.err.println("fail: Compilation erroneously succeeded");
System.err.println("\t arguments:\t" + jcargs);
System.err.println("\t file :\t" + filename);
System.out.println("GLGLGL!!! 6");
System.err.println("GLGLGL!!! 6");
failedCases++;
}
}

protected boolean compile(String sourceFile, List<String>options) {
protected boolean compile(String sourceFile, List<String> options) {
JavaCompiler.CompilationTask jctask;
try (StandardJavaFileManager fm = javacompiler.getStandardFileManager(null, null, null)) {
Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects(sourceFile);
@@ -408,30 +402,30 @@ protected void genSourceFiles() throws IOException{
writeSourceFile("Base.java","public class Base { }\n");

/*
* Create a file with a new feature in 1.7, not in 1.6 : "<>"
* Create a file with a new feature in 7, not in 6 : "<>"
*/
writeSourceFile("New17.java",
writeSourceFile("New7.java",
"import java.util.List;\n" +
"import java.util.ArrayList;\n" +
"class New17 { List<String> s = new ArrayList<>(); }\n"
"class New7 { List<String> s = new ArrayList<>(); }\n"
);

/*
* Create a file with a new feature in 1.8, not in 1.7 : lambda
* Create a file with a new feature in 8, not in 7 : lambda
*/
writeSourceFile("New18.java",
"public class New18 { \n" +
writeSourceFile("New8.java",
"public class New8 { \n" +
" void m() { \n" +
" new Thread(() -> { }); \n" +
" } \n" +
"} \n"
);

/*
* Create a file with a new feature in 1.10, not in 1.9 : var
* Create a file with a new feature in 10, not in 9 : var
*/
writeSourceFile("New110.java",
"public class New110 { \n" +
writeSourceFile("New10.java",
"public class New10 { \n" +
" void m() { \n" +
" var tmp = new Thread(() -> { }); \n" +
" } \n" +
@@ -441,14 +435,31 @@ protected void genSourceFiles() throws IOException{
/*
* Create a file with a new feature in 11, not in 10 : var for lambda parameters
*/
writeSourceFile("New111.java",
"public class New111 { \n" +
" static java.util.function.Function<String,String> f = (var x) -> x.substring(0);\n" +
writeSourceFile("New11.java",
"public class New11 { \n" +
" static java.util.function.Function<String,String> f = (var x) -> x.substring(0); \n" +
" void m(String name) { \n" +
" var tmp = new Thread(() -> { }, f.apply(name)); \n" +
" } \n" +
"} \n"
);

/*
* Create a file with a new feature in 14, not in 13 : switch expressions
*/
writeSourceFile("New14.java",
"public class New14 { \n" +
" static { \n" +
" int i = 5; \n" +
" System.out.println( \n" +
" switch(i) { \n" +
" case 0 -> false; \n" +
" default -> true; \n" +
" } \n" +
" ); \n" +
" } \n" +
"} \n"
);
}

protected boolean checkClassFileVersion

1 comment on commit aa5d5f3

@openjdk-notifier

This comment has been minimized.

Copy link

@openjdk-notifier openjdk-notifier bot commented on aa5d5f3 Oct 12, 2021

Please sign in to comment.