Use propagation of constant values in evaluator

This commit is contained in:
Natalia Ukhorskaya
2013-11-07 18:10:54 +04:00
parent 0b1dd2d2be
commit c56c2263f0
2 changed files with 15 additions and 13 deletions
@@ -83,11 +83,15 @@ public class ConstantExpressionEvaluator extends JetVisitor<CompileTimeConstant<
@Override
public CompileTimeConstant<?> visitQualifiedExpression(@NotNull JetQualifiedExpression expression, Void data) {
CompileTimeConstant<?> compileTimeConstant = trace.get(BindingContext.COMPILE_TIME_VALUE, expression);
if (compileTimeConstant != null) {
return compileTimeConstant;
}
JetExpression receiverExpression = expression.getReceiverExpression();
JetExpression selectorExpression = expression.getSelectorExpression();
if (receiverExpression instanceof JetConstantExpression && selectorExpression instanceof JetCallExpression) {
CompileTimeConstant<?> constant = ConstantsPackage.propagateConstantValues(expression, trace, (JetCallExpression) selectorExpression);
if (constant != null) {
return constant;
}
}
if (selectorExpression != null) {
return selectorExpression.accept(this, null);
}
@@ -25,31 +25,31 @@ import org.jetbrains.jet.lang.descriptors.FunctionDescriptor
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns
import org.jetbrains.jet.lang.types.expressions.OperatorConventions
public fun propagateConstantValues(expression : JetQualifiedExpression, trace : BindingTrace, selectorExpression : JetCallExpression) {
public fun propagateConstantValues(expression : JetQualifiedExpression, trace : BindingTrace, selectorExpression : JetCallExpression): CompileTimeConstant<out Any>? {
val wholeExpressionValue = trace.getBindingContext().get(BindingContext.COMPILE_TIME_VALUE, expression)
if (wholeExpressionValue != null) {
return
return null
}
val receiverExpression = expression.getReceiverExpression()
val receiverValue = trace.getBindingContext().get(BindingContext.COMPILE_TIME_VALUE, receiverExpression)
if (receiverValue == null || receiverValue is ErrorValue) {
return
return null
}
val calleeExpression = selectorExpression.getCalleeExpression()
if (calleeExpression !is JetSimpleNameExpression) {
return
return null
}
val declarationDescriptor = trace.getBindingContext().get(BindingContext.REFERENCE_TARGET, calleeExpression)
if (declarationDescriptor !is FunctionDescriptor) {
return
return null
}
val returnType = declarationDescriptor.getReturnType()
if (returnType == null || !KotlinBuiltIns.getInstance().isPrimitiveType(returnType)) {
return
return null
}
val referencedName = calleeExpression.getReferencedNameAsName()
@@ -80,9 +80,7 @@ public fun propagateConstantValues(expression : JetQualifiedExpression, trace :
else -> null
}
if (compileTimeValue != null) {
trace.record(BindingContext.COMPILE_TIME_VALUE, expression,compileTimeValue)
}
return compileTimeValue
}