Psi2Ir: Fold constants when generating IR

This is necessary to avoid stack overflow errors on large constant
expressions.
This commit is contained in:
Steven Schäfer
2021-04-20 21:23:19 +02:00
committed by Dmitry Petrov
parent e87d816994
commit 8c9ad81c76
15 changed files with 69 additions and 31 deletions
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.psi2ir.generators
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.descriptors.impl.PropertyGetterDescriptorImpl
@@ -110,7 +111,10 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
} else
throw AssertionError("Property declared in primary constructor has no getter: $propertyDescriptor")
irProperty.getter =
FunctionGenerator(declarationGenerator).generateDefaultAccessorForPrimaryConstructorParameter(getter, ktDeclarationContainer)
FunctionGenerator(declarationGenerator).generateDefaultAccessorForPrimaryConstructorParameter(
getter,
ktDeclarationContainer
)
if (propertyDescriptor.isVar) {
val setter = propertyDescriptor.setter
@@ -130,7 +134,10 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
} else
throw AssertionError("Property declared in primary constructor has no setter: $propertyDescriptor")
irProperty.setter =
FunctionGenerator(declarationGenerator).generateDefaultAccessorForPrimaryConstructorParameter(setter, ktDeclarationContainer)
FunctionGenerator(declarationGenerator).generateDefaultAccessorForPrimaryConstructorParameter(
setter,
ktDeclarationContainer
)
}
irProperty.linkCorrespondingPropertySymbol()
@@ -173,17 +180,25 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
irProperty.backingField =
if (propertyDescriptor.actuallyHasBackingField(context.bindingContext))
generatePropertyBackingField(ktProperty, propertyDescriptor) { irField ->
ktProperty.initializer?.let { ktInitializer ->
ktProperty.initializer?.let evaluateInitializer@{ ktInitializer ->
val compileTimeConst = propertyDescriptor.compileTimeInitializer
if (propertyDescriptor.isConst && compileTimeConst != null)
context.irFactory.createExpressionBody(
context.constantValueGenerator.generateConstantValueAsExpression(
ktInitializer.startOffsetSkippingComments, ktInitializer.endOffset,
compileTimeConst
if (compileTimeConst != null) {
val constantInfo = context.bindingContext.get(BindingContext.COMPILE_TIME_VALUE, ktInitializer)
if (propertyDescriptor.isConst ||
(constantInfo?.usesNonConstValAsConstant == false &&
(!constantInfo.usesVariableAsConstant ||
context.languageVersionSettings.supportsFeature(LanguageFeature.InlineConstVals)))
) {
return@evaluateInitializer context.irFactory.createExpressionBody(
context.constantValueGenerator.generateConstantValueAsExpression(
ktInitializer.startOffsetSkippingComments, ktInitializer.endOffset,
compileTimeConst
)
)
)
else
declarationGenerator.generateInitializerBody(irField.symbol, ktInitializer)
}
}
declarationGenerator.generateInitializerBody(irField.symbol, ktInitializer)
}
}
else