1 /*
2 * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 import jdk.incubator.code.CodeReflection;
25 import java.math.BigDecimal;
26 import java.util.List;
27
28 /*
29 * @test
30 * @summary Smoke test for code reflection with new expressions.
31 * @modules jdk.incubator.code
32 * @build NewTest
33 * @build CodeReflectionTester
34 * @run main CodeReflectionTester NewTest
35 */
36
37 public class NewTest {
38
39 @CodeReflection
40 @IR("""
41 func @"test0" (%0 : java.type:"NewTest")java.type:"void" -> {
42 %1 : java.type:"java.lang.String" = constant @"1";
43 %2 : java.type:"java.math.BigDecimal" = new %1 @java.ref:"java.math.BigDecimal::(java.lang.String)";
44 %3 : Var<java.type:"java.math.BigDecimal"> = var %2 @"a";
45 return;
46 };
47 """)
48 void test0() {
49 BigDecimal a = new BigDecimal("1");
50 }
51
52 static class A {
53 A() {}
54
55 A(int i, int j) {}
56 }
57
58 @CodeReflection
59 @IR("""
60 func @"test1" (%0 : java.type:"NewTest")java.type:"void" -> {
61 %1 : java.type:"NewTest$A" = new @java.ref:"NewTest$A::()";
62 %2 : Var<java.type:"NewTest$A"> = var %1 @"a";
63 return;
64 };
65 """)
66 void test1() {
67 A a = new A();
68 }
69
70 @CodeReflection
71 @IR("""
72 func @"test2" (%0 : java.type:"NewTest")java.type:"void" -> {
73 %1 : java.type:"int" = constant @1;
74 %2 : java.type:"int" = constant @2;
75 %3 : java.type:"NewTest$A" = new %1 %2 @java.ref:"NewTest$A::(int, int)";
76 %4 : Var<java.type:"NewTest$A"> = var %3 @"a";
77 return;
78 };
79 """)
80 void test2() {
81 A a = new A(1, 2);
82 }
83
84 class B {
85 B() {}
86
87 B(int i, int j) {}
88
89 class C {
90 }
91 }
92
93 B f;
94
95 B b() { return f; }
96
97 @CodeReflection
98 @IR("""
99 func @"test3" (%0 : java.type:"NewTest")java.type:"void" -> {
100 %1 : java.type:"NewTest::B" = new %0 @java.ref:"NewTest::B::(NewTest)";
101 %2 : Var<java.type:"NewTest::B"> = var %1 @"b";
102 return;
103 };
104 """)
105 void test3() {
106 B b = new B();
107 }
108
109 @CodeReflection
110 @IR("""
111 func @"test4" (%0 : java.type:"NewTest")java.type:"void" -> {
112 %1 : java.type:"int" = constant @1;
113 %2 : java.type:"int" = constant @2;
114 %3 : java.type:"NewTest::B" = new %0 %1 %2 @java.ref:"NewTest::B::(NewTest, int, int)";
115 %4 : Var<java.type:"NewTest::B"> = var %3 @"b";
116 return;
117 };
118 """)
119 void test4() {
120 B b = new B(1, 2);
121 }
122
123 @CodeReflection
124 @IR("""
125 func @"test5" (%0 : java.type:"NewTest")java.type:"void" -> {
126 %1 : java.type:"NewTest::B" = new %0 @java.ref:"NewTest::B::(NewTest)";
127 %2 : Var<java.type:"NewTest::B"> = var %1 @"b";
128 return;
129 };
130 """)
131 void test5() {
132 B b = this.new B();
133 }
134
135 @CodeReflection
136 @IR("""
137 func @"test6" (%0 : java.type:"NewTest")java.type:"void" -> {
138 %1 : java.type:"NewTest::B" = field.load %0 @java.ref:"NewTest::f:NewTest::B";
139 %2 : java.type:"NewTest::B::C" = new %1 @java.ref:"NewTest::B::C::(NewTest::B)";
140 %3 : Var<java.type:"NewTest::B::C"> = var %2 @"c";
141 return;
142 };
143 """)
144 void test6() {
145 B.C c = f.new C();
146 }
147
148 @CodeReflection
149 @IR("""
150 func @"test7" (%0 : java.type:"NewTest")java.type:"void" -> {
151 %1 : java.type:"NewTest::B" = invoke %0 @java.ref:"NewTest::b():NewTest::B";
152 %2 : java.type:"NewTest::B::C" = new %1 @java.ref:"NewTest::B::C::(NewTest::B)";
153 %3 : Var<java.type:"NewTest::B::C"> = var %2 @"c";
154 return;
155 };
156 """)
157 void test7() {
158 B.C c = b().new C();
159 }
160
161 static class AG<T> {
162 AG(List<T> l) {}
163 }
164
165 @CodeReflection
166 @IR("""
167 func @"test8" (%0 : java.type:"NewTest", %1 : java.type:"java.util.List<java.lang.String>")java.type:"void" -> {
168 %2 : Var<java.type:"java.util.List<java.lang.String>"> = var %1 @"l";
169 %3 : java.type:"java.util.List<java.lang.String>" = var.load %2;
170 %4 : java.type:"NewTest$AG<java.lang.String>" = new %3 @java.ref:"NewTest$AG::(java.util.List)";
171 %5 : Var<java.type:"NewTest$AG<java.lang.String>"> = var %4 @"a";
172 return;
173 };
174 """)
175 void test8(List<String> l) {
176 AG<String> a = new AG<>(l);
177 }
178
179 class BG<T> {
180 BG(List<T> l) {}
181
182 class CG<U> {
183 CG(List<U> l) {}
184 }
185 }
186
187 @CodeReflection
188 @IR("""
189 func @"test9" (%0 : java.type:"NewTest", %1 : java.type:"java.util.List<java.lang.String>", %2 : java.type:"java.util.List<java.lang.Number>")java.type:"void" -> {
190 %3 : Var<java.type:"java.util.List<java.lang.String>"> = var %1 @"l1";
191 %4 : Var<java.type:"java.util.List<java.lang.Number>"> = var %2 @"l2";
192 %5 : java.type:"java.util.List<java.lang.String>" = var.load %3;
193 %6 : java.type:"NewTest::BG<java.lang.String>" = new %0 %5 @java.ref:"NewTest::BG::(NewTest, java.util.List)";
194 %7 : java.type:"java.util.List<java.lang.Number>" = var.load %4;
195 %8 : java.type:"NewTest::BG<java.lang.String>::CG<java.lang.Number>" = new %6 %7 @java.ref:"NewTest::BG::CG::(NewTest::BG<java.lang.String>, java.util.List)";
196 %9 : Var<java.type:"NewTest::BG<java.lang.String>::CG<java.lang.Number>"> = var %8 @"numberCG";
197 return;
198 };
199 """)
200 void test9(List<String> l1, List<Number> l2) {
201 BG<String>.CG<Number> numberCG = new BG<String>(l1).new CG<Number>(l2);
202 }
203
204
205 @CodeReflection
206 @IR("""
207 func @"test10" (%0 : java.type:"NewTest")java.type:"void" -> {
208 %1 : java.type:"int" = constant @10;
209 %2 : java.type:"int[]" = new %1 @java.ref:"int[]::(int)";
210 %3 : Var<java.type:"int[]"> = var %2 @"i";
211 return;
212 };
213 """)
214 void test10() {
215 int[] i = new int[10];
216 }
217
218 @CodeReflection
219 @IR("""
220 func @"test11" (%0 : java.type:"NewTest", %1 : java.type:"int")java.type:"void" -> {
221 %2 : Var<java.type:"int"> = var %1 @"i";
222 %3 : java.type:"int" = var.load %2;
223 %4 : java.type:"int" = var.load %2;
224 %5 : java.type:"int" = constant @1;
225 %6 : java.type:"int" = add %4 %5;
226 %7 : java.type:"int" = var.load %2;
227 %8 : java.type:"int" = constant @2;
228 %9 : java.type:"int" = add %7 %8;
229 %10 : java.type:"java.lang.String[][][]" = new %3 %6 %9 @java.ref:"java.lang.String[][][]::(int, int, int)";
230 %11 : Var<java.type:"java.lang.String[][][]"> = var %10 @"s";
231 return;
232 };
233 """)
234 void test11(int i) {
235 String[][][] s = new String[i][i + 1][i + 2];
236 }
237 }