1 package jdk.incubator.code.dialect.java;
 2 
 3 import jdk.incubator.code.Block;
 4 import jdk.incubator.code.CodeContext;
 5 import jdk.incubator.code.CodeTransformer;
 6 import jdk.incubator.code.Op;
 7 
 8 import java.lang.invoke.MethodHandles;
 9 import java.util.Optional;
10 
11 import static jdk.incubator.code.dialect.core.CoreOp.constant;
12 import static jdk.incubator.code.dialect.java.JavaOp.JavaExpression.ConstantExpressionEvaluator;
13 
14 /**
15  * A transformer that replace every operation that model a constant expression with its value.
16  */
17 public class ConstantExpressionTransformer implements CodeTransformer {
18     private final ConstantExpressionEvaluator constantExpressionEvaluator;
19 
20     private ConstantExpressionTransformer(ConstantExpressionEvaluator constantExpressionEvaluator) {
21         this.constantExpressionEvaluator = constantExpressionEvaluator;
22     }
23 
24     @Override
25     public Block.Builder acceptOp(Block.Builder b, Op op) {
26         Optional<Object> v = constantExpressionEvaluator.evaluate(op.result());
27         if (v.isPresent()) {
28             Op.Result c = b.op(constant(op.resultType(), v.get()));
29             b.context().mapValue(op.result(), c);
30         } else {
31             b.op(op);
32         }
33         return b;
34     }
35 
36     public static Op transform(MethodHandles.Lookup l, Op op) {
37         return op.transform(CodeContext.create(), new ConstantExpressionTransformer(new ConstantExpressionEvaluator(l)));
38     }
39 }