diff --git a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinConverter.kt b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinConverter.kt index 5756ce6b411..09bce633298 100644 --- a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinConverter.kt +++ b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/FirKotlinConverter.kt @@ -9,6 +9,7 @@ import com.intellij.psi.PsiElement import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.asJava.elements.* +import org.jetbrains.kotlin.asJava.findFacadeClass import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.asJava.toPsiParameters import org.jetbrains.kotlin.psi.* @@ -56,6 +57,9 @@ internal object FirKotlinConverter { is KtFile -> { convertKtFile(original, givenParent, requiredTypes).firstOrNull() } + is FakeFileForLightClass -> { + el { FirKotlinUFile(original.navigationElement) } + } is KtLightClass -> { // TODO: differentiate enum entry @@ -109,8 +113,8 @@ internal object FirKotlinConverter { return requiredTypes.accommodate( // File alternative { FirKotlinUFile(element) }, - // TODO: Facade - // alternative { element.findFacadeClass()?.let { AbstractFirKotlinUClass.create(it, givenParent) } } + // Facade + alternative { element.findFacadeClass()?.let { AbstractFirKotlinUClass.create(it, givenParent) } } ) } diff --git a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUFile.kt b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUFile.kt index b5e45f17b6f..50f173ad7b1 100644 --- a/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUFile.kt +++ b/plugins/uast-kotlin-fir/src/org/jetbrains/uast/kotlin/declarations/FirKotlinUFile.kt @@ -6,6 +6,8 @@ package org.jetbrains.uast.kotlin import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.asJava.findFacadeClass +import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.uast.* @@ -34,12 +36,12 @@ class FirKotlinUFile( sourcePsi.importDirectives.map { FirKotlinUImportStatement(it, this) } } - override val classes: List - get() { - // TODO: Script - // TODO: Facade: getOrCreateFirLightFacade() - return sourcePsi.declarations.mapNotNull { (it as? KtClassOrObject)?.toUClass() } - } + override val classes: List by lz { + val facadeOrScriptClass = if (sourcePsi.isScript()) sourcePsi.script?.toLightClass() else sourcePsi.findFacadeClass() + val facadeOrScriptUClass = facadeOrScriptClass?.toUClass()?.let { listOf(it) } ?: emptyList() + val classes = sourcePsi.declarations.mapNotNull { (it as? KtClassOrObject)?.toUClass() } + facadeOrScriptUClass + classes + } private fun PsiElement.toUClass() = languagePlugin.convertOpt(this, this@FirKotlinUFile) } diff --git a/plugins/uast-kotlin-fir/testData/declaration/facade.log.fir.txt b/plugins/uast-kotlin-fir/testData/declaration/facade.log.fir.txt index dfddf529b8b..5a1ef485e6a 100644 --- a/plugins/uast-kotlin-fir/testData/declaration/facade.log.fir.txt +++ b/plugins/uast-kotlin-fir/testData/declaration/facade.log.fir.txt @@ -1 +1,7 @@ UFile (package = declaration) + UClass (name = Utils) + UMethod (name = foo) + [!] FirUnknownKotlinExpression (INTEGER_CONSTANT) + UMethod (name = buzz) + UParameter (name = $this$buzz) + [!] FirUnknownKotlinExpression (BLOCK) diff --git a/plugins/uast-kotlin-fir/testData/declaration/facade.render.fir.txt b/plugins/uast-kotlin-fir/testData/declaration/facade.render.fir.txt index a9dea72c41a..c2740148fbb 100644 --- a/plugins/uast-kotlin-fir/testData/declaration/facade.render.fir.txt +++ b/plugins/uast-kotlin-fir/testData/declaration/facade.render.fir.txt @@ -1,2 +1,6 @@ package declaration +public final class Utils { + public static final fun foo() : int = [!] FirUnknownKotlinExpression (INTEGER_CONSTANT) + public static final fun buzz($this$buzz: java.lang.String) : java.lang.String = [!] FirUnknownKotlinExpression (BLOCK) +} diff --git a/plugins/uast-kotlin-fir/testData/declaration/objects.log.fir.txt b/plugins/uast-kotlin-fir/testData/declaration/objects.log.fir.txt index 5f1f32eee49..2530031dfd9 100644 --- a/plugins/uast-kotlin-fir/testData/declaration/objects.log.fir.txt +++ b/plugins/uast-kotlin-fir/testData/declaration/objects.log.fir.txt @@ -1,6 +1,12 @@ UFile (package = ) UImportStatement (isOnDemand = false) UImportStatement (isOnDemand = false) + UClass (name = ObjectsKt) + UField (name = topRunnable) + [!] FirUnknownKotlinExpression (OBJECT_LITERAL) + UMethod (name = getTopRunnable) + UMethod (name = main) + [!] FirUnknownKotlinExpression (BLOCK) UClass (name = RunnableManager) UField (name = INSTANCE) UField (name = tasks) diff --git a/plugins/uast-kotlin-fir/testData/declaration/objects.render.fir.txt b/plugins/uast-kotlin-fir/testData/declaration/objects.render.fir.txt index 874a7533c12..3bc7cd6f373 100644 --- a/plugins/uast-kotlin-fir/testData/declaration/objects.render.fir.txt +++ b/plugins/uast-kotlin-fir/testData/declaration/objects.render.fir.txt @@ -1,6 +1,12 @@ import java.lang.Runnable import java.lang.Thread +public final class ObjectsKt { + private static final var topRunnable: java.lang.Runnable = [!] FirUnknownKotlinExpression (OBJECT_LITERAL) + public static final fun getTopRunnable() : java.lang.Runnable = UastEmptyExpression + public static final fun main() : void = [!] FirUnknownKotlinExpression (BLOCK) +} + public final class RunnableManager { public static final var INSTANCE: RunnableManager private final var tasks: java.util.List = [!] FirUnknownKotlinExpression (CALL_EXPRESSION)