Postpone counting fqName for anonymous classes (KT-12645)

#KT-12645 Fixed
This commit is contained in:
Nikolay Krasko
2016-06-06 22:24:48 +03:00
parent 8357f3021e
commit e2bcdf8b9c
4 changed files with 20 additions and 11 deletions
@@ -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<PsiClassType>? = 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)
@@ -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)
}
@@ -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<KotlinClassOrObjectStub<out KtClassOrObject>> {
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? {
@@ -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)