001/* 002 * Copyright 2010-2013 JetBrains s.r.o. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017package org.jetbrains.jet.lang.resolve.constants; 018 019import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; 020import org.jetbrains.jet.lang.psi.JetExpression; 021import org.jetbrains.jet.lang.psi.JetQualifiedExpression; 022import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; 023import org.jetbrains.jet.lang.resolve.BindingContext; 024import org.jetbrains.jet.lang.resolve.BindingTrace; 025import org.jetbrains.jet.lang.resolve.name.Name; 026import org.jetbrains.jet.lang.types.expressions.OperatorConventions; 027import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; 028 029import static org.jetbrains.jet.lang.types.expressions.OperatorConventions.*; 030import static org.jetbrains.jet.lang.types.expressions.OperatorConventions.BYTE; 031import static org.jetbrains.jet.lang.types.expressions.OperatorConventions.INT; 032 033public class ConstantUtils { 034 035 public static void propagateConstantValues(JetQualifiedExpression expression, BindingTrace trace, JetSimpleNameExpression selectorExpression) { 036 JetExpression receiverExpression = expression.getReceiverExpression(); 037 CompileTimeConstant<?> receiverValue = trace.getBindingContext().get(BindingContext.COMPILE_TIME_VALUE, receiverExpression); 038 CompileTimeConstant<?> wholeExpressionValue = trace.getBindingContext().get(BindingContext.COMPILE_TIME_VALUE, expression); 039 DeclarationDescriptor declarationDescriptor = trace.getBindingContext().get(BindingContext.REFERENCE_TARGET, selectorExpression); 040 if (wholeExpressionValue == null && receiverValue != null && !(receiverValue instanceof ErrorValue) && receiverValue.getValue() instanceof Number 041 && KotlinBuiltIns.getInstance().getNumber() == declarationDescriptor) { 042 Number value = (Number) receiverValue.getValue(); 043 Name referencedName = selectorExpression.getReferencedNameAsName(); 044 if (OperatorConventions.NUMBER_CONVERSIONS.contains(referencedName)) { 045 if (DOUBLE.equals(referencedName)) { 046 trace.record(BindingContext.COMPILE_TIME_VALUE, expression, new DoubleValue(value.doubleValue())); 047 } 048 else if (FLOAT.equals(referencedName)) { 049 trace.record(BindingContext.COMPILE_TIME_VALUE, expression, new FloatValue(value.floatValue())); 050 } 051 else if (LONG.equals(referencedName)) { 052 trace.record(BindingContext.COMPILE_TIME_VALUE, expression, new LongValue(value.longValue())); 053 } 054 else if (SHORT.equals(referencedName)) { 055 trace.record(BindingContext.COMPILE_TIME_VALUE, expression, new ShortValue(value.shortValue())); 056 } 057 else if (BYTE.equals(referencedName)) { 058 trace.record(BindingContext.COMPILE_TIME_VALUE, expression, new ByteValue(value.byteValue())); 059 } 060 else if (INT.equals(referencedName)) { 061 trace.record(BindingContext.COMPILE_TIME_VALUE, expression, new IntValue(value.intValue())); 062 } 063 } 064 } 065 } 066}