diff --git a/compiler/testData/asJava/lightClasses/facades/MultiFile.kt b/compiler/testData/asJava/lightClasses/facades/MultiFile.kt index a1b02f37ab1..3971075b6b4 100644 --- a/compiler/testData/asJava/lightClasses/facades/MultiFile.kt +++ b/compiler/testData/asJava/lightClasses/facades/MultiFile.kt @@ -8,3 +8,5 @@ package test val foo = 42 typealias A = String + +// FIR_COMPARISON \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/annotations/annotationsUtils.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/annotations/annotationsUtils.kt index d46cfe385b9..2a48a8ec550 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/annotations/annotationsUtils.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/annotations/annotationsUtils.kt @@ -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 -} \ No newline at end of file +} + +internal fun KtFile.hasJvmMultifileClassAnnotation(): Boolean = this.annotationEntries + .filter { + it.useSiteTarget?.getAnnotationUseSiteTarget() == AnnotationUseSiteTarget.FILE + }.any { + it.shortName?.asString() == "JvmMultifileClass" + } \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForFacade.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForFacade.kt index bc4ea6706e4..52ee3e692a2 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForFacade.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForFacade.kt @@ -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 ) : 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> { -// computeAnnotations( -// parent = this@FirLightClassForFacade, -// nullability = ConeNullability.UNKNOWN, -// annotationUseSiteTarget = AnnotationUseSiteTarget.FILE -// ) -// } -// } - val annotations = emptyList() //TODO + //TODO make annotations for file site + val annotations: List = emptyList() FirLightClassModifierList(this@FirLightClassForFacade, modifiers, annotations) } @@ -79,7 +68,6 @@ class FirLightClassForFacade( file: KtFile, result: MutableList ) { - //it.isHiddenByDeprecation(support) val declarations = file.declarations .filterIsInstance() .filterNot { multiFileClass && it.isPrivate() } @@ -104,12 +92,7 @@ class FirLightClassForFacade( } private val multiFileClass: Boolean by lazyPub { - false //TODO -// files.any { -// it.withFir { -// 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, result: MutableList ) { + val properties = file.declarations + .filterIsInstance() + .applyIf(multiFileClass) { + filter { it.hasModifier(KtTokens.CONST_KEYWORD) } + } - //it.isHiddenByDeprecation(support) - val declarations = file.declarations - .filterIsInstance() - .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()