1 import jdk.incubator.code.Reflect;
2 import jdk.incubator.code.CodeTransformer;
3 import jdk.incubator.code.Op;
4 import jdk.incubator.code.dialect.core.CoreOp;
5 import jdk.incubator.code.interpreter.Interpreter;
6 import org.junit.jupiter.api.Assertions;
7 import org.junit.jupiter.api.Test;
8
9 import java.lang.invoke.MethodHandles;
10 import java.lang.reflect.Method;
11 import java.util.Optional;
12 import java.util.stream.Stream;
13
14 /*
15 * @test
16 * @modules jdk.incubator.code
17 * @run junit TestPatterns2
18 * @enablePreview */
19 public class TestPatterns2 {
20
21 record R<T extends Number> (T n) {}
22
23 @Reflect
24 static boolean f(Object o) {
25 return o instanceof R(Integer i);
26 }
27
28 @Test
29 void test() {
30
31 CoreOp.FuncOp f = getFuncOp("f");
32 System.out.println(f.toText());
33
34 CoreOp.FuncOp lf = f.transform(CodeTransformer.LOWERING_TRANSFORMER);
35 System.out.println(lf.toText());
36
37 R[] args = {new R(1), new R(2d)};
38 for (R arg : args) {
39 Assertions.assertEquals(f(arg), Interpreter.invoke(MethodHandles.lookup(), lf, arg));
40 }
41 }
42
43 static CoreOp.FuncOp getFuncOp(String name) {
44 Optional<Method> om = Stream.of(TestPatterns2.class.getDeclaredMethods())
45 .filter(m -> m.getName().equals(name))
46 .findFirst();
47
48 Method m = om.get();
49 return Op.ofMethod(m).get();
50 }
51 }