/* * Copyright 2013 Guidewire Software, Inc. */ package gw.internal.gosu.parser.expressions; import gw.lang.reflect.IType; import gw.lang.reflect.TypeSystem; import gw.lang.reflect.java.JavaTypes; import gw.lang.IDimension; /** */ public final class DimensionOperandResolver { private IType _numType; private IType _lhsType; private IType _rhsType; private Object _lhsValue; private Object _rhsValue; private char _op; private IDimension _base; public static DimensionOperandResolver resolve( IType exprType, char op, IType lhsType, Object lhsValue, IType rhsType, Object rhsValue ) { return new DimensionOperandResolver( exprType, op, lhsType, lhsValue, rhsType, rhsValue ).resolve(); } private DimensionOperandResolver( IType exprType, char op, IType lhsType, Object lhsValue, IType rhsType, Object rhsValue ) { _numType = exprType; _op = op; _lhsType = lhsType; _lhsValue = lhsValue; _rhsType = rhsType; _rhsValue = rhsValue; } private DimensionOperandResolver resolve() { if( JavaTypes.IDIMENSION().isAssignableFrom( _numType ) ) { resolveNumberTypeAndValues(); } return this; } private void resolveNumberTypeAndValues() { if( _lhsType == _numType && JavaTypes.IDIMENSION().isAssignableFrom( _lhsType ) ) { _base = (IDimension)_lhsValue; if( _rhsType == _numType ) { _rhsValue = ((IDimension)_rhsValue).toNumber(); } _lhsValue = _base.toNumber(); _numType = TypeSystem.get( _base.numberType() ); } else { _base = (IDimension)_rhsValue; _rhsValue = _base.toNumber(); _numType = TypeSystem.get( _base.numberType() ); } } public IDimension getBase() { return _base; } public IType getRawNumberType() { return _numType; } public Object getLhsValue() { return _lhsValue; } public Object getRhsValue() { return _rhsValue; } }