[FIR] do not create FirParameter during creation of for loop variable

^KT-55034
This commit is contained in:
Ilya Kirillov
2022-11-18 14:28:36 +01:00
parent eb8ce449e3
commit 9671e20f1f
3 changed files with 60 additions and 29 deletions
@@ -562,7 +562,7 @@ class DeclarationsConverter(
properties += primaryConstructorWrapper.valueParameters
.filter { it.hasValOrVar() }
.map {
it.toFirProperty(
it.toFirPropertyFromPrimaryConstructor(
baseModuleData,
callableIdForName(it.firValueParameter.name),
classWrapper.hasExpect(),
@@ -2262,32 +2262,24 @@ class DeclarationsConverter(
}
val name = convertValueParameterName(identifier.nameAsSafeName(), identifier, valueParameterDeclaration)
val firValueParameter = buildValueParameter {
source = valueParameter.toFirSourceElement()
moduleData = baseModuleData
origin = FirDeclarationOrigin.Source
return ValueParameter(
isVal = isVal,
isVar = isVar,
modifiers = modifiers,
returnTypeRef = firType
?: when {
valueParameterDeclaration.shouldExplicitParameterTypeBePresent -> createNoTypeForParameterTypeRef()
else -> implicitType
}
this.name = name
symbol = FirValueParameterSymbol(name)
defaultValue = firExpression
isCrossinline = modifiers.hasCrossinline()
isNoinline = modifiers.hasNoinline()
isVararg = modifiers.hasVararg()
val isFromPrimaryConstructor = valueParameterDeclaration == ValueParameterDeclaration.PRIMARY_CONSTRUCTOR
annotations += if (!isFromPrimaryConstructor)
modifiers.annotations
else
modifiers.annotations.filter {
val useSiteTarget = it.useSiteTarget
useSiteTarget == null || useSiteTarget == CONSTRUCTOR_PARAMETER || useSiteTarget == RECEIVER || useSiteTarget == FILE
}
annotations += additionalAnnotations
}
return ValueParameter(isVal, isVar, modifiers, firValueParameter, destructuringDeclaration)
},
source = valueParameter.toFirSourceElement(),
moduleData = baseModuleData,
isFromPrimaryConstructor = valueParameterDeclaration == ValueParameterDeclaration.PRIMARY_CONSTRUCTOR,
additionalAnnotations = additionalAnnotations,
name = name,
defaultValue = firExpression,
destructuringDeclaration = destructuringDeclaration
)
}
private fun <T> fillDanglingConstraintsTo(
@@ -1120,8 +1120,8 @@ class ExpressionsConverter(
val multiDeclaration = valueParameter.destructuringDeclaration
val firLoopParameter = generateTemporaryVariable(
baseModuleData,
valueParameter.firValueParameter.source,
if (multiDeclaration != null) SpecialNames.DESTRUCT else valueParameter.firValueParameter.name,
valueParameter.source,
if (multiDeclaration != null) SpecialNames.DESTRUCT else valueParameter.name,
buildFunctionCall {
source = fakeSource
calleeReference = buildSimpleNamedReference {
@@ -1130,7 +1130,7 @@ class ExpressionsConverter(
}
explicitReceiver = generateResolvedAccessExpression(fakeSource, iteratorVal)
},
valueParameter.firValueParameter.returnTypeRef
valueParameter.returnTypeRef
)
if (multiDeclaration != null) {
val destructuringBlock = generateDestructuringBlock(
@@ -6,16 +6,21 @@
package org.jetbrains.kotlin.fir.lightTree.fir
import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fakeElement
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.builder.Context
import org.jetbrains.kotlin.fir.builder.filterUseSiteTarget
import org.jetbrains.kotlin.fir.builder.initContainingClassAttr
import org.jetbrains.kotlin.fir.copy
import org.jetbrains.kotlin.fir.copyWithNewSourceKind
import org.jetbrains.kotlin.fir.correspondingProperty
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.declarations.builder.buildProperty
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyBackingField
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
@@ -24,27 +29,61 @@ import org.jetbrains.kotlin.fir.declarations.utils.fromPrimaryConstructor
import org.jetbrains.kotlin.fir.declarations.utils.isFromVararg
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.builder.buildPropertyAccessExpression
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.Modifier
import org.jetbrains.kotlin.fir.references.builder.buildPropertyFromParameterResolvedNamedReference
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.Name
class ValueParameter(
private val isVal: Boolean,
private val isVar: Boolean,
private val modifiers: Modifier,
val firValueParameter: FirValueParameter,
val returnTypeRef: FirTypeRef,
private val source: KtSourceElement,
private val moduleData: FirModuleData,
private val isFromPrimaryConstructor: Boolean,
private val additionalAnnotations: List<FirAnnotation>,
val name: Name,
val defaultValue: FirExpression?,
val destructuringDeclaration: DestructuringDeclaration? = null
) {
fun hasValOrVar(): Boolean {
return isVal || isVar
}
fun <T> toFirProperty(
val firValueParameter: FirValueParameter by lazy(LazyThreadSafetyMode.NONE) {
buildValueParameter {
source = this@ValueParameter.source
moduleData = this@ValueParameter.moduleData
origin = FirDeclarationOrigin.Source
returnTypeRef = this@ValueParameter.returnTypeRef
this.name = this@ValueParameter.name
symbol = FirValueParameterSymbol(name)
defaultValue = this@ValueParameter.defaultValue
isCrossinline = modifiers.hasCrossinline()
isNoinline = modifiers.hasNoinline()
isVararg = modifiers.hasVararg()
annotations += if (!isFromPrimaryConstructor)
modifiers.annotations
else
modifiers.annotations.filter {
val useSiteTarget = it.useSiteTarget
useSiteTarget == null || useSiteTarget == AnnotationUseSiteTarget.CONSTRUCTOR_PARAMETER || useSiteTarget == AnnotationUseSiteTarget.RECEIVER || useSiteTarget == AnnotationUseSiteTarget.FILE
}
annotations += additionalAnnotations
}
}
fun <T> toFirPropertyFromPrimaryConstructor(
moduleData: FirModuleData,
callableId: CallableId,
isExpect: Boolean,