[IR] Eagerly initialize valueParameters

The main motivation is KT-68003, where we will need to add some custom
logic around value parameters, during the migration. Removing laziness
from those properties will simplify the implementation.

Also this change actually improves compilation performance a bit.
This is in part because the lazy properties were in fact expanded most
of the time.

KT-68003 Related
KT-69734 Related
diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/Fir2IrLazyDeclarationsGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/Fir2IrLazyDeclarationsGenerator.kt
index 80be6e8..80e266c 100644
--- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/Fir2IrLazyDeclarationsGenerator.kt
+++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/Fir2IrLazyDeclarationsGenerator.kt
@@ -6,6 +6,7 @@
 package org.jetbrains.kotlin.fir.backend.generators
 
 import org.jetbrains.kotlin.fir.backend.*
+import org.jetbrains.kotlin.fir.backend.utils.contextReceiversForFunctionOrContainingProperty
 import org.jetbrains.kotlin.fir.backend.utils.convertWithOffsets
 import org.jetbrains.kotlin.fir.backend.utils.declareThisReceiverParameter
 import org.jetbrains.kotlin.fir.backend.utils.irOrigin
@@ -17,7 +18,10 @@
 import org.jetbrains.kotlin.fir.unwrapUseSiteSubstitutionOverrides
 import org.jetbrains.kotlin.ir.declarations.*
 import org.jetbrains.kotlin.ir.symbols.*
+import org.jetbrains.kotlin.ir.util.classId
+import org.jetbrains.kotlin.ir.util.isAnnotationClass
 import org.jetbrains.kotlin.ir.util.parentClassOrNull
+import org.jetbrains.kotlin.name.StandardClassIds
 
 class Fir2IrLazyDeclarationsGenerator(private val c: Fir2IrComponents) : Fir2IrComponents by c {
     internal fun createIrLazyFunction(
@@ -58,6 +62,22 @@
             )
         }
 
+        irFunction.valueParameters = buildList {
+            callablesGenerator.addContextReceiverParametersTo(
+                fir.contextReceiversForFunctionOrContainingProperty(),
+                irFunction,
+                this@buildList
+            )
+
+            fir.valueParameters.mapIndexedTo(this) { index, valueParameter ->
+                callablesGenerator.createIrParameter(
+                    valueParameter, index + irFunction.contextReceiverParametersCount, skipDefaultParameter = irFunction.isFakeOverride
+                ).apply {
+                    this.parent = irFunction
+                }
+            }
+        }
+
         declarationStorage.leaveScope(symbol)
         return irFunction
     }
@@ -104,6 +124,25 @@
             )
         }
 
+        irConstructor.valueParameters = buildList {
+            callablesGenerator.addContextReceiverParametersTo(
+                fir.contextReceivers,
+                irConstructor,
+                this@buildList
+            )
+
+            fir.valueParameters.mapIndexedTo(this) { index, valueParameter ->
+                val parentClass = irConstructor.parent as? IrClass
+                callablesGenerator.createIrParameter(
+                    valueParameter, index + irConstructor.contextReceiverParametersCount,
+                    useStubForDefaultValueStub = parentClass?.classId != StandardClassIds.Enum,
+                    forcedDefaultValueConversion = parentClass?.isAnnotationClass == true
+                ).apply {
+                    this.parent = irConstructor
+                }
+            }
+        }
+
         declarationStorage.leaveScope(symbol)
         return irConstructor
     }
diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyConstructor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyConstructor.kt
index f129a7d..10086d3 100644
--- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyConstructor.kt
+++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyConstructor.kt
@@ -89,30 +89,7 @@
 
     override var contextReceiverParametersCount: Int = fir.contextReceivers.size
 
-    override var valueParameters: List<IrValueParameter> by lazyVar(lock) {
-        declarationStorage.enterScope(this.symbol)
-
-        buildList {
-            callablesGenerator.addContextReceiverParametersTo(
-                fir.contextReceivers,
-                this@Fir2IrLazyConstructor,
-                this@buildList
-            )
-
-            fir.valueParameters.mapIndexedTo(this) { index, valueParameter ->
-                val parentClass = parent as? IrClass
-                callablesGenerator.createIrParameter(
-                    valueParameter, index + contextReceiverParametersCount,
-                    useStubForDefaultValueStub = parentClass?.classId != StandardClassIds.Enum,
-                    forcedDefaultValueConversion = parentClass?.isAnnotationClass == true
-                ).apply {
-                    this.parent = this@Fir2IrLazyConstructor
-                }
-            }
-        }.apply {
-            declarationStorage.leaveScope(this@Fir2IrLazyConstructor.symbol)
-        }
-    }
+    override var valueParameters: List<IrValueParameter> = emptyList()
 
     override var metadata: MetadataSource?
         get() = null
diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt
index b363d0f..90babd1 100644
--- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt
+++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt
@@ -12,6 +12,7 @@
 import org.jetbrains.kotlin.fir.backend.*
 import org.jetbrains.kotlin.fir.backend.utils.ConversionTypeOrigin
 import org.jetbrains.kotlin.fir.backend.utils.asCompileTimeIrInitializer
+import org.jetbrains.kotlin.fir.backend.utils.contextReceiversForFunctionOrContainingProperty
 import org.jetbrains.kotlin.fir.backend.utils.declareThisReceiverParameter
 import org.jetbrains.kotlin.fir.backend.utils.toIrConst
 import org.jetbrains.kotlin.fir.containingClassLookupTag
@@ -217,7 +218,7 @@
             isFakeOverride = isFakeOverride,
             correspondingPropertySymbol = this.symbol
         ).also {
-            initializeAccessor(it, ConversionTypeOrigin.DEFAULT)
+            initializeAccessor(it, fir.getter, ConversionTypeOrigin.DEFAULT)
         }
     }
 
@@ -241,11 +242,11 @@
             isFakeOverride = isFakeOverride,
             correspondingPropertySymbol = this.symbol
         ).also {
-            initializeAccessor(it, ConversionTypeOrigin.SETTER)
+            initializeAccessor(it, fir.setter, ConversionTypeOrigin.SETTER)
         }
     }
 
-    private fun initializeAccessor(accessor: Fir2IrLazyPropertyAccessor, typeOrigin: ConversionTypeOrigin) {
+    private fun initializeAccessor(accessor: Fir2IrLazyPropertyAccessor, firAccessor: FirPropertyAccessor?, typeOrigin: ConversionTypeOrigin) {
         declarationStorage.enterScope(accessor.symbol)
 
         accessor.classifiersGenerator.setTypeParameters(accessor, fir, typeOrigin)
@@ -268,6 +269,32 @@
             )
         }
 
+        val accessorFir = accessor.fir
+        accessor.valueParameters = buildList {
+            callablesGenerator.addContextReceiverParametersTo(
+                accessorFir.contextReceiversForFunctionOrContainingProperty(),
+                accessor,
+                this@buildList
+            )
+
+            if (accessor.isSetter) {
+                val valueParameter = firAccessor?.valueParameters?.firstOrNull()
+                add(
+                    callablesGenerator.createDefaultSetterParameter(
+                        accessor.startOffset, accessor.endOffset,
+                        (valueParameter?.returnTypeRef ?: accessorFir.returnTypeRef).toIrType(
+                            typeConverter, typeOrigin
+                        ),
+                        parent = accessor,
+                        firValueParameter = valueParameter,
+                        name = valueParameter?.name,
+                        isCrossinline = valueParameter?.isCrossinline == true,
+                        isNoinline = valueParameter?.isNoinline == true
+                    )
+                )
+            }
+        }
+
         declarationStorage.leaveScope(accessor.symbol)
     }
 
diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyPropertyAccessor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyPropertyAccessor.kt
index a05f789..7953bda 100644
--- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyPropertyAccessor.kt
+++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyPropertyAccessor.kt
@@ -32,7 +32,7 @@
     endOffset: Int,
     origin: IrDeclarationOrigin,
     private val firAccessor: FirPropertyAccessor?,
-    private val isSetter: Boolean,
+    val isSetter: Boolean,
     private val firParentProperty: FirProperty,
     firParentClass: FirRegularClass?,
     symbol: IrSimpleFunctionSymbol,
@@ -67,40 +67,6 @@
 
     override var contextReceiverParametersCount: Int = fir.contextReceiversForFunctionOrContainingProperty().size
 
-    override var valueParameters: List<IrValueParameter> by lazyVar(lock) {
-        if (!isSetter && contextReceiverParametersCount == 0) emptyList()
-        else {
-            declarationStorage.enterScope(this.symbol)
-
-            buildList {
-                callablesGenerator.addContextReceiverParametersTo(
-                    fir.contextReceiversForFunctionOrContainingProperty(),
-                    this@Fir2IrLazyPropertyAccessor,
-                    this@buildList
-                )
-
-                if (isSetter) {
-                    val valueParameter = firAccessor?.valueParameters?.firstOrNull()
-                    add(
-                        callablesGenerator.createDefaultSetterParameter(
-                            startOffset, endOffset,
-                            (valueParameter?.returnTypeRef ?: firParentProperty.returnTypeRef).toIrType(
-                                typeConverter, conversionTypeContext
-                            ),
-                            parent = this@Fir2IrLazyPropertyAccessor,
-                            firValueParameter = valueParameter,
-                            name = valueParameter?.name,
-                            isCrossinline = valueParameter?.isCrossinline == true,
-                            isNoinline = valueParameter?.isNoinline == true
-                        )
-                    )
-                }
-            }.apply {
-                declarationStorage.leaveScope(this@Fir2IrLazyPropertyAccessor.symbol)
-            }
-        }
-    }
-
     override var overriddenSymbols: List<IrSimpleFunctionSymbol> by symbolsMappingForLazyClasses.lazyMappedFunctionListVar(lock) {
         if (firParentClass == null) return@lazyMappedFunctionListVar emptyList()
         // If property accessor is created then corresponding property is definitely created too
diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt
index 3bed259..6307a3f 100644
--- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt
+++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt
@@ -52,28 +52,6 @@
 
     override var contextReceiverParametersCount: Int = fir.contextReceiversForFunctionOrContainingProperty().size
 
-    override var valueParameters: List<IrValueParameter> by lazyVar(lock) {
-        declarationStorage.enterScope(this.symbol)
-
-        buildList {
-            callablesGenerator.addContextReceiverParametersTo(
-                fir.contextReceiversForFunctionOrContainingProperty(),
-                this@Fir2IrLazySimpleFunction,
-                this@buildList
-            )
-
-            fir.valueParameters.mapIndexedTo(this) { index, valueParameter ->
-                callablesGenerator.createIrParameter(
-                    valueParameter, index + contextReceiverParametersCount, skipDefaultParameter = isFakeOverride
-                ).apply {
-                    this.parent = this@Fir2IrLazySimpleFunction
-                }
-            }
-        }.apply {
-            declarationStorage.leaveScope(this@Fir2IrLazySimpleFunction.symbol)
-        }
-    }
-
     override var overriddenSymbols: List<IrSimpleFunctionSymbol> by symbolsMappingForLazyClasses.lazyMappedFunctionListVar(lock) lazy@{
         if (firParent == null || parent !is Fir2IrLazyClass) return@lazy emptyList()
 
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/AbstractIrLazyFunction.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/AbstractIrLazyFunction.kt
index 2a9a90a..684ead0 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/AbstractIrLazyFunction.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/AbstractIrLazyFunction.kt
@@ -17,6 +17,8 @@
 
     override var extensionReceiverParameter: IrValueParameter? = null
 
+    override var valueParameters: List<IrValueParameter> = emptyList()
+
     fun tryLoadIr(): Boolean {
         if (!isInline || isFakeOverride) return false
         if (!isDeserializationEnabled) return false
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyConstructor.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyConstructor.kt
index 9d1311f..1d1bf09 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyConstructor.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyConstructor.kt
@@ -48,7 +48,7 @@
 
     override var extensionReceiverParameter: IrValueParameter? = null
 
-    override var valueParameters: List<IrValueParameter> by lazyVar(stubGenerator.lock) { createValueParameters() }
+    override var valueParameters: List<IrValueParameter> = emptyList()
 
     override var contextReceiverParametersCount: Int = descriptor.contextReceiverParameters.size
 
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyFunction.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyFunction.kt
index 45d1d38..6a43125 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyFunction.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyFunction.kt
@@ -62,10 +62,6 @@
 
     override val initialSignatureFunction: IrFunction? by createInitialSignatureFunction()
 
-    override var valueParameters: List<IrValueParameter> by lazyVar(stubGenerator.lock) {
-        createValueParameters()
-    }
-
     override var contextReceiverParametersCount: Int = descriptor.contextReceiverParameters.size
 
     override var metadata: MetadataSource?
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyFunctionBase.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyFunctionBase.kt
index fb89fdc..3ceb3df 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyFunctionBase.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyFunctionBase.kt
@@ -38,31 +38,6 @@
             stubGenerator.generateFunctionStub(initialSignatureDescriptor.original)
         }
 
-    fun createValueParameters(): List<IrValueParameter> =
-        typeTranslator.buildWithScope(this) {
-            val result = arrayListOf<IrValueParameter>()
-            descriptor.contextReceiverParameters.mapIndexedTo(result) { i, contextReceiverParameter ->
-                factory.createValueParameter(
-                    startOffset = UNDEFINED_OFFSET,
-                    endOffset = UNDEFINED_OFFSET,
-                    origin = origin,
-                    name = Name.identifier("contextReceiverParameter$i"),
-                    type = contextReceiverParameter.type.toIrType(),
-                    isAssignable = false,
-                    symbol = IrValueParameterSymbolImpl(contextReceiverParameter),
-                    index = i,
-                    varargElementType = null,
-                    isCrossinline = false,
-                    isNoinline = false,
-                    isHidden = false,
-                ).apply { parent = this@IrLazyFunctionBase }
-            }
-            descriptor.valueParameters.mapTo(result) {
-                stubGenerator.generateValueParameterStub(it, it.index + descriptor.contextReceiverParameters.size)
-                    .apply { parent = this@IrLazyFunctionBase }
-            }
-        }
-
     fun createReturnType(): IrType =
         typeTranslator.buildWithScope(this) {
             descriptor.returnType!!.toIrType()
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt
index aafc281..e4b15a9 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt
@@ -29,6 +29,7 @@
 import org.jetbrains.kotlin.ir.symbols.IrSymbol
 import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
 import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
+import org.jetbrains.kotlin.name.Name
 import org.jetbrains.kotlin.resolve.DescriptorUtils
 import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal
 import org.jetbrains.kotlin.resolve.isValueClass
@@ -205,6 +206,7 @@
             ).generateParentDeclaration().also {
                 it.dispatchReceiverParameter = it.createReceiverParameter(descriptor.dispatchReceiverParameter)
                 it.extensionReceiverParameter = it.createReceiverParameter(descriptor.extensionReceiverParameter)
+                it.valueParameters = it.createValueParameters()
             }
         }
     }
@@ -228,13 +230,39 @@
             ).generateParentDeclaration().also {
                 it.dispatchReceiverParameter = it.createReceiverParameter(descriptor.dispatchReceiverParameter)
                 it.extensionReceiverParameter = it.createReceiverParameter(descriptor.extensionReceiverParameter)
+                it.valueParameters = it.createValueParameters()
             }
         }
     }
 
     private fun KotlinType.toIrType() = typeTranslator.translateType(this)
 
-    internal fun generateValueParameterStub(descriptor: ValueParameterDescriptor, index: Int): IrValueParameter = with(descriptor) {
+    private fun IrLazyFunctionBase.createValueParameters(): List<IrValueParameter> =
+        typeTranslator.buildWithScope(this) {
+            val result = arrayListOf<IrValueParameter>()
+            descriptor.contextReceiverParameters.mapIndexedTo(result) { i, contextReceiverParameter ->
+                factory.createValueParameter(
+                    startOffset = UNDEFINED_OFFSET,
+                    endOffset = UNDEFINED_OFFSET,
+                    origin = origin,
+                    name = Name.identifier("contextReceiverParameter$i"),
+                    type = contextReceiverParameter.type.toIrType(),
+                    isAssignable = false,
+                    symbol = IrValueParameterSymbolImpl(contextReceiverParameter),
+                    index = i,
+                    varargElementType = null,
+                    isCrossinline = false,
+                    isNoinline = false,
+                    isHidden = false,
+                ).apply { parent = this@createValueParameters }
+            }
+            descriptor.valueParameters.mapTo(result) {
+                stubGenerator.generateValueParameterStub(it, it.index + descriptor.contextReceiverParameters.size)
+                    .apply { parent = this@createValueParameters }
+            }
+        }
+
+    private fun generateValueParameterStub(descriptor: ValueParameterDescriptor, index: Int): IrValueParameter = with(descriptor) {
         IrLazyValueParameter(
             UNDEFINED_OFFSET, UNDEFINED_OFFSET, computeOrigin(this), IrValueParameterSymbolImpl(this), this, name, index,
             type, varargElementType,