author | jlahoda |
Thu, 14 Jun 2018 13:16:21 +0200 | |
changeset 50566 | c0b896fc3f08 |
parent 48723 | 6cb86bf0b51e |
permissions | -rw-r--r-- |
48427
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
1 |
/* |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
2 |
* Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
4 |
* |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
5 |
* This code is free software; you can redistribute it and/or modify it |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
7 |
* published by the Free Software Foundation. |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
8 |
* |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
9 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
10 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
11 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
12 |
* version 2 for more details (a copy is included in the LICENSE file that |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
13 |
* accompanied this code). |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
14 |
* |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
15 |
* You should have received a copy of the GNU General Public License version |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
16 |
* 2 along with this work; if not, write to the Free Software Foundation, |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
17 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
18 |
* |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
19 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
20 |
* or visit www.oracle.com if you need additional information or have any |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
21 |
* questions. |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
22 |
*/ |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
23 |
|
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
24 |
/** |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
25 |
* @test |
48723
6cb86bf0b51e
8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents:
48427
diff
changeset
|
26 |
* @bug 8193125 8196623 |
48427
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
27 |
* @summary test modifiers with java.base |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
28 |
* @library /tools/lib |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
29 |
* @modules |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
30 |
* jdk.compiler/com.sun.tools.javac.api |
50566
c0b896fc3f08
8196618: Create API to list supported values for javac --release option
jlahoda
parents:
48723
diff
changeset
|
31 |
* jdk.compiler/com.sun.tools.javac.jvm |
48427
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
32 |
* jdk.compiler/com.sun.tools.javac.main |
50566
c0b896fc3f08
8196618: Create API to list supported values for javac --release option
jlahoda
parents:
48723
diff
changeset
|
33 |
* jdk.compiler/com.sun.tools.javac.platform |
48427
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
34 |
* jdk.jdeps/com.sun.tools.classfile |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
35 |
* @build toolbox.ToolBox toolbox.JavacTask |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
36 |
* @run main JavaBaseTest |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
37 |
*/ |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
38 |
|
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
39 |
import java.nio.file.Files; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
40 |
import java.nio.file.Path; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
41 |
import java.nio.file.Paths; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
42 |
import java.util.LinkedHashMap; |
50566
c0b896fc3f08
8196618: Create API to list supported values for javac --release option
jlahoda
parents:
48723
diff
changeset
|
43 |
import java.util.LinkedHashSet; |
48427
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
44 |
import java.util.List; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
45 |
import java.util.Map; |
50566
c0b896fc3f08
8196618: Create API to list supported values for javac --release option
jlahoda
parents:
48723
diff
changeset
|
46 |
import java.util.Set; |
c0b896fc3f08
8196618: Create API to list supported values for javac --release option
jlahoda
parents:
48723
diff
changeset
|
47 |
import java.util.stream.StreamSupport; |
48427
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
48 |
|
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
49 |
import com.sun.tools.classfile.Attribute; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
50 |
import com.sun.tools.classfile.Attributes; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
51 |
import com.sun.tools.classfile.ClassFile; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
52 |
import com.sun.tools.classfile.ClassWriter; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
53 |
import com.sun.tools.classfile.Module_attribute; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
54 |
|
50566
c0b896fc3f08
8196618: Create API to list supported values for javac --release option
jlahoda
parents:
48723
diff
changeset
|
55 |
import com.sun.tools.javac.jvm.Target; |
c0b896fc3f08
8196618: Create API to list supported values for javac --release option
jlahoda
parents:
48723
diff
changeset
|
56 |
import com.sun.tools.javac.platform.JDKPlatformProvider; |
c0b896fc3f08
8196618: Create API to list supported values for javac --release option
jlahoda
parents:
48723
diff
changeset
|
57 |
|
48427
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
58 |
import toolbox.JavacTask; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
59 |
import toolbox.Task; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
60 |
import toolbox.ToolBox; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
61 |
|
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
62 |
public class JavaBaseTest { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
63 |
|
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
64 |
public static void main(String... args) throws Exception { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
65 |
JavaBaseTest t = new JavaBaseTest(); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
66 |
t.run(); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
67 |
} |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
68 |
|
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
69 |
final List<List<String>> modifiers = List.of( |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
70 |
List.of("static"), |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
71 |
List.of("transitive"), |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
72 |
List.of("static", "transitive") |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
73 |
); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
74 |
|
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
75 |
enum Mode { SOURCE, CLASS }; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
76 |
|
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
77 |
ToolBox tb = new ToolBox(); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
78 |
int testCount = 0; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
79 |
int errorCount = 0; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
80 |
|
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
81 |
void run() throws Exception { |
50566
c0b896fc3f08
8196618: Create API to list supported values for javac --release option
jlahoda
parents:
48723
diff
changeset
|
82 |
Set<String> targets = new LinkedHashSet<>(); |
c0b896fc3f08
8196618: Create API to list supported values for javac --release option
jlahoda
parents:
48723
diff
changeset
|
83 |
StreamSupport.stream(new JDKPlatformProvider().getSupportedPlatformNames() |
c0b896fc3f08
8196618: Create API to list supported values for javac --release option
jlahoda
parents:
48723
diff
changeset
|
84 |
.spliterator(), |
c0b896fc3f08
8196618: Create API to list supported values for javac --release option
jlahoda
parents:
48723
diff
changeset
|
85 |
false) |
c0b896fc3f08
8196618: Create API to list supported values for javac --release option
jlahoda
parents:
48723
diff
changeset
|
86 |
.filter(p -> Integer.parseInt(p) >= 9) |
c0b896fc3f08
8196618: Create API to list supported values for javac --release option
jlahoda
parents:
48723
diff
changeset
|
87 |
.forEach(targets::add); |
c0b896fc3f08
8196618: Create API to list supported values for javac --release option
jlahoda
parents:
48723
diff
changeset
|
88 |
//run without --release: |
c0b896fc3f08
8196618: Create API to list supported values for javac --release option
jlahoda
parents:
48723
diff
changeset
|
89 |
targets.add("current"); |
48427
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
90 |
for (List<String> mods : modifiers) { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
91 |
for (String target : targets) { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
92 |
for (Mode mode : Mode.values()) { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
93 |
test(mods, target, mode); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
94 |
} |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
95 |
} |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
96 |
} |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
97 |
|
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
98 |
System.err.println(testCount + " tests"); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
99 |
if (errorCount > 0) { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
100 |
throw new Exception(errorCount + " errors found"); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
101 |
} |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
102 |
} |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
103 |
|
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
104 |
void test(List<String> mods, String target, Mode mode) { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
105 |
System.err.println("Test " + mods + " " + target + " " + mode); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
106 |
testCount++; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
107 |
try { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
108 |
Path base = Paths.get(String.join("-", mods)) |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
109 |
.resolve(target).resolve(mode.name().toLowerCase()); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
110 |
Files.createDirectories(base); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
111 |
switch (mode) { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
112 |
case SOURCE: |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
113 |
testSource(base, mods, target); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
114 |
break; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
115 |
case CLASS: |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
116 |
testClass(base, mods, target); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
117 |
break; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
118 |
} |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
119 |
} catch (Exception e) { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
120 |
error("Exception: " + e); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
121 |
e.printStackTrace(); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
122 |
} |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
123 |
System.err.println(); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
124 |
} |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
125 |
|
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
126 |
void testSource(Path base, List<String> mods, String target) throws Exception { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
127 |
Path src = base.resolve("src"); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
128 |
tb.writeJavaFiles(src, |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
129 |
"module m { requires " + String.join(" ", mods) + " java.base; }"); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
130 |
Path modules = Files.createDirectories(base.resolve("modules")); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
131 |
boolean expectOK = target.equals("9"); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
132 |
|
48723
6cb86bf0b51e
8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents:
48427
diff
changeset
|
133 |
JavacTask jct = new JavacTask(tb) |
6cb86bf0b51e
8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents:
48427
diff
changeset
|
134 |
.outdir(modules); |
6cb86bf0b51e
8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents:
48427
diff
changeset
|
135 |
|
6cb86bf0b51e
8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents:
48427
diff
changeset
|
136 |
if (target.equals("current")) |
6cb86bf0b51e
8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents:
48427
diff
changeset
|
137 |
jct.options("-XDrawDiagnostics"); |
6cb86bf0b51e
8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents:
48427
diff
changeset
|
138 |
else |
6cb86bf0b51e
8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents:
48427
diff
changeset
|
139 |
jct.options("-XDrawDiagnostics", "--release", target); |
6cb86bf0b51e
8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents:
48427
diff
changeset
|
140 |
|
6cb86bf0b51e
8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents:
48427
diff
changeset
|
141 |
String log = jct.files(tb.findJavaFiles(src)) |
6cb86bf0b51e
8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents:
48427
diff
changeset
|
142 |
.run(expectOK ? Task.Expect.SUCCESS : Task.Expect.FAIL) |
6cb86bf0b51e
8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents:
48427
diff
changeset
|
143 |
.writeAll() |
6cb86bf0b51e
8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents:
48427
diff
changeset
|
144 |
.getOutput(Task.OutputKind.DIRECT); |
48427
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
145 |
|
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
146 |
if (!expectOK) { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
147 |
boolean foundErrorMessage = false; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
148 |
for (String mod : mods) { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
149 |
String key = mod.equals("static") |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
150 |
? "compiler.err.mod.not.allowed.here" |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
151 |
: "compiler.err.modifier.not.allowed.here"; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
152 |
String message = "module-info.java:1:12: " + key + ": " + mod; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
153 |
if (log.contains(message)) { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
154 |
foundErrorMessage = true; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
155 |
} |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
156 |
} |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
157 |
if (!foundErrorMessage) { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
158 |
throw new Exception("expected error message not found"); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
159 |
} |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
160 |
} |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
161 |
} |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
162 |
|
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
163 |
void testClass(Path base, List<String> mods, String target) throws Exception { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
164 |
createClass(base, mods, target); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
165 |
|
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
166 |
Path src = base.resolve("src"); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
167 |
tb.writeJavaFiles(src, |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
168 |
"module mx { requires m; }"); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
169 |
Path modules = Files.createDirectories(base.resolve("modules")); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
170 |
|
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
171 |
boolean expectOK = target.equals("9"); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
172 |
String log = new JavacTask(tb) |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
173 |
.outdir(modules) |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
174 |
.options("-XDrawDiagnostics", |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
175 |
"--module-path", base.resolve("test-modules").toString()) |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
176 |
.files(tb.findJavaFiles(src)) |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
177 |
.run(expectOK ? Task.Expect.SUCCESS : Task.Expect.FAIL) |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
178 |
.writeAll() |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
179 |
.getOutput(Task.OutputKind.DIRECT); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
180 |
|
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
181 |
if (!expectOK) { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
182 |
boolean foundErrorMessage = false; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
183 |
for (String mod : mods) { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
184 |
String flag = mod.equals("static") |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
185 |
? "ACC_STATIC_PHASE (0x0040)" |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
186 |
: "ACC_TRANSITIVE (0x0020)"; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
187 |
String message = "- compiler.err.cant.access: m.module-info," |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
188 |
+ " (compiler.misc.bad.class.file.header: module-info.class," |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
189 |
+ " (compiler.misc.bad.requires.flag: " + flag + ")"; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
190 |
if (log.contains(message)) { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
191 |
foundErrorMessage = true; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
192 |
} |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
193 |
} |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
194 |
if (!foundErrorMessage) { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
195 |
throw new Exception("expected error message not found"); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
196 |
} |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
197 |
} |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
198 |
} |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
199 |
|
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
200 |
void createClass(Path base, List<String> mods, String target) throws Exception { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
201 |
Path src1 = base.resolve("interim-src"); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
202 |
tb.writeJavaFiles(src1, |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
203 |
"module m { requires java.base; }"); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
204 |
Path modules1 = Files.createDirectories(base.resolve("interim-modules")); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
205 |
|
48723
6cb86bf0b51e
8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents:
48427
diff
changeset
|
206 |
JavacTask jct = new JavacTask(tb) |
6cb86bf0b51e
8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents:
48427
diff
changeset
|
207 |
.outdir(modules1); |
6cb86bf0b51e
8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents:
48427
diff
changeset
|
208 |
|
6cb86bf0b51e
8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents:
48427
diff
changeset
|
209 |
if (!target.equals("current")) { |
6cb86bf0b51e
8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents:
48427
diff
changeset
|
210 |
jct.options("--release", target); |
6cb86bf0b51e
8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents:
48427
diff
changeset
|
211 |
} |
6cb86bf0b51e
8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents:
48427
diff
changeset
|
212 |
|
6cb86bf0b51e
8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents:
48427
diff
changeset
|
213 |
jct.files(tb.findJavaFiles(src1)) |
6cb86bf0b51e
8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents:
48427
diff
changeset
|
214 |
.run(Task.Expect.SUCCESS); |
48427
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
215 |
|
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
216 |
ClassFile cf1 = ClassFile.read(modules1.resolve("module-info.class")); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
217 |
|
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
218 |
Map<String,Attribute> attrMap = new LinkedHashMap<>(cf1.attributes.map); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
219 |
Module_attribute modAttr1 = (Module_attribute) attrMap.get("Module"); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
220 |
Module_attribute.RequiresEntry[] requires = |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
221 |
new Module_attribute.RequiresEntry[modAttr1.requires_count]; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
222 |
for (int i = 0; i < modAttr1.requires_count; i++) { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
223 |
Module_attribute.RequiresEntry e1 = modAttr1.requires[i]; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
224 |
int flags = e1.requires_flags; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
225 |
Module_attribute.RequiresEntry e2; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
226 |
if (e1.getRequires(cf1.constant_pool).equals("java.base")) { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
227 |
for (String mod : mods) { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
228 |
switch (mod) { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
229 |
case "static": |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
230 |
flags |= Module_attribute.ACC_STATIC_PHASE; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
231 |
break; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
232 |
case "transitive": |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
233 |
flags |= Module_attribute.ACC_TRANSITIVE; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
234 |
break; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
235 |
} |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
236 |
} |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
237 |
e2 = new Module_attribute.RequiresEntry( |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
238 |
e1.requires_index, |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
239 |
flags, |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
240 |
e1.requires_version_index); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
241 |
} else { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
242 |
e2 = e1; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
243 |
} |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
244 |
requires[i] = e2; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
245 |
} |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
246 |
Module_attribute modAttr2 = new Module_attribute( |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
247 |
modAttr1.attribute_name_index, |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
248 |
modAttr1.module_name, |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
249 |
modAttr1.module_flags, |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
250 |
modAttr1.module_version_index, |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
251 |
requires, |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
252 |
modAttr1.exports, |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
253 |
modAttr1.opens, |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
254 |
modAttr1.uses_index, |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
255 |
modAttr1.provides); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
256 |
attrMap.put("Module", modAttr2); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
257 |
Attributes attributes = new Attributes(attrMap); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
258 |
|
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
259 |
ClassFile cf2 = new ClassFile( |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
260 |
cf1.magic, cf1.minor_version, cf1.major_version, |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
261 |
cf1.constant_pool, cf1.access_flags, |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
262 |
cf1.this_class, cf1.super_class, cf1.interfaces, |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
263 |
cf1.fields, cf1.methods, attributes); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
264 |
Path modInfo = base.resolve("test-modules").resolve("module-info.class"); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
265 |
Files.createDirectories(modInfo.getParent()); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
266 |
new ClassWriter().write(cf2, modInfo.toFile()); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
267 |
} |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
268 |
|
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
269 |
private void error(String message) { |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
270 |
System.err.println("Error: " + message); |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
271 |
errorCount++; |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
272 |
} |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
273 |
} |
b08405cc467a
8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff
changeset
|
274 |