[FIR] do not create FirParameter during creation of for loop variable
^KT-55034
This commit is contained in:
+15
-23
@@ -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(
|
||||
|
||||
+3
-3
@@ -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(
|
||||
|
||||
+42
-3
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user