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  * @run main Unreflect TestPatterns2
19  * @run junit TestPatterns2
20  * @enablePreview */
21 public class TestPatterns2 {
22 
23     record R<T extends Number> (T n) {}
24 
25     @Reflect
26     static boolean f(Object o) {
27         return o instanceof R(Integer i);
28     }
29 
30     @Test
31     void test() {
32 
33         CoreOp.FuncOp f = getFuncOp("f");
34         System.out.println(f.toText());
35 
36         CoreOp.FuncOp lf = f.transform(CodeTransformer.LOWERING_TRANSFORMER);
37         System.out.println(lf.toText());
38 
39         R[] args = {new R(1), new R(2d)};
40         for (R arg : args) {
41             Assertions.assertEquals(f(arg), Interpreter.invoke(MethodHandles.lookup(), lf, arg));
42         }
43     }
44 
45     static CoreOp.FuncOp getFuncOp(String name) {
46         Optional<Method> om = Stream.of(TestPatterns2.class.getDeclaredMethods())
47                 .filter(m -> m.getName().equals(name))
48                 .findFirst();
49 
50         Method m = om.get();
51         return Op.ofMethod(m).get();
52     }
53 }