[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 properties += primaryConstructorWrapper.valueParameters
.filter { it.hasValOrVar() } .filter { it.hasValOrVar() }
.map { .map {
it.toFirProperty( it.toFirPropertyFromPrimaryConstructor(
baseModuleData, baseModuleData,
callableIdForName(it.firValueParameter.name), callableIdForName(it.firValueParameter.name),
classWrapper.hasExpect(), classWrapper.hasExpect(),
@@ -2262,32 +2262,24 @@ class DeclarationsConverter(
} }
val name = convertValueParameterName(identifier.nameAsSafeName(), identifier, valueParameterDeclaration) val name = convertValueParameterName(identifier.nameAsSafeName(), identifier, valueParameterDeclaration)
val firValueParameter = buildValueParameter {
source = valueParameter.toFirSourceElement() return ValueParameter(
moduleData = baseModuleData isVal = isVal,
origin = FirDeclarationOrigin.Source isVar = isVar,
modifiers = modifiers,
returnTypeRef = firType returnTypeRef = firType
?: when { ?: when {
valueParameterDeclaration.shouldExplicitParameterTypeBePresent -> createNoTypeForParameterTypeRef() valueParameterDeclaration.shouldExplicitParameterTypeBePresent -> createNoTypeForParameterTypeRef()
else -> implicitType else -> implicitType
} },
this.name = name source = valueParameter.toFirSourceElement(),
symbol = FirValueParameterSymbol(name) moduleData = baseModuleData,
defaultValue = firExpression isFromPrimaryConstructor = valueParameterDeclaration == ValueParameterDeclaration.PRIMARY_CONSTRUCTOR,
isCrossinline = modifiers.hasCrossinline() additionalAnnotations = additionalAnnotations,
isNoinline = modifiers.hasNoinline() name = name,
isVararg = modifiers.hasVararg() defaultValue = firExpression,
val isFromPrimaryConstructor = valueParameterDeclaration == ValueParameterDeclaration.PRIMARY_CONSTRUCTOR destructuringDeclaration = destructuringDeclaration
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)
} }
private fun <T> fillDanglingConstraintsTo( private fun <T> fillDanglingConstraintsTo(
@@ -1120,8 +1120,8 @@ class ExpressionsConverter(
val multiDeclaration = valueParameter.destructuringDeclaration val multiDeclaration = valueParameter.destructuringDeclaration
val firLoopParameter = generateTemporaryVariable( val firLoopParameter = generateTemporaryVariable(
baseModuleData, baseModuleData,
valueParameter.firValueParameter.source, valueParameter.source,
if (multiDeclaration != null) SpecialNames.DESTRUCT else valueParameter.firValueParameter.name, if (multiDeclaration != null) SpecialNames.DESTRUCT else valueParameter.name,
buildFunctionCall { buildFunctionCall {
source = fakeSource source = fakeSource
calleeReference = buildSimpleNamedReference { calleeReference = buildSimpleNamedReference {
@@ -1130,7 +1130,7 @@ class ExpressionsConverter(
} }
explicitReceiver = generateResolvedAccessExpression(fakeSource, iteratorVal) explicitReceiver = generateResolvedAccessExpression(fakeSource, iteratorVal)
}, },
valueParameter.firValueParameter.returnTypeRef valueParameter.returnTypeRef
) )
if (multiDeclaration != null) { if (multiDeclaration != null) {
val destructuringBlock = generateDestructuringBlock( val destructuringBlock = generateDestructuringBlock(
@@ -6,16 +6,21 @@
package org.jetbrains.kotlin.fir.lightTree.fir package org.jetbrains.kotlin.fir.lightTree.fir
import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fakeElement 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.Context
import org.jetbrains.kotlin.fir.builder.filterUseSiteTarget import org.jetbrains.kotlin.fir.builder.filterUseSiteTarget
import org.jetbrains.kotlin.fir.builder.initContainingClassAttr 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.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.declarations.builder.buildProperty 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.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyBackingField import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyBackingField
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter 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.declarations.utils.isFromVararg
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind 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.expressions.builder.buildPropertyAccessExpression
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.Modifier import org.jetbrains.kotlin.fir.lightTree.fir.modifier.Modifier
import org.jetbrains.kotlin.fir.references.builder.buildPropertyFromParameterResolvedNamedReference import org.jetbrains.kotlin.fir.references.builder.buildPropertyFromParameterResolvedNamedReference
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol 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.ConeClassLikeType
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef 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.fir.types.builder.buildErrorTypeRef
import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.Name
class ValueParameter( class ValueParameter(
private val isVal: Boolean, private val isVal: Boolean,
private val isVar: Boolean, private val isVar: Boolean,
private val modifiers: Modifier, 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 val destructuringDeclaration: DestructuringDeclaration? = null
) { ) {
fun hasValOrVar(): Boolean { fun hasValOrVar(): Boolean {
return isVal || isVar 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, moduleData: FirModuleData,
callableId: CallableId, callableId: CallableId,
isExpect: Boolean, isExpect: Boolean,