Fix constant expression inlining logic

Constant expressions are inlined if they do not depend on non-inlineable
vals.
Java constants are always inlined.
Kotlin constants are inlined in LV 1.1+.
This commit is contained in:
Dmitry Petrov
2017-10-13 15:14:58 +03:00
parent 5acc992956
commit 16b7bece46
7 changed files with 68 additions and 12 deletions
@@ -42,7 +42,7 @@ fun getCompileTimeConstant(
if (!shouldInlineConstVals && !takeUpConstValsAsConst && compileTimeValue.usesVariableAsConstant) {
val constantChecker = ConstantsChecker(bindingContext)
expression.accept(constantChecker)
if (constantChecker.containsNonInlinedVals) return null
if (constantChecker.containsKotlinConstVals) return null
}
val expectedType = bindingContext.getType(expression) ?: return null
@@ -52,25 +52,21 @@ fun getCompileTimeConstant(
private class ConstantsChecker(private val bindingContext: BindingContext) : KtVisitorVoid() {
var containsNonInlinedVals = false
var containsKotlinConstVals = false
override fun visitSimpleNameExpression(expression: KtSimpleNameExpression) {
val resolvedCall = expression.getResolvedCall(bindingContext)
if (resolvedCall != null) {
val callableDescriptor = resolvedCall.resultingDescriptor
if (callableDescriptor is PropertyDescriptor && isInlinedJavaConstProperty(callableDescriptor as VariableDescriptor)) {
containsNonInlinedVals = true
if (callableDescriptor is PropertyDescriptor && callableDescriptor !is JavaPropertyDescriptor && callableDescriptor.isConst) {
containsKotlinConstVals = true
}
}
}
override fun visitKtElement(element: KtElement) {
if (!containsNonInlinedVals) {
if (!containsKotlinConstVals) {
element.acceptChildren(this)
}
}
}
fun isInlinedJavaConstProperty(descriptor: VariableDescriptor): Boolean =
(descriptor as? JavaPropertyDescriptor)?.isConst ?: false