[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
|
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(
|
||||||
|
|||||||
+3
-3
@@ -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(
|
||||||
|
|||||||
+42
-3
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user