diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliKotlinAsJavaSupport.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliKotlinAsJavaSupport.kt index 32295123a61..2f75c17f800 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliKotlinAsJavaSupport.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliKotlinAsJavaSupport.kt @@ -108,7 +108,7 @@ class CliKotlinAsJavaSupport( ).mapNotNull { member -> (member as? PackageViewDescriptor)?.fqName } } - override fun getLightClass(classOrObject: KtClassOrObject): KtLightClass? = KtLightClassImpl.create(classOrObject) + override fun getLightClass(classOrObject: KtClassOrObject): KtLightClass? = KotlinLightClassFactory.createClass(classOrObject) override fun getLightClassForScript(script: KtScript): KtLightClassForScript? = KtLightClassForScript.create(script) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KotlinLightClassFactory.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KotlinLightClassFactory.kt new file mode 100644 index 00000000000..0c0397529ae --- /dev/null +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KotlinLightClassFactory.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +@file:Suppress("unused") + +package org.jetbrains.kotlin.asJava.classes + +import com.intellij.psi.util.CachedValueProvider +import com.intellij.psi.util.CachedValuesManager +import org.jetbrains.kotlin.analyzer.KotlinModificationTrackerService +import org.jetbrains.kotlin.asJava.LightClassGenerationSupport +import org.jetbrains.kotlin.psi.KtClassOrObject +import org.jetbrains.kotlin.psi.KtCodeFragment + +object KotlinLightClassFactory { + fun createClass(classOrObject: KtClassOrObject): KtLightClassForSourceDeclaration? = + CachedValuesManager.getCachedValue(classOrObject) { + CachedValueProvider.Result.create( + createClassNoCache(classOrObject), + KotlinModificationTrackerService.getInstance(classOrObject.project).outOfBlockModificationTracker, + ) + } + + fun createClassNoCache(classOrObject: KtClassOrObject): KtLightClassForSourceDeclaration? { + val containingFile = classOrObject.containingFile + if (containingFile is KtCodeFragment) { + // Avoid building light classes for code fragments + return null + } + + if (classOrObject.shouldNotBeVisibleAsLightClass()) { + return null + } + + return LightClassGenerationSupport.getInstance(classOrObject.project).run { + createUltraLightClass(classOrObject) + } + } +} \ No newline at end of file diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForScript.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForScript.kt index e15536e0e1f..91dc5361819 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForScript.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForScript.kt @@ -85,7 +85,7 @@ abstract class KtLightClassForScript(val script: KtScript) : KtLightClassBase(sc // inner classes with null names can't be searched for and can't be used from java anyway // we can't prohibit creating light classes with null names either since they can contain members .filter { it.name != null } - .mapNotNull { KtLightClassImpl.create(it) } + .mapNotNull { KotlinLightClassFactory.createClass(it) } } override fun getInitializers(): Array = PsiClassInitializer.EMPTY_ARRAY diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassImpl.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassImpl.kt index 9731eccfb7c..64b7fabeea8 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassImpl.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassImpl.kt @@ -8,9 +8,6 @@ package org.jetbrains.kotlin.asJava.classes import com.intellij.psi.* import com.intellij.psi.impl.InheritanceImplUtil import com.intellij.psi.scope.PsiScopeProcessor -import com.intellij.psi.util.CachedValueProvider -import com.intellij.psi.util.CachedValuesManager -import org.jetbrains.kotlin.analyzer.KotlinModificationTrackerService import org.jetbrains.kotlin.asJava.LightClassGenerationSupport import org.jetbrains.kotlin.asJava.elements.FakeFileForLightClass import org.jetbrains.kotlin.asJava.elements.KtLightModifierList @@ -22,7 +19,6 @@ import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.FqNameUnsafe import org.jetbrains.kotlin.psi.KtClassBody import org.jetbrains.kotlin.psi.KtClassOrObject -import org.jetbrains.kotlin.psi.KtCodeFragment import org.jetbrains.kotlin.resolve.DescriptorUtils private class KtLightClassModifierList(containingClass: KtLightClassForSourceDeclaration, computeModifiers: () -> Set) : @@ -138,7 +134,7 @@ abstract class KtLightClassImpl @JvmOverloads constructor( private val _containingFile: PsiFile by lazyPub { object : FakeFileForLightClass( classOrObject.containingKtFile, - { if (classOrObject.isTopLevel()) this else create(getOutermostClassOrObject(classOrObject))!! }, + { if (classOrObject.isTopLevel()) this else KotlinLightClassFactory.createClass(getOutermostClassOrObject(classOrObject))!! }, ) { override fun findReferenceAt(offset: Int) = ktFile.findReferenceAt(offset) @@ -173,7 +169,7 @@ abstract class KtLightClassImpl @JvmOverloads constructor( // we can't prohibit creating light classes with null names either since they can contain members .filter { it.name != null } .mapNotNullTo(result) { - create(it) + KotlinLightClassFactory.createClass(it) } if (classOrObject.hasInterfaceDefaultImpls && jvmDefaultMode != JvmDefaultMode.ALL_INCOMPATIBLE) { @@ -190,7 +186,7 @@ abstract class KtLightClassImpl @JvmOverloads constructor( val containingClassOrObject = (classOrObject.parent as? KtClassBody)?.parent as? KtClassOrObject if (containingClassOrObject != null) { - return create(containingClassOrObject) + return KotlinLightClassFactory.createClass(containingClassOrObject) } // TODO: should return null @@ -234,29 +230,5 @@ abstract class KtLightClassImpl @JvmOverloads constructor( KtTokens.PROTECTED_KEYWORD to PsiModifier.PROTECTED, KtTokens.FINAL_KEYWORD to PsiModifier.FINAL, ) - - fun create(classOrObject: KtClassOrObject): KtLightClassForSourceDeclaration? = - CachedValuesManager.getCachedValue(classOrObject) { - CachedValueProvider.Result.create( - createNoCache(classOrObject), - KotlinModificationTrackerService.getInstance(classOrObject.project).outOfBlockModificationTracker, - ) - } - - private fun createNoCache(classOrObject: KtClassOrObject): KtLightClassForSourceDeclaration? { - val containingFile = classOrObject.containingFile - if (containingFile is KtCodeFragment) { - // Avoid building light classes for code fragments - return null - } - - if (classOrObject.shouldNotBeVisibleAsLightClass()) { - return null - } - - return LightClassGenerationSupport.getInstance(classOrObject.project).run { - createUltraLightClass(classOrObject) - } - } } } diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtUltraLightClassForInterfaceDefaultImpls.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtUltraLightClassForInterfaceDefaultImpls.kt index f1984a262ba..e61231999fd 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtUltraLightClassForInterfaceDefaultImpls.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtUltraLightClassForInterfaceDefaultImpls.kt @@ -59,7 +59,7 @@ class KtUltraLightClassForInterfaceDefaultImpls(classOrObject: KtClassOrObject, override fun setName(name: String): PsiElement = throw IncorrectOperationException("Impossible to rename ${JvmAbi.DEFAULT_IMPLS_CLASS_NAME}") - override fun getContainingClass(): KtLightClassForSourceDeclaration? = create(classOrObject) + override fun getContainingClass(): KtLightClassForSourceDeclaration? = KotlinLightClassFactory.createClass(classOrObject) override fun getOwnInnerClasses() = emptyList() override fun getOwnMethods(): List = _ownMethods.value diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtUltraLightClassForRepeatableAnnotationContainer.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtUltraLightClassForRepeatableAnnotationContainer.kt index 809a9bbeb47..fb4a81c467c 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtUltraLightClassForRepeatableAnnotationContainer.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtUltraLightClassForRepeatableAnnotationContainer.kt @@ -22,7 +22,7 @@ class KtUltraLightClassForRepeatableAnnotationContainer(classOrObject: KtClassOr override fun getParent() = containingClass override fun getTypeParameterList(): PsiTypeParameterList? = null override fun getTypeParameters(): Array = emptyArray() - override fun getContainingClass(): KtLightClassForSourceDeclaration? = create(classOrObject) + override fun getContainingClass(): KtLightClassForSourceDeclaration? = KotlinLightClassFactory.createClass(classOrObject) override fun getScope(): PsiElement? = containingClass override fun getOwnInnerClasses() = emptyList() override fun getOwnFields(): List = emptyList() diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt index 6f8edc76852..496aad155e2 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt @@ -485,7 +485,7 @@ open class KtUltraLightClass(classOrObject: KtClassOrObject, internal val suppor val containingBody = classOrObject.parent as? KtClassBody val containingClass = containingBody?.parent as? KtClassOrObject - containingClass?.let { return create(it) } + containingClass?.let { return KotlinLightClassFactory.createClass(it) } val containingBlock = classOrObject.parent as? KtBlockExpression val containingScript = containingBlock?.parent as? KtScript