From 1aba9460f283e17abb8dd6b7e9a16559786801ac Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 11 Apr 2023 11:11:50 +0200 Subject: [PATCH] [LL] fix resolving of compiled type value parameter KT-57917 occurs when UAST requests e.g. annotations for the target parameter to check correctness of nullability or Nls --- .../FirDeclarationForCompiledElementSearcher.kt | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/FirDeclarationForCompiledElementSearcher.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/FirDeclarationForCompiledElementSearcher.kt index 6f8e9db6c8f..23e7d046695 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/FirDeclarationForCompiledElementSearcher.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/FirDeclarationForCompiledElementSearcher.kt @@ -33,11 +33,24 @@ internal class FirDeclarationForCompiledElementSearcher(private val symbolProvid is KtConstructor<*> -> findConstructorOfNonLocalClass(ktDeclaration) is KtNamedFunction -> findNonLocalFunction(ktDeclaration) is KtProperty -> findNonLocalProperty(ktDeclaration) + is KtParameter -> findParameter(ktDeclaration) else -> errorWithFirSpecificEntries("Unsupported compiled declaration of type", psi = ktDeclaration) } } + private fun findParameter(param: KtParameter): FirDeclaration { + val ownerFunction = param.ownerFunction ?: errorWithFirSpecificEntries("Unsupported compiled parameter", psi = param) + val firDeclaration = findNonLocalDeclaration(ownerFunction) + val firFunction = firDeclaration as? FirFunction ?: errorWithFirSpecificEntries( + "No fir function found by ktFunction", + psi = ownerFunction, + fir = firDeclaration + ) + return firFunction.valueParameters.find { it.name == param.nameAsSafeName } + ?: errorWithFirSpecificEntries("No fir value parameter found", psi = param, fir = firFunction) + } + private fun findNonLocalEnumEntry(declaration: KtEnumEntry): FirEnumEntry { require(!declaration.isLocal) val classId = declaration.containingClassOrObject?.getClassId()