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