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:
@@ -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
|
||||
Reference in New Issue
Block a user