From 0b285a951ad2e58e1000816a9a14f4a833cccf23 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Tue, 26 Jul 2022 20:58:35 +0200 Subject: [PATCH] [Analysis API FIR] do not fail PsiClass.getNamedClassSymbol on Kotlin classes --- .../components/KtFirSymbolProviderByJavaPsi.kt | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolProviderByJavaPsi.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolProviderByJavaPsi.kt index 98fcada2e2e..70dae899a5f 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolProviderByJavaPsi.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolProviderByJavaPsi.kt @@ -5,11 +5,8 @@ package org.jetbrains.kotlin.analysis.api.fir.components -import com.intellij.psi.PsiClass -import com.intellij.psi.PsiField -import com.intellij.psi.PsiMember -import com.intellij.psi.PsiMethod -import com.intellij.psi.PsiTypeParameter +import com.intellij.psi.* +import com.intellij.psi.impl.compiled.ClsElementImpl import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol @@ -17,6 +14,8 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolProviderByJavaPsi import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.firClassByPsiClassProvider import org.jetbrains.kotlin.analysis.project.structure.getKtModule +import org.jetbrains.kotlin.asJava.KtLightClassMarker +import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.name.Name @OptIn(KtAnalysisApiInternals::class) @@ -26,18 +25,24 @@ internal class KtFirSymbolProviderByJavaPsi( override fun getNamedClassSymbol(psiClass: PsiClass): KtNamedClassOrObjectSymbol? { if (psiClass.qualifiedName == null) return null if (psiClass is PsiTypeParameter) return null + if (psiClass is KtLightClassMarker) return null + if (psiClass.isKotlinCompiledClass()) return null + val module = psiClass.getKtModule(analysisSession.project) val provider = firResolveSession.getSessionFor(module).firClassByPsiClassProvider val firClass = provider.getFirClass(psiClass) ?: return null return firSymbolBuilder.classifierBuilder.buildNamedClassOrObjectSymbol(firClass) } + private fun PsiClass.isKotlinCompiledClass() = + this is ClsElementImpl && hasAnnotation(JvmAnnotationNames.METADATA_FQ_NAME.asString()) + override fun getCallableSymbol(callable: PsiMember): KtCallableSymbol? { if (callable !is PsiMethod && callable !is PsiField) return null val name = callable.name?.let(Name::identifier) ?: return null val containingClass = callable.containingClass ?: return null val classSymbol = getNamedClassSymbol(containingClass) ?: return null - return with(analysisSession) { + return with(analysisSession) { classSymbol.getDeclaredMemberScope() .getCallableSymbols { it == name } .firstOrNull { it.psi == callable }