summaryrefslogtreecommitdiff
path: root/plugins/kotlin/uast/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/internal/firKotlinInternalUastUtils.kt
diff options
context:
space:
mode:
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.kt48
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()
}
}