From 070b6942473f42bf985b03c32dbd060cccafff0d Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Tue, 27 Jun 2023 17:38:29 +0300 Subject: [PATCH] [FIR] Get rid of implicit type refs with source #KT-55835 --- .../src/org/jetbrains/kotlin/fir/CopyUtils.kt | 8 +-- .../LightTreeRawFirDeclarationBuilder.kt | 3 -- .../LightTreeRawFirExpressionBuilder.kt | 2 +- .../kotlin/fir/builder/PsiRawFirBuilder.kt | 20 ++----- .../kotlin/fir/builder/ConversionUtils.kt | 6 +-- .../fir/resolve/inference/FirCallCompleter.kt | 7 ++- .../FirDeclarationsResolveTransformer.kt | 5 +- .../builder/FirImplicitTypeRefBuilder.kt | 52 ------------------- .../fir/types/impl/FirImplicitTypeRefImpl.kt | 39 -------------- .../src/org/jetbrains/kotlin/fir/Utils.kt | 3 -- .../fir/tree/generator/BuilderConfigurator.kt | 8 +-- .../generator/ImplementationConfigurator.kt | 7 +-- 12 files changed, 25 insertions(+), 135 deletions(-) delete mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/builder/FirImplicitTypeRefBuilder.kt delete mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/impl/FirImplicitTypeRefImpl.kt diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/CopyUtils.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/CopyUtils.kt index ed4564a2f67..4c64842beaa 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/CopyUtils.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/CopyUtils.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir +import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.utils.expandedConeType @@ -40,17 +41,18 @@ inline fun FirFunctionCall.copyAsImplicitInvokeCall( } fun FirTypeRef.resolvedTypeFromPrototype( - type: ConeKotlinType + type: ConeKotlinType, + fallbackSource: KtSourceElement? = null, ): FirResolvedTypeRef { return if (type is ConeErrorType) { buildErrorTypeRef { - source = this@resolvedTypeFromPrototype.source + source = this@resolvedTypeFromPrototype.source ?: fallbackSource this.type = type diagnostic = type.diagnostic } } else { buildResolvedTypeRef { - source = this@resolvedTypeFromPrototype.source + source = this@resolvedTypeFromPrototype.source ?: fallbackSource this.type = type delegatedTypeRef = when (val original = this@resolvedTypeFromPrototype) { is FirResolvedTypeRef -> original.delegatedTypeRef diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt index 2e64689fbcb..2a7cb5cbde7 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt @@ -2353,9 +2353,6 @@ class LightTreeRawFirDeclarationBuilder( modifiers = modifiers, returnTypeRef = firType ?: when { - valueParameterDeclaration == ValueParameterDeclaration.LAMBDA -> buildImplicitTypeRef { - source = valueParameterSource.fakeElement(KtFakeSourceElementKind.ImplicitReturnTypeOfLambdaValueParameter) - } valueParameterDeclaration.shouldExplicitParameterTypeBePresent -> createNoTypeForParameterTypeRef() else -> implicitType }, diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirExpressionBuilder.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirExpressionBuilder.kt index 13dca77f72e..0479d6807fb 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirExpressionBuilder.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirExpressionBuilder.kt @@ -146,7 +146,7 @@ class LightTreeRawFirExpressionBuilder( moduleData = baseModuleData origin = FirDeclarationOrigin.Source returnTypeRef = implicitType - receiverParameter = implicitType.asReceiverParameter() + receiverParameter = expressionSource.asReceiverParameter() symbol = functionSymbol isLambda = true hasExplicitParameterList = hasArrow diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt index cd7757b2b75..f7f3e1552bf 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt @@ -1680,21 +1680,14 @@ open class PsiRawFirBuilder( override fun visitLambdaExpression(expression: KtLambdaExpression, data: FirElement?): FirElement { val literal = expression.functionLiteral val literalSource = literal.toFirSourceElement() - val implicitTypeRefSource = literal.toFirSourceElement(KtFakeSourceElementKind.ImplicitTypeRef) - val returnType = buildImplicitTypeRef { - source = implicitTypeRefSource - } - val receiverType = buildImplicitTypeRef { - source = implicitTypeRefSource - } val target: FirFunctionTarget val anonymousFunction = buildAnonymousFunction { source = literalSource moduleData = baseModuleData origin = FirDeclarationOrigin.Source - returnTypeRef = returnType - receiverParameter = receiverType.asReceiverParameter() + returnTypeRef = FirImplicitTypeRefImplWithoutSource + receiverParameter = literalSource.asReceiverParameter() symbol = FirAnonymousFunctionSymbol() isLambda = true hasExplicitParameterList = expression.functionLiteral.arrow != null @@ -1709,9 +1702,7 @@ open class PsiRawFirBuilder( containingFunctionSymbol = this@buildAnonymousFunction.symbol moduleData = baseModuleData origin = FirDeclarationOrigin.Source - returnTypeRef = valueParameter.typeReference?.convertSafe() ?: buildImplicitTypeRef { - source = multiDeclaration.toFirSourceElement(KtFakeSourceElementKind.ImplicitTypeRef) - } + returnTypeRef = valueParameter.typeReference?.convertSafe() ?: FirImplicitTypeRefImplWithoutSource this.name = name symbol = FirValueParameterSymbol(name) isCrossinline = false @@ -1728,10 +1719,7 @@ open class PsiRawFirBuilder( ) { toFirOrImplicitType() }.statements multiParameter } else { - val typeRef = valueParameter.typeReference?.convertSafe() ?: buildImplicitTypeRef { - source = valueParameter.toFirSourceElement() - .fakeElement(KtFakeSourceElementKind.ImplicitReturnTypeOfLambdaValueParameter) - } + val typeRef = valueParameter.typeReference?.convertSafe() ?: FirImplicitTypeRefImplWithoutSource convertValueParameter(valueParameter, symbol, typeRef, ValueParameterDeclaration.LAMBDA) } } diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt index ab0af7b5683..a0abe228795 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt @@ -625,9 +625,9 @@ fun FirTypeRef.convertToReceiverParameter(): FirReceiverParameter { } } -fun FirImplicitTypeRef.asReceiverParameter(): FirReceiverParameter = buildReceiverParameter { - source = this@asReceiverParameter.source?.fakeElement(KtFakeSourceElementKind.ReceiverFromType) - typeRef = this@asReceiverParameter +fun KtSourceElement.asReceiverParameter(): FirReceiverParameter = buildReceiverParameter { + source = this@asReceiverParameter.fakeElement(KtFakeSourceElementKind.ReceiverFromType) + typeRef = FirImplicitTypeRefImplWithoutSource } fun FirCallableDeclaration.initContainingClassAttr(context: Context) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt index 73cdbea2c3e..f467461e9e0 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt @@ -282,7 +282,12 @@ class FirCallCompleter( lambdaArgument.replaceReceiverParameter(null) } else { lambdaArgument.receiverParameter?.apply { - replaceTypeRef(typeRef.resolvedTypeFromPrototype(receiverType.approximateLambdaInputType())) + replaceTypeRef( + typeRef.resolvedTypeFromPrototype( + receiverType.approximateLambdaInputType(), + source?.fakeElement(KtFakeSourceElementKind.ImplicitTypeRef), + ) + ) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt index 90c889e9940..ed905c1a602 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt @@ -931,7 +931,10 @@ open class FirDeclarationsResolveTransformer( param } else { val resolvedType = - param.returnTypeRef.resolvedTypeFromPrototype(expectedTypeParameterTypes[index]) + param.returnTypeRef.resolvedTypeFromPrototype( + expectedTypeParameterTypes[index], + param.source?.fakeElement(KtFakeSourceElementKind.ImplicitReturnTypeOfLambdaValueParameter) + ) param.replaceReturnTypeRef(resolvedType) param } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/builder/FirImplicitTypeRefBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/builder/FirImplicitTypeRefBuilder.kt deleted file mode 100644 index 151de655cc2..00000000000 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/builder/FirImplicitTypeRefBuilder.kt +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. - */ - -@file:Suppress("DuplicatedCode", "unused") - -package org.jetbrains.kotlin.fir.types.builder - -import kotlin.contracts.* -import org.jetbrains.kotlin.KtSourceElement -import org.jetbrains.kotlin.fir.builder.FirBuilderDsl -import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty -import org.jetbrains.kotlin.fir.expressions.FirAnnotation -import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef -import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl -import org.jetbrains.kotlin.fir.visitors.* - -/* - * This file was generated automatically - * DO NOT MODIFY IT MANUALLY - */ - -@FirBuilderDsl -class FirImplicitTypeRefBuilder { - lateinit var source: KtSourceElement - - fun build(): FirImplicitTypeRef { - return FirImplicitTypeRefImpl( - source, - ) - } - -} - -@OptIn(ExperimentalContracts::class) -inline fun buildImplicitTypeRef(init: FirImplicitTypeRefBuilder.() -> Unit): FirImplicitTypeRef { - contract { - callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE) - } - return FirImplicitTypeRefBuilder().apply(init).build() -} - -@OptIn(ExperimentalContracts::class) -inline fun buildImplicitTypeRefCopy(original: FirImplicitTypeRef, init: FirImplicitTypeRefBuilder.() -> Unit): FirImplicitTypeRef { - contract { - callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE) - } - val copyBuilder = FirImplicitTypeRefBuilder() - original.source?.let { copyBuilder.source = it } - return copyBuilder.apply(init).build() -} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/impl/FirImplicitTypeRefImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/impl/FirImplicitTypeRefImpl.kt deleted file mode 100644 index 746bbbe81d0..00000000000 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/impl/FirImplicitTypeRefImpl.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. - */ - -@file:Suppress("DuplicatedCode", "unused") - -package org.jetbrains.kotlin.fir.types.impl - -import org.jetbrains.kotlin.KtSourceElement -import org.jetbrains.kotlin.fir.expressions.FirAnnotation -import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef -import org.jetbrains.kotlin.fir.visitors.* -import org.jetbrains.kotlin.fir.MutableOrEmptyList -import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty - -/* - * This file was generated automatically - * DO NOT MODIFY IT MANUALLY - */ - -internal class FirImplicitTypeRefImpl( - override val source: KtSourceElement, -) : FirImplicitTypeRef() { - override val annotations: List get() = emptyList() - - override fun acceptChildren(visitor: FirVisitor, data: D) { - } - - override fun transformChildren(transformer: FirTransformer, data: D): FirImplicitTypeRefImpl { - return this - } - - override fun transformAnnotations(transformer: FirTransformer, data: D): FirImplicitTypeRefImpl { - return this - } - - override fun replaceAnnotations(newAnnotations: List) {} -} diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/Utils.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/Utils.kt index 0041c44fb40..8b4fe4412ac 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/Utils.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/Utils.kt @@ -53,9 +53,6 @@ fun R.copyWithNewSource(newSource: KtSourceElement?): R { qualifier += typeRef.qualifier annotations += typeRef.annotations } - is FirImplicitTypeRef -> newSource?.let { - buildImplicitTypeRefCopy(typeRef) { source = it } - } ?: FirImplicitTypeRefImplWithoutSource is FirFunctionTypeRefImpl -> buildFunctionTypeRefCopy(typeRef) { source = newSource } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt index c67f2292b4a..ffe8b21d4d7 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt @@ -313,10 +313,6 @@ object BuilderConfigurator : AbstractBuilderConfigurator(FirTree withCopy() } - builder(implicitTypeRef) { - withCopy() - } - builder(breakExpression) { parents += loopJumpBuilder } @@ -442,9 +438,7 @@ object BuilderConfigurator : AbstractBuilderConfigurator(FirTree // ----------------------------------------------------------------------- - findImplementationsWithElementInParents(annotationContainer) { - it.type !in setOf("FirImplicitTypeRefImpl") - }.forEach { + findImplementationsWithElementInParents(annotationContainer).forEach { it.builder?.parents?.add(annotationContainerBuilder) } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt index c3cc77bd219..a85b85c8a5c 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt @@ -536,12 +536,7 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() } impl(functionTypeRef) - impl(implicitTypeRef) { - defaultEmptyList("annotations") - default("source") { - notNull = true - } - } + noImpl(implicitTypeRef) impl(reference, "FirStubReference") { default("source") {