From 445e5122c1155578b24059f93b7b41825038eb6e Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Wed, 11 Aug 2021 21:50:41 +0300 Subject: [PATCH] [FIR] Fix conversion of underscored value parameters in functions Fix false REDECLARATION --- .../fir/lightTree/converter/DeclarationsConverter.kt | 10 ++++++++-- .../org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt | 10 +++++++--- .../redeclarations/RedeclaredValueParameters.fir.kt | 2 ++ .../tests/redeclarations/RedeclaredValueParameters.kt | 2 ++ 4 files changed, 19 insertions(+), 5 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 d3ae5d0b710..437de427c28 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 @@ -1436,7 +1436,8 @@ class DeclarationsConverter( val target: FirFunctionTarget val functionSource = functionDeclaration.toFirSourceElement() val functionSymbol: FirFunctionSymbol<*> - val functionBuilder = if (identifier == null && isLocal) { + val isAnonymousFunction = identifier == null && isLocal + val functionBuilder = if (isAnonymousFunction) { val labelName = functionDeclaration.getLabelName() ?: context.calleeNamesForLambda.lastOrNull()?.identifier target = FirFunctionTarget(labelName = labelName, isLambda = false) functionSymbol = FirAnonymousFunctionSymbol() @@ -1494,7 +1495,12 @@ class DeclarationsConverter( } withCapturedTypeParameters(true, actualTypeParameters) { - valueParametersList?.let { list -> valueParameters += convertValueParameters(list).map { it.firValueParameter } } + valueParametersList?.let { list -> + valueParameters += convertValueParameters( + list, + if (isAnonymousFunction) ValueParameterDeclaration.LAMBDA else ValueParameterDeclaration.OTHER + ).map { it.firValueParameter } + } val hasContractEffectList = outerContractDescription != null val bodyWithContractDescription = convertFunctionBody(block, expression, hasContractEffectList) diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index ce6369224a4..c9080202ea4 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -1113,8 +1113,8 @@ open class RawFirBuilder( val receiverType = function.receiverTypeReference.convertSafe() val labelName: String? - val functionIsAnonymousFunction = function.name == null && !function.parent.let { it is KtFile || it is KtClassBody } - val functionBuilder = if (functionIsAnonymousFunction) { + val isAnonymousFunction = function.name == null && !function.parent.let { it is KtFile || it is KtClassBody } + val functionBuilder = if (isAnonymousFunction) { FirAnonymousFunctionBuilder().apply { receiverTypeRef = receiverType symbol = FirAnonymousFunctionSymbol() @@ -1159,7 +1159,11 @@ open class RawFirBuilder( function.extractTypeParametersTo(this, symbol) } for (valueParameter in function.valueParameters) { - valueParameters += valueParameter.convert() + valueParameters += convertValueParameter( + valueParameter, + null, + if (isAnonymousFunction) ValueParameterDeclaration.LAMBDA else ValueParameterDeclaration.OTHER + ) } val actualTypeParameters = if (this is FirSimpleFunctionBuilder) this.typeParameters diff --git a/compiler/testData/diagnostics/tests/redeclarations/RedeclaredValueParameters.fir.kt b/compiler/testData/diagnostics/tests/redeclarations/RedeclaredValueParameters.fir.kt index a91cac00fb7..03629bc3e94 100644 --- a/compiler/testData/diagnostics/tests/redeclarations/RedeclaredValueParameters.fir.kt +++ b/compiler/testData/diagnostics/tests/redeclarations/RedeclaredValueParameters.fir.kt @@ -4,4 +4,6 @@ fun test2(block: (Int, String) -> Unit) { } fun main() { test2 { b, b -> ; } + + val func: (Int, Int) -> Int = fun(_, _): Int { return 42 } } diff --git a/compiler/testData/diagnostics/tests/redeclarations/RedeclaredValueParameters.kt b/compiler/testData/diagnostics/tests/redeclarations/RedeclaredValueParameters.kt index 627f388d07b..694fdf4a292 100644 --- a/compiler/testData/diagnostics/tests/redeclarations/RedeclaredValueParameters.kt +++ b/compiler/testData/diagnostics/tests/redeclarations/RedeclaredValueParameters.kt @@ -4,4 +4,6 @@ fun test2(block: (Int, String) -> Unit) { } fun main() { test2 { b, b -> ; } + + val func: (Int, Int) -> Int = fun(_, _): Int { return 42 } }