FIR UAST: convert (light) class for facade

This commit is contained in:
Jinseong Jeon
2021-05-05 15:16:07 -07:00
committed by Ilya Kirillov
parent 9baa24e626
commit 939740d26e
6 changed files with 36 additions and 8 deletions
@@ -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<UFile> { 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) } }
)
}
@@ -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<UClass>
get() {
// TODO: Script
// TODO: Facade: getOrCreateFirLightFacade()
return sourcePsi.declarations.mapNotNull { (it as? KtClassOrObject)?.toUClass() }
}
override val classes: List<UClass> 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<UClass>(this, this@FirKotlinUFile)
}
@@ -1 +1,7 @@
UFile (package = declaration)
UClass (name = Utils)
UMethod (name = foo)
[!] FirUnknownKotlinExpression (INTEGER_CONSTANT)
UMethod (name = buzz)
UParameter (name = $this$buzz)
[!] FirUnknownKotlinExpression (BLOCK)
@@ -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)
}
@@ -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)
@@ -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<java.lang.Runnable> = [!] FirUnknownKotlinExpression (CALL_EXPRESSION)