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 }