From 9671e20f1fc23dfe09d66ff7eb3ba644791e1154 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 18 Nov 2022 14:28:36 +0100 Subject: [PATCH] [FIR] do not create FirParameter during creation of `for` loop variable ^KT-55034 --- .../converter/DeclarationsConverter.kt | 38 +++++++--------- .../converter/ExpressionsConverter.kt | 6 +-- .../fir/lightTree/fir/ValueParameter.kt | 45 +++++++++++++++++-- 3 files changed, 60 insertions(+), 29 deletions(-) diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index a58992d6503..2a10ff52efa 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -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 fillDanglingConstraintsTo( diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt index d1c25addd78..6337cff8383 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt @@ -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( diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt index 9a71eea0b4e..d40ab4eb492 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt @@ -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, + val name: Name, + val defaultValue: FirExpression?, val destructuringDeclaration: DestructuringDeclaration? = null ) { fun hasValOrVar(): Boolean { return isVal || isVar } - fun 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 toFirPropertyFromPrimaryConstructor( moduleData: FirModuleData, callableId: CallableId, isExpect: Boolean,