diff options
Diffstat (limited to 'plugins/kotlin/uast/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/internal/firKotlinInternalUastUtils.kt')
-rw-r--r-- | plugins/kotlin/uast/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/internal/firKotlinInternalUastUtils.kt | 48 |
1 files changed, 37 insertions, 11 deletions
diff --git a/plugins/kotlin/uast/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/internal/firKotlinInternalUastUtils.kt b/plugins/kotlin/uast/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/internal/firKotlinInternalUastUtils.kt index 7f69f5f5629c..de69d59c27fc 100644 --- a/plugins/kotlin/uast/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/internal/firKotlinInternalUastUtils.kt +++ b/plugins/kotlin/uast/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/internal/firKotlinInternalUastUtils.kt @@ -7,24 +7,27 @@ import com.intellij.psi.util.PsiTypesUtil import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionLikeSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol import org.jetbrains.kotlin.analysis.api.types.KtClassErrorType import org.jetbrains.kotlin.analysis.api.types.KtNonErrorClassType import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.types.KtTypeMappingMode +import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule +import org.jetbrains.kotlin.analysis.project.structure.getKtModule import org.jetbrains.kotlin.asJava.getRepresentativeLightMethod import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.name.StandardClassIds -import org.jetbrains.kotlin.psi.KtClass -import org.jetbrains.kotlin.psi.KtConstructor -import org.jetbrains.kotlin.psi.KtElement -import org.jetbrains.kotlin.psi.KtNamedFunction +import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.containingClass import org.jetbrains.kotlin.types.typeUtil.TypeNullability import org.jetbrains.uast.* import org.jetbrains.uast.kotlin.FirKotlinUastLanguagePlugin import org.jetbrains.uast.kotlin.TypeOwnerKind +import org.jetbrains.uast.kotlin.getContainingLightClass import org.jetbrains.uast.kotlin.lz +import org.jetbrains.uast.kotlin.psi.UastFakeLightMethod +import org.jetbrains.uast.kotlin.psi.UastFakeLightPrimaryConstructor val firKotlinUastPlugin: FirKotlinUastLanguagePlugin by lz { UastLanguagePlugin.getInstances().single { it.language == KotlinLanguage.INSTANCE } as FirKotlinUastLanguagePlugin? @@ -52,13 +55,36 @@ internal fun KtAnalysisSession.toPsiClass( } internal fun KtAnalysisSession.toPsiMethod(functionSymbol: KtFunctionLikeSymbol): PsiMethod? { - val psi = functionSymbol.psi ?: return null - try { - return psi.getRepresentativeLightMethod() - } catch (e: IllegalStateException) { - // TODO: Creating FirModuleResolveState is not yet supported for LibrarySourceInfo(libraryName=myLibrary) - // this happens while destructuring a variable via Pair casting (testDestructuringDeclaration). - return null + return when (val psi = functionSymbol.psi) { + null -> null + is PsiMethod -> psi + is KtClassOrObject -> { + // For synthetic members in enum classes, `psi` points to their containing enum class. + if (psi is KtClass && psi.isEnum()) { + val lc = psi.toLightClass() ?: return null + lc.methods.find { it.name == (functionSymbol as? KtFunctionSymbol)?.name?.identifier }?.let { return it } + } + + // Default primary constructor + psi.primaryConstructor?.getRepresentativeLightMethod()?.let { return it } + val lc = psi.toLightClass() ?: return null + lc.constructors.firstOrNull()?.let { return it } + if (psi.isLocal) UastFakeLightPrimaryConstructor(psi, lc) else null + } + is KtFunction -> { + // For JVM-invisible methods, such as @JvmSynthetic, LC conversion returns nothing, so fake it + fun handleLocalOrSynthetic(source: KtFunction): PsiMethod? { + val ktModule = source.getKtModule() + if (ktModule !is KtSourceModule) return null + return getContainingLightClass(source)?.let { UastFakeLightMethod(source, it) } + } + + if (psi.isLocal) + handleLocalOrSynthetic(psi) + else + psi.getRepresentativeLightMethod() ?: handleLocalOrSynthetic(psi) + } + else -> psi.getRepresentativeLightMethod() } } |