From 5a1680ca3bfa90a6d67d899fd78021cfee380b93 Mon Sep 17 00:00:00 2001 From: Tianyu Geng Date: Fri, 15 Oct 2021 16:31:22 -0700 Subject: [PATCH] FIR LL: fix resolving proerties in library Property can be overloaded with different extension receiver type. --- ...arationAndFirDeclarationEqualityChecker.kt | 30 +++++++++++-------- ...irDeclarationForCompiledElementSearcher.kt | 9 ++---- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/KtDeclarationAndFirDeclarationEqualityChecker.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/KtDeclarationAndFirDeclarationEqualityChecker.kt index 53e77a0bcef..61a811caf70 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/KtDeclarationAndFirDeclarationEqualityChecker.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/KtDeclarationAndFirDeclarationEqualityChecker.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.builder.BodyBuildingMode import org.jetbrains.kotlin.fir.builder.PsiHandlingMode import org.jetbrains.kotlin.fir.builder.RawFirBuilder +import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.resolve.ScopeSession @@ -20,13 +21,14 @@ import org.jetbrains.kotlin.fir.scopes.FirScopeProvider import org.jetbrains.kotlin.fir.scopes.FirTypeScope import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.name.StandardClassIds +import org.jetbrains.kotlin.psi.KtCallableDeclaration import org.jetbrains.kotlin.psi.KtFunction import org.jetbrains.kotlin.psi.KtTypeReference import org.jetbrains.kotlin.types.Variance // TODO replace with structural type comparison? object KtDeclarationAndFirDeclarationEqualityChecker { - fun representsTheSameDeclaration(psi: KtFunction, fir: FirFunction): Boolean { + fun representsTheSameDeclaration(psi: KtCallableDeclaration, fir: FirCallableDeclaration): Boolean { if ((fir.receiverTypeRef != null) != (psi.receiverTypeReference != null)) return false if (fir.receiverTypeRef != null && !isTheSameTypes( @@ -37,18 +39,20 @@ object KtDeclarationAndFirDeclarationEqualityChecker { ) { return false } - if (fir.valueParameters.size != psi.valueParameters.size) return false - fir.valueParameters.zip(psi.valueParameters) { expectedParameter, candidateParameter -> - if (expectedParameter.name.toString() != candidateParameter.name) return false - if (expectedParameter.isVararg != candidateParameter.isVarArg) return false - val candidateParameterType = candidateParameter.typeReference ?: return false - if (!isTheSameTypes( - candidateParameterType, - expectedParameter.returnTypeRef, - isVararg = expectedParameter.isVararg - ) - ) { - return false + if (fir is FirFunction) { + if (fir.valueParameters.size != psi.valueParameters.size) return false + fir.valueParameters.zip(psi.valueParameters) { expectedParameter, candidateParameter -> + if (expectedParameter.name.toString() != candidateParameter.name) return false + if (expectedParameter.isVararg != candidateParameter.isVarArg) return false + val candidateParameterType = candidateParameter.typeReference ?: return false + if (!isTheSameTypes( + candidateParameterType, + expectedParameter.returnTypeRef, + isVararg = expectedParameter.isVararg + ) + ) { + return false + } } } return true 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 0ee8f675188..62e3b960523 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 @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.util +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.KtDeclarationAndFirDeclarationEqualityChecker import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration import org.jetbrains.kotlin.fir.declarations.FirConstructor import org.jetbrains.kotlin.fir.declarations.FirFunction @@ -16,7 +17,6 @@ import org.jetbrains.kotlin.fir.resolve.providers.getClassDeclaredPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.KtDeclarationAndFirDeclarationEqualityChecker import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject @@ -56,7 +56,7 @@ internal class FirDeclarationForCompiledElementSearcher(private val symbolProvid val functionCandidate = symbolProvider.findFunctionCandidates(declaration) - .singleOrNull { representSameFunction(declaration, it.fir) } + .singleOrNull { KtDeclarationAndFirDeclarationEqualityChecker.representsTheSameDeclaration(declaration, it.fir) } ?: error("We should be able to find a symbol for function ${declaration.name}: ${declaration.getElementTextInContext()}") return functionCandidate.fir @@ -67,7 +67,7 @@ internal class FirDeclarationForCompiledElementSearcher(private val symbolProvid val propertyCandidate = symbolProvider.findPropertyCandidates(declaration) - .singleOrNull() + .singleOrNull { KtDeclarationAndFirDeclarationEqualityChecker.representsTheSameDeclaration(declaration, it.fir) } ?: error("We should be able to find a symbol for property ${declaration.name}: ${declaration.getElementTextInContext()}") return propertyCandidate.fir @@ -96,9 +96,6 @@ private fun FirSymbolProvider.findCallableCandidates( getClassDeclaredPropertySymbols(containerClassId, declaration.nameAsSafeName) } -private fun representSameFunction(psiFunction: KtNamedFunction, it: FirFunction): Boolean = - KtDeclarationAndFirDeclarationEqualityChecker.representsTheSameDeclaration(psiFunction, it) - private fun representSameConstructor(psiConstructor: KtConstructor<*>, firConstructor: FirConstructor): Boolean { if ((firConstructor.isPrimary) != (psiConstructor is KtPrimaryConstructor)) { return false