From 5be31e575c356aa1e2bf5454ac23d946a2bd297b Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Wed, 10 Aug 2022 17:30:59 +0200 Subject: [PATCH] [lc] extract common code to KtLightClassForFacadeBase ^KT-53543 --- .../classes/KtLightClassForFacadeBase.kt | 44 +++++++++++--- .../classes/ultraKtLightClassForFacade.kt | 58 ++++++------------- 2 files changed, 54 insertions(+), 48 deletions(-) diff --git a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacadeBase.kt b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacadeBase.kt index 5b6384980c6..2f86f6ab6da 100644 --- a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacadeBase.kt +++ b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacadeBase.kt @@ -12,12 +12,15 @@ import com.intellij.psi.impl.light.LightEmptyImplementsList import com.intellij.psi.impl.light.LightModifierList import org.jetbrains.annotations.NonNls 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.fileClasses.JvmFileClassUtil import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.JvmNames import org.jetbrains.kotlin.name.JvmNames.JVM_NAME_SHORT import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtFile @@ -28,15 +31,25 @@ import javax.swing.Icon abstract class KtLightClassForFacadeBase constructor( override val facadeClassFqName: FqName, - override val files: Collection + final override val files: Collection ) : KtLightClassBase(files.first().manager), KtLightClassForFacade { - private val firstFileInFacade by lazyPub { files.iterator().next() } + private val firstFileInFacade by lazyPub { files.first() } - private val modifierList: PsiModifierList = - LightModifierList(manager, KotlinLanguage.INSTANCE, PsiModifier.PUBLIC, PsiModifier.FINAL) + val isMultiFileClass: Boolean by lazyPub { + files.size > 1 || JvmFileClassUtil.findAnnotationEntryOnFileNoResolve(firstFileInFacade, JvmNames.JVM_MULTIFILE_CLASS_SHORT) != null + } - private val implementsList: LightEmptyImplementsList = + private val _modifierList: PsiModifierList by lazyPub { + if (isMultiFileClass) + LightModifierList(manager, KotlinLanguage.INSTANCE, PsiModifier.PUBLIC, PsiModifier.FINAL) + else + createModifierListForSimpleFacade() + } + + + private val _implementsList: LightEmptyImplementsList by lazyPub { LightEmptyImplementsList(manager) + } private val packageClsFile by lazyPub { FakeFileForLightClass( @@ -46,6 +59,19 @@ abstract class KtLightClassForFacadeBase constructor( ) } + private val _ownMethods: List by lazyPub { + createOwnMethods() + } + + private val _ownFields: List by lazyPub { + createOwnFields() + } + + abstract fun createOwnMethods(): List + abstract fun createOwnFields(): List + + abstract fun createModifierListForSimpleFacade(): PsiModifierList + override fun getParent(): PsiElement = containingFile override val kotlinOrigin: KtClassOrObject? get() = null @@ -53,7 +79,7 @@ abstract class KtLightClassForFacadeBase constructor( val fqName: FqName get() = facadeClassFqName - override fun getModifierList() = modifierList + override fun getModifierList() = _modifierList override fun hasModifierProperty(@NonNls name: String) = modifierList.hasModifierProperty(name) @@ -79,7 +105,7 @@ abstract class KtLightClassForFacadeBase constructor( override fun getDocComment(): Nothing? = null - override fun getImplementsList() = implementsList + override fun getImplementsList() = _implementsList override fun getImplementsListTypes(): Array = PsiClassType.EMPTY_ARRAY @@ -204,5 +230,9 @@ abstract class KtLightClassForFacadeBase constructor( override fun isWritable() = files.all { it.isWritable } + override fun getOwnFields() = _ownFields + + override fun getOwnMethods() = _ownMethods + override fun getVisibleSignatures(): MutableCollection = PsiSuperMethodImplUtil.getVisibleSignatures(this) } diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraKtLightClassForFacade.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraKtLightClassForFacade.kt index b960c6cc258..411fc910049 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraKtLightClassForFacade.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraKtLightClassForFacade.kt @@ -8,14 +8,9 @@ package org.jetbrains.kotlin.asJava.classes import com.intellij.psi.PsiElement import com.intellij.psi.PsiModifier import com.intellij.psi.PsiModifierList -import com.intellij.psi.impl.light.LightModifierList import org.jetbrains.kotlin.asJava.elements.* -import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil.findAnnotationEntryOnFileNoResolve -import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.name.JvmNames.JVM_MULTIFILE_CLASS -import org.jetbrains.kotlin.name.JvmNames.JVM_MULTIFILE_CLASS_SHORT import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtProperty @@ -24,17 +19,10 @@ import org.jetbrains.kotlin.psi.psiUtil.isPrivate class KtUltraLightClassForFacade( facadeClassFqName: FqName, files: Collection, - private val filesWithSupports: Collection> + private val filesWithSupports: Collection>, ) : KtLightClassForFacadeBase(facadeClassFqName, files) { - private val _modifierList: PsiModifierList by lazyPub { - if (isMultiFileClass) - LightModifierList(manager, KotlinLanguage.INSTANCE, PsiModifier.PUBLIC, PsiModifier.FINAL) - else - KtUltraLightSimpleModifierList(owner = this, modifiers = setOf(PsiModifier.PUBLIC, PsiModifier.FINAL)) - } - - private val isMultiFileClass: Boolean by lazyPub { - files.size > 1 || files.any { findAnnotationEntryOnFileNoResolve(it, JVM_MULTIFILE_CLASS_SHORT) != null } + private val _modifierListForSimpleFacade: PsiModifierList by lazyPub { + KtUltraLightSimpleModifierList(owner = this, modifiers = setOf(PsiModifier.PUBLIC, PsiModifier.FINAL)) } private val _givenAnnotations: List? by lazyPub { @@ -44,7 +32,7 @@ class KtUltraLightClassForFacade( name = entry.shortName?.identifier, lazyQualifiedName = { entry.analyzeAnnotation()?.fqName?.asString() }, kotlinOrigin = entry, - parent = _modifierList + parent = modifierList ) } } @@ -53,7 +41,7 @@ class KtUltraLightClassForFacade( override val givenAnnotations: List? get() = if (isMultiFileClass) emptyList() else _givenAnnotations - override fun getModifierList(): PsiModifierList = _modifierList + override fun createModifierListForSimpleFacade(): PsiModifierList = _modifierListForSimpleFacade override fun getScope(): PsiElement? = parent @@ -103,35 +91,23 @@ class KtUltraLightClassForFacade( } } - private val _ownMethods: List by lazyPub { - val result = mutableListOf() - for ((file, support, creator) in filesWithSupportsWithCreators) { - 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, JVM_MULTIFILE_CLASS) != null - } - } - - private val _ownFields: List by lazyPub { - hashSetOf().let { nameCache -> - filesWithSupportsWithCreators.flatMap { (file, _, creator) -> - val allProperties = file.declarations.filterIsInstance() - val properties = if (multiFileClass) allProperties.filter { it.hasModifier(KtTokens.CONST_KEYWORD) } else allProperties - properties.mapNotNull { - creator.createPropertyField(it, nameCache, forceStatic = true) - } + override fun createOwnFields(): List = hashSetOf().let { nameCache -> + filesWithSupportsWithCreators.flatMap { (file, _, creator) -> + val allProperties = file.declarations.filterIsInstance() + val properties = if (isMultiFileClass) allProperties.filter { it.hasModifier(KtTokens.CONST_KEYWORD) } else allProperties + properties.mapNotNull { + creator.createPropertyField(it, nameCache, forceStatic = true) } } } - override fun getOwnFields() = _ownFields + override fun createOwnMethods() = mutableListOf().let { result -> + for ((file, support, creator) in filesWithSupportsWithCreators) { + loadMethodsFromFile(file, support, creator, result) + } - override fun getOwnMethods() = _ownMethods + if (!isMultiFileClass) result else result.filterNot { it.hasModifierProperty(PsiModifier.PRIVATE) } + } override fun copy(): KtLightClassForFacade = KtUltraLightClassForFacade(facadeClassFqName, files, filesWithSupports) }