[FIR IDE] LC better support for JvmMultiFileClass annotation

This commit is contained in:
Igor Yakovlev
2020-11-24 00:56:50 +03:00
parent 56c3faee00
commit 5630667320
3 changed files with 31 additions and 39 deletions
@@ -8,3 +8,5 @@ package test
val foo = 42
typealias A = String
// FIR_COMPARISON
@@ -23,6 +23,8 @@ import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirSymbol
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.mapAnnotationParameters
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotatedSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSimpleConstantValue
import org.jetbrains.kotlin.psi.KtAnnotationUseSiteTarget
import org.jetbrains.kotlin.psi.KtFile
internal fun KtAnnotatedSymbol.hasJvmSyntheticAnnotation(annotationUseSiteTarget: AnnotationUseSiteTarget?): Boolean =
hasAnnotation("kotlin/jvm/JvmSynthetic", annotationUseSiteTarget)
@@ -125,4 +127,11 @@ internal fun KtAnnotatedSymbol.computeAnnotations(
}
return result
}
}
internal fun KtFile.hasJvmMultifileClassAnnotation(): Boolean = this.annotationEntries
.filter {
it.useSiteTarget?.getAnnotationUseSiteTarget() == AnnotationUseSiteTarget.FILE
}.any {
it.shortName?.asString() == "JvmMultifileClass"
}
@@ -20,18 +20,18 @@ import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.asJava.elements.FakeFileForLightClass
import org.jetbrains.kotlin.asJava.elements.KtLightField
import org.jetbrains.kotlin.asJava.elements.KtLightMethod
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.isConst
import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.idea.asJava.classes.createFields
import org.jetbrains.kotlin.idea.asJava.classes.createMethods
import org.jetbrains.kotlin.idea.frontend.api.analyze
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtNamedDeclaration
import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.psi.psiUtil.isPrivate
class FirLightClassForFacade(
@@ -40,33 +40,22 @@ class FirLightClassForFacade(
private val files: Collection<KtFile>
) : FirLightClassBase(manager) {
override val clsDelegate: PsiClass get() = invalidAccess()
private val isMultiFileClass: Boolean by lazyPub {
files.size > 1 || files.any {
JvmFileClassUtil.findAnnotationEntryOnFileNoResolve(
file = it,
shortName = JvmFileClassUtil.JVM_MULTIFILE_CLASS_SHORT
) != null
}
init {
require(files.isNotEmpty())
}
private val firstFileInFacade by lazyPub { files.first() }
override val clsDelegate: PsiClass get() = invalidAccess()
private val _modifierList: PsiModifierList by lazyPub {
if (isMultiFileClass)
if (multiFileClass)
return@lazyPub LightModifierList(manager, KotlinLanguage.INSTANCE, PsiModifier.PUBLIC, PsiModifier.FINAL)
val modifiers = setOf(PsiModifier.PUBLIC, PsiModifier.FINAL)
// val annotations = files.flatMap { file ->
// file.withFir<FirFile, List<PsiAnnotation>> {
// computeAnnotations(
// parent = this@FirLightClassForFacade,
// nullability = ConeNullability.UNKNOWN,
// annotationUseSiteTarget = AnnotationUseSiteTarget.FILE
// )
// }
// }
val annotations = emptyList<PsiAnnotation>() //TODO
//TODO make annotations for file site
val annotations: List<PsiAnnotation> = emptyList()
FirLightClassModifierList(this@FirLightClassForFacade, modifiers, annotations)
}
@@ -79,7 +68,6 @@ class FirLightClassForFacade(
file: KtFile,
result: MutableList<KtLightMethod>
) {
//it.isHiddenByDeprecation(support)
val declarations = file.declarations
.filterIsInstance<KtNamedDeclaration>()
.filterNot { multiFileClass && it.isPrivate() }
@@ -104,12 +92,7 @@ class FirLightClassForFacade(
}
private val multiFileClass: Boolean by lazyPub {
false //TODO
// files.any {
// it.withFir<FirFile, Boolean> {
// this.hasAnnotation(JvmFileClassUtil.JVM_MULTIFILE_CLASS.asString())
// }
// }
files.size > 1 || files.any { it.hasJvmMultifileClassAnnotation() }
}
private fun loadFieldsFromFile(
@@ -117,16 +100,16 @@ class FirLightClassForFacade(
usedFieldNames: MutableSet<String>,
result: MutableList<KtLightField>
) {
val properties = file.declarations
.filterIsInstance<KtProperty>()
.applyIf(multiFileClass) {
filter { it.hasModifier(KtTokens.CONST_KEYWORD) }
}
//it.isHiddenByDeprecation(support)
val declarations = file.declarations
.filterIsInstance<KtNamedDeclaration>()
.filterNot { multiFileClass && it is FirProperty && it.isConst }
if (declarations.isEmpty()) return
if (properties.isEmpty()) return
val symbols = analyze(file) {
declarations.mapNotNull {
properties.mapNotNull {
it.getSymbol() as? KtCallableSymbol
}
}
@@ -150,8 +133,6 @@ class FirLightClassForFacade(
override fun copy(): FirLightClassForFacade =
FirLightClassForFacade(manager, facadeClassFqName, files)
private val firstFileInFacade by lazyPub { files.iterator().next() }
private val packageFqName: FqName =
facadeClassFqName.parent()