Get rid of static function ConstantExpressionEvaluator.evaluateToConstant

This commit is contained in:
Pavel V. Talanov
2015-07-23 17:13:50 +03:00
parent 6698b3b070
commit 99e8ba1947
5 changed files with 21 additions and 19 deletions
@@ -81,6 +81,7 @@ public abstract class MemberCodegen<T extends JetElement/* TODO: & JetDeclaratio
private NameGenerator inlineNameGenerator; private NameGenerator inlineNameGenerator;
private SourceMapper sourceMapper; private SourceMapper sourceMapper;
private final ConstantExpressionEvaluator constantExpressionEvaluator;
public MemberCodegen( public MemberCodegen(
@NotNull GenerationState state, @NotNull GenerationState state,
@@ -98,6 +99,7 @@ public abstract class MemberCodegen<T extends JetElement/* TODO: & JetDeclaratio
this.functionCodegen = new FunctionCodegen(context, v, state, this); this.functionCodegen = new FunctionCodegen(context, v, state, this);
this.propertyCodegen = new PropertyCodegen(context, v, functionCodegen, this); this.propertyCodegen = new PropertyCodegen(context, v, functionCodegen, this);
this.parentCodegen = parentCodegen; this.parentCodegen = parentCodegen;
this.constantExpressionEvaluator = new ConstantExpressionEvaluator(state.getModule().getBuiltIns());
} }
protected MemberCodegen(@NotNull MemberCodegen<T> wrapped, T declaration, FieldOwnerContext codegenContext) { protected MemberCodegen(@NotNull MemberCodegen<T> wrapped, T declaration, FieldOwnerContext codegenContext) {
@@ -397,7 +399,7 @@ public abstract class MemberCodegen<T extends JetElement/* TODO: & JetDeclaratio
) { ) {
if (property.isVar() && initializer != null) { if (property.isVar() && initializer != null) {
BindingTrace tempTrace = TemporaryBindingTrace.create(state.getBindingTrace(), "property initializer"); BindingTrace tempTrace = TemporaryBindingTrace.create(state.getBindingTrace(), "property initializer");
return ConstantExpressionEvaluator.evaluateToConstantValue(initializer, tempTrace, propertyDescriptor.getType()); return constantExpressionEvaluator.evaluateToConstantValue(initializer, tempTrace, propertyDescriptor.getType());
} }
return propertyDescriptor.getCompileTimeInitializer(); return propertyDescriptor.getCompileTimeInitializer();
} }
@@ -68,6 +68,7 @@ public class DescriptorResolver {
@NotNull private final DelegatedPropertyResolver delegatedPropertyResolver; @NotNull private final DelegatedPropertyResolver delegatedPropertyResolver;
@NotNull private final StorageManager storageManager; @NotNull private final StorageManager storageManager;
@NotNull private final KotlinBuiltIns builtIns; @NotNull private final KotlinBuiltIns builtIns;
@NotNull private final ConstantExpressionEvaluator constantExpressionEvaluator;
public DescriptorResolver( public DescriptorResolver(
@NotNull AnnotationResolver annotationResolver, @NotNull AnnotationResolver annotationResolver,
@@ -75,7 +76,8 @@ public class DescriptorResolver {
@NotNull DelegatedPropertyResolver delegatedPropertyResolver, @NotNull DelegatedPropertyResolver delegatedPropertyResolver,
@NotNull ExpressionTypingServices expressionTypingServices, @NotNull ExpressionTypingServices expressionTypingServices,
@NotNull StorageManager storageManager, @NotNull StorageManager storageManager,
@NotNull TypeResolver typeResolver @NotNull TypeResolver typeResolver,
@NotNull ConstantExpressionEvaluator constantExpressionEvaluator
) { ) {
this.annotationResolver = annotationResolver; this.annotationResolver = annotationResolver;
this.builtIns = builtIns; this.builtIns = builtIns;
@@ -83,6 +85,7 @@ public class DescriptorResolver {
this.expressionTypingServices = expressionTypingServices; this.expressionTypingServices = expressionTypingServices;
this.storageManager = storageManager; this.storageManager = storageManager;
this.typeResolver = typeResolver; this.typeResolver = typeResolver;
this.constantExpressionEvaluator = constantExpressionEvaluator;
} }
public List<JetType> resolveSupertypes( public List<JetType> resolveSupertypes(
@@ -848,7 +851,7 @@ public class DescriptorResolver {
public ConstantValue<?> invoke() { public ConstantValue<?> invoke() {
JetExpression initializer = variable.getInitializer(); JetExpression initializer = variable.getInitializer();
JetType initializerType = expressionTypingServices.safeGetType(scope, initializer, variableType, dataFlowInfo, trace); JetType initializerType = expressionTypingServices.safeGetType(scope, initializer, variableType, dataFlowInfo, trace);
return ConstantExpressionEvaluator.evaluateToConstantValue(initializer, trace, initializerType); return constantExpressionEvaluator.evaluateToConstantValue(initializer, trace, initializerType);
} }
}, null) }, null)
); );
@@ -44,9 +44,10 @@ import java.util.HashMap
import kotlin.platform.platformStatic import kotlin.platform.platformStatic
public class ConstantExpressionEvaluator( public class ConstantExpressionEvaluator(
internal val constantValueFactory: ConstantValueFactory,
internal val builtIns: KotlinBuiltIns internal val builtIns: KotlinBuiltIns
) { ) {
internal val constantValueFactory = ConstantValueFactory(builtIns)
public fun updateNumberType( public fun updateNumberType(
numberType: JetType, numberType: JetType,
expression: JetExpression?, expression: JetExpression?,
@@ -201,18 +202,16 @@ public class ConstantExpressionEvaluator(
return if (!constant.isError) constant else null return if (!constant.isError) constant else null
} }
companion object { public fun evaluateToConstantValue(
platformStatic public fun evaluateToConstantValue( expression: JetExpression,
expression: JetExpression, trace: BindingTrace,
trace: BindingTrace, expectedType: JetType
expectedType: JetType ): ConstantValue<*>? {
): ConstantValue<*>? { return evaluateExpression(expression, trace, expectedType)?.toConstantValue(expectedType)
val builtIns = KotlinBuiltIns.getInstance() }
return ConstantExpressionEvaluator(ConstantValueFactory(builtIns), builtIns).
evaluateExpression(expression, trace, expectedType)?.
toConstantValue(expectedType)
}
companion object {
platformStatic public fun getConstant(expression: JetExpression, bindingContext: BindingContext): CompileTimeConstant<*>? { platformStatic public fun getConstant(expression: JetExpression, bindingContext: BindingContext): CompileTimeConstant<*>? {
val constant = getPossiblyErrorConstant(expression, bindingContext) ?: return null val constant = getPossiblyErrorConstant(expression, bindingContext) ?: return null
return if (!constant.isError) constant else null return if (!constant.isError) constant else null
@@ -26,7 +26,6 @@ import org.jetbrains.kotlin.lexer.JetTokens;
import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.BindingContext;
import org.jetbrains.kotlin.resolve.BindingTrace; import org.jetbrains.kotlin.resolve.BindingTrace;
import org.jetbrains.kotlin.resolve.calls.ArgumentTypeResolver;
import org.jetbrains.kotlin.resolve.calls.checkers.AdditionalTypeChecker; import org.jetbrains.kotlin.resolve.calls.checkers.AdditionalTypeChecker;
import org.jetbrains.kotlin.resolve.calls.context.ResolutionContext; import org.jetbrains.kotlin.resolve.calls.context.ResolutionContext;
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo; import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo;
@@ -186,7 +185,7 @@ public class DataFlowAnalyzer {
} }
if (expression instanceof JetConstantExpression) { if (expression instanceof JetConstantExpression) {
ConstantValue<?> constantValue = ConstantExpressionEvaluator.evaluateToConstantValue(expression, c.trace, c.expectedType); ConstantValue<?> constantValue = constantExpressionEvaluator.evaluateToConstantValue(expression, c.trace, c.expectedType);
boolean error = new CompileTimeConstantChecker(c.trace, true) boolean error = new CompileTimeConstantChecker(c.trace, true)
.checkConstantExpressionType(constantValue, (JetConstantExpression) expression, c.expectedType); .checkConstantExpressionType(constantValue, (JetConstantExpression) expression, c.expectedType);
if (hasError != null) hasError.set(error); if (hasError != null) hasError.set(error);
@@ -66,8 +66,7 @@ public abstract class AbstractEvaluateExpressionTest : AbstractAnnotationDescrip
private fun evaluateInitializer(context: BindingContext, property: VariableDescriptor): CompileTimeConstant<*>? { private fun evaluateInitializer(context: BindingContext, property: VariableDescriptor): CompileTimeConstant<*>? {
val propertyDeclaration = DescriptorToSourceUtils.descriptorToDeclaration(property) as JetProperty val propertyDeclaration = DescriptorToSourceUtils.descriptorToDeclaration(property) as JetProperty
val builtIns = KotlinBuiltIns.getInstance() val compileTimeConstant = ConstantExpressionEvaluator(KotlinBuiltIns.getInstance()).evaluateExpression(
val compileTimeConstant = ConstantExpressionEvaluator(ConstantValueFactory(builtIns), builtIns).evaluateExpression(
propertyDeclaration.getInitializer()!!, propertyDeclaration.getInitializer()!!,
DelegatingBindingTrace(context, "trace for evaluating compile time constant"), DelegatingBindingTrace(context, "trace for evaluating compile time constant"),
property.getType() property.getType()