/* * Copyright (C) 2011 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jboss.errai.codegen.builder.impl; import org.jboss.errai.codegen.ArithmeticExpression; import org.jboss.errai.codegen.ArithmeticOperator; import org.jboss.errai.codegen.Statement; import org.jboss.errai.codegen.meta.MetaClass; import org.jboss.errai.codegen.meta.MetaClassFactory; /** * @author Christian Sadilek <csadilek@redhat.com> */ public class ArithmeticExpressionBuilder extends ExpressionBuilder<ArithmeticOperator> implements ArithmeticExpression { public ArithmeticExpressionBuilder() {} public ArithmeticExpressionBuilder(Statement rhs, ArithmeticOperator operator) { super(rhs, operator); } public ArithmeticExpressionBuilder(Object rhs, ArithmeticOperator operator) { super(rhs, operator); } public ArithmeticExpressionBuilder(Statement lhs, Statement rhs, ArithmeticOperator operator) { super(lhs, rhs, operator); } public ArithmeticExpressionBuilder(Object lhs, Object rhs, ArithmeticOperator operator) { super(lhs, rhs, operator); } public static ArithmeticExpression create(Statement lhs) { return new ArithmeticExpressionBuilder(lhs, null, null); } public static ArithmeticExpression create(ArithmeticOperator operator, Object rhs) { return new ArithmeticExpressionBuilder(rhs, operator); } public static ArithmeticExpression create(Object lhs, ArithmeticOperator operator, Object rhs) { return new ArithmeticExpressionBuilder(lhs, rhs, operator); } @Override public MetaClass getType() { Class<?> lhsType = null; if (lhs != null) { lhsType = lhs.getType().asUnboxed().asClass(); } Class<?> rhsType = null; if (rhs != null) { rhsType = rhs.getType().asUnboxed().asClass(); } return MetaClassFactory.get(promote(lhsType, rhsType)); } /** * Implements unary or binary numeric promotion <a href= * "http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2" * >according to the JLS</a>. * * @param lhs * the left-hand-side type as an unboxed numeric type. Can be null if * there is no left-hand-side operand. * @param lhs * the right-hand-side type as an unboxed numeric type. Can be null * if there is no right-hand-side operand. * @return The unboxed numeric class type that the expression results in. */ private Class<?> promote(Class<?> lhs, Class<?> rhs) { if (lhs == double.class || rhs == double.class) { return double.class; } if (lhs == float.class || rhs == float.class) { return float.class; } if (lhs == long.class || rhs == long.class) { return long.class; } return int.class; } }