From e2bcdf8b9c346d9cd5d9f504be1f41914c2148a8 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 6 Jun 2016 22:24:48 +0300 Subject: [PATCH] Postpone counting fqName for anonymous classes (KT-12645) #KT-12645 Fixed --- .../KtLightClassForAnonymousDeclaration.kt | 6 +++--- .../kotlin/asJava/KtLightClassForEnumEntry.kt | 2 +- .../KtLightClassForExplicitDeclaration.kt | 21 +++++++++++++------ .../KtLightClassForInterfaceDefaultImpls.kt | 2 +- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForAnonymousDeclaration.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForAnonymousDeclaration.kt index b735a96e3c7..c8ba1a71543 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForAnonymousDeclaration.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForAnonymousDeclaration.kt @@ -25,9 +25,9 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.resolve.DescriptorUtils -internal open class KtLightClassForAnonymousDeclaration(name: FqName, +internal open class KtLightClassForAnonymousDeclaration(fqNameFunction: ((KtClassOrObject) -> FqName), classOrObject: KtClassOrObject) : - KtLightClassForExplicitDeclaration(name, classOrObject), PsiAnonymousClass { + KtLightClassForExplicitDeclaration(fqNameFunction, classOrObject), PsiAnonymousClass { private var cachedBaseType: SoftReference? = null @@ -120,7 +120,7 @@ internal open class KtLightClassForAnonymousDeclaration(name: FqName, override fun getTypeParameterList() = null override fun isEnum() = false - override fun copy(): PsiElement = KtLightClassForAnonymousDeclaration(classFqName, classOrObject) + override fun copy(): PsiElement = KtLightClassForAnonymousDeclaration({ classFqName }, classOrObject) companion object { private val LOG = Logger.getInstance(KtLightClassForAnonymousDeclaration::class.java) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForEnumEntry.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForEnumEntry.kt index 7a15c01fffa..fe5bb3ebd1d 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForEnumEntry.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForEnumEntry.kt @@ -25,7 +25,7 @@ internal class KtLightClassForEnumEntry( fqName: FqName, enumEntry: KtEnumEntry, private val enumConstant: PsiEnumConstant -): KtLightClassForAnonymousDeclaration(fqName, enumEntry), PsiEnumConstantInitializer { +): KtLightClassForAnonymousDeclaration({ fqName }, enumEntry), PsiEnumConstantInitializer { override fun getEnumConstant(): PsiEnumConstant = enumConstant override fun copy() = KtLightClassForEnumEntry(classFqName, classOrObject as KtEnumEntry, enumConstant) } diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForExplicitDeclaration.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForExplicitDeclaration.kt index 1e776e0a362..556ed6eb0b7 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForExplicitDeclaration.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForExplicitDeclaration.kt @@ -54,11 +54,15 @@ import java.util.* import javax.swing.Icon open class KtLightClassForExplicitDeclaration( - protected val classFqName: FqName, // FqName of (possibly inner) class + private val classFqNameFunction: ((KtClassOrObject) -> FqName), protected val classOrObject: KtClassOrObject) : KtWrappingLightClass(classOrObject.manager), KtJavaMirrorMarker, StubBasedPsiElement> { private val lightIdentifier = KtLightIdentifier(this, classOrObject) + protected val classFqName : FqName by lazy(LazyThreadSafetyMode.PUBLICATION) { + classFqNameFunction(classOrObject) + } + private val _extendsList by lazy(LazyThreadSafetyMode.PUBLICATION) { val listDelegate = super.getExtendsList() ?: return@lazy null KtLightPsiReferenceList(listDelegate, this) @@ -153,7 +157,7 @@ open class KtLightClassForExplicitDeclaration( override fun getFqName(): FqName = classFqName override fun copy(): PsiElement { - return KtLightClassForExplicitDeclaration(classFqName, classOrObject.copy() as KtClassOrObject) + return KtLightClassForExplicitDeclaration({ classFqName }, classOrObject.copy() as KtClassOrObject) } override val clsDelegate: PsiClass by lazy(LazyThreadSafetyMode.PUBLICATION) { @@ -421,13 +425,18 @@ open class KtLightClassForExplicitDeclaration( fun create(classOrObject: KtClassOrObject): KtLightClassForExplicitDeclaration? { - val fqName = predictFqName(classOrObject) ?: return null - if (classOrObject is KtObjectDeclaration && classOrObject.isObjectLiteral()) { - return KtLightClassForAnonymousDeclaration(fqName, classOrObject) + if (classOrObject.containingFile.virtualFile == null) { + return null + } + + return KtLightClassForAnonymousDeclaration( + { predictFqName(it) ?: throw IllegalArgumentException("Failed to create fqname for anonymous class: " + classOrObject) }, + classOrObject) } - return KtLightClassForExplicitDeclaration(fqName, classOrObject) + val fqName = predictFqName(classOrObject) ?: return null + return KtLightClassForExplicitDeclaration({ fqName }, classOrObject) } private fun predictFqName(classOrObject: KtClassOrObject): FqName? { diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForInterfaceDefaultImpls.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForInterfaceDefaultImpls.kt index 5c6b4e178a4..f4b991acad7 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForInterfaceDefaultImpls.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForInterfaceDefaultImpls.kt @@ -24,7 +24,7 @@ import org.jetbrains.kotlin.psi.KtClassOrObject open class KtLightClassForInterfaceDefaultImpls( classFqName: FqName, classOrObject: KtClassOrObject) -: KtLightClassForExplicitDeclaration(classFqName, classOrObject){ +: KtLightClassForExplicitDeclaration({ classFqName }, classOrObject){ override fun copy(): PsiElement { return KtLightClassForInterfaceDefaultImpls(classFqName, classOrObject.copy() as KtClassOrObject)