[ULC] Better support for UL MultifileFacade classes

This commit is contained in:
Igor Yakovlev
2020-05-20 23:44:39 +03:00
parent bc12fb0d6b
commit 025e2f2fe9
3 changed files with 33 additions and 19 deletions
@@ -6,13 +6,13 @@
package org.jetbrains.kotlin.asJava.classes package org.jetbrains.kotlin.asJava.classes
import com.intellij.psi.* import com.intellij.psi.*
import com.intellij.psi.impl.PsiSuperMethodImplUtil
import com.intellij.psi.impl.java.stubs.PsiJavaFileStub import com.intellij.psi.impl.java.stubs.PsiJavaFileStub
import com.intellij.psi.util.CachedValue import com.intellij.psi.util.CachedValue
import org.jetbrains.kotlin.asJava.builder.LightClassData import org.jetbrains.kotlin.asJava.builder.LightClassData
import org.jetbrains.kotlin.asJava.builder.LightClassDataHolder import org.jetbrains.kotlin.asJava.builder.LightClassDataHolder
import org.jetbrains.kotlin.asJava.elements.KtLightField import org.jetbrains.kotlin.asJava.elements.KtLightField
import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.asJava.elements.KtLightMethod
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtNamedFunction
@@ -61,31 +61,39 @@ class KtUltraLightClassForFacade(
result: MutableList<KtLightMethod> result: MutableList<KtLightMethod>
) { ) {
for (declaration in file.declarations.filterNot { it.isHiddenByDeprecation(support) }) { for (declaration in file.declarations.filterNot { it.isHiddenByDeprecation(support) }) {
when (declaration) { val methods = when (declaration) {
is KtNamedFunction -> result.addAll(creator.createMethods(declaration, true)) is KtNamedFunction -> creator.createMethods(
is KtProperty -> { ktFunction = declaration,
result.addAll( forceStatic = true
creator.propertyAccessors( )
declaration, declaration.isVar, is KtProperty -> creator.propertyAccessors(
forceStatic = true, declaration, declaration.isVar,
onlyJvmStatic = false forceStatic = true,
) onlyJvmStatic = false,
) )
else -> emptyList()
}
} }
result.addAll(methods)
} }
} }
private val _ownMethods: List<KtLightMethod> by lazyPub { private val _ownMethods: List<KtLightMethod> by lazyPub {
mutableListOf<KtLightMethod>().also { result -> val result = mutableListOf<KtLightMethod>()
for ((file, support, creator) in filesWithSupportsWithCreators) { for ((file, support, creator) in filesWithSupportsWithCreators) {
loadMethodsFromFile(file, support, creator, result) loadMethodsFromFile(file, support, creator, result)
} }
if (!multiFileClass) result else result.filterNot { it.hasModifierProperty(PsiModifier.PRIVATE) }
}
private val multiFileClass: Boolean by lazyPub {
filesWithSupports.any {
it.second.findAnnotation(it.first, JvmFileClassUtil.JVM_MULTIFILE_CLASS) != null
} }
} }
private val _ownFields: List<KtLightField> by lazyPub { private val _ownFields: List<KtLightField> by lazyPub {
if (multiFileClass) return@lazyPub emptyList()
hashSetOf<String>().let { nameCache -> hashSetOf<String>().let { nameCache ->
filesWithSupportsWithCreators.flatMap { (file, _, creator) -> filesWithSupportsWithCreators.flatMap { (file, _, creator) ->
file.declarations.filterIsInstance<KtProperty>().mapNotNull { file.declarations.filterIsInstance<KtProperty>().mapNotNull {
@@ -2,3 +2,7 @@
@file:JvmName("multifileFacade") @file:JvmName("multifileFacade")
fun foo() = 42 fun foo() = 42
val x = 24
private fun privateFoo(): Int = 3
@@ -2,3 +2,5 @@
@file:JvmName("multifileFacade") @file:JvmName("multifileFacade")
fun bar() = 24 fun bar() = 24
val y = 24