Enable ultra-light classes by default

^KT-29267 Fixed
This commit is contained in:
Denis Zharkov
2019-02-25 15:26:36 +03:00
committed by Igor Yakovlev
parent e8fbd42f7c
commit 1b5f72bd59
17 changed files with 56 additions and 34 deletions
@@ -70,7 +70,10 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils
import java.util.*
import javax.swing.Icon
abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtClassOrObject) : KtLazyLightClass(classOrObject.manager),
abstract class KtLightClassForSourceDeclaration(
protected val classOrObject: KtClassOrObject,
private val forceUsingOldLightClasses: Boolean = false
) : KtLazyLightClass(classOrObject.manager),
StubBasedPsiElement<KotlinClassOrObjectStub<out KtClassOrObject>> {
private val lightIdentifier = KtLightIdentifier(this, classOrObject)
@@ -303,7 +306,12 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC
// 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 }
.mapNotNullTo(result) { create(it) }
.mapNotNullTo(result) {
if (!forceUsingOldLightClasses)
create(it)
else
createNoCache(it, forceUsingOldLightClasses = true)
}
if (classOrObject.hasInterfaceDefaultImpls) {
result.add(KtLightClassForInterfaceDefaultImpls(classOrObject))
@@ -334,10 +342,10 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC
fun create(classOrObject: KtClassOrObject): KtLightClassForSourceDeclaration? =
CachedValuesManager.getCachedValue(classOrObject) {
CachedValueProvider.Result
.create(createNoCache(classOrObject), OUT_OF_CODE_BLOCK_MODIFICATION_COUNT)
.create(createNoCache(classOrObject, KtUltraLightClass.forceUsingOldLightClasses), OUT_OF_CODE_BLOCK_MODIFICATION_COUNT)
}
fun createNoCache(classOrObject: KtClassOrObject): KtLightClassForSourceDeclaration? {
fun createNoCache(classOrObject: KtClassOrObject, forceUsingOldLightClasses: Boolean): KtLightClassForSourceDeclaration? {
val containingFile = classOrObject.containingFile
if (containingFile is KtCodeFragment) {
// Avoid building light classes for code fragments
@@ -348,7 +356,7 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC
return null
}
if (KtUltraLightClass.forceUsingUltraLightClasses || Registry.`is`("kotlin.use.ultra.light.classes", false)) {
if (!forceUsingOldLightClasses && Registry.`is`("kotlin.use.ultra.light.classes", true)) {
LightClassGenerationSupport.getInstance(classOrObject.project).createUltraLightClass(classOrObject)?.let { return it }
}
@@ -360,7 +368,7 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC
KtLightClassForLocalDeclaration(classOrObject)
else ->
KtLightClassImpl(classOrObject)
KtLightClassImpl(classOrObject, forceUsingOldLightClasses)
}
}
@@ -19,7 +19,10 @@ package org.jetbrains.kotlin.asJava.classes
import org.jetbrains.kotlin.psi.KtClassOrObject
// light class for top level or (inner/nested of top level) source declarations
open class KtLightClassImpl(classOrObject: KtClassOrObject) : KtLightClassForSourceDeclaration(classOrObject) {
open class KtLightClassImpl(
classOrObject: KtClassOrObject,
forceUsingOldLightClasses: Boolean = false
) : KtLightClassForSourceDeclaration(classOrObject, forceUsingOldLightClasses) {
override fun getQualifiedName() = classOrObject.fqName?.asString()
override fun getParent() = if (classOrObject.isTopLevel())
@@ -28,4 +31,4 @@ open class KtLightClassImpl(classOrObject: KtClassOrObject) : KtLightClassForSou
containingClass
override fun copy() = KtLightClassImpl(classOrObject.copy() as KtClassOrObject)
}
}
@@ -12,6 +12,7 @@ import com.intellij.psi.impl.light.LightMethodBuilder
import com.intellij.psi.impl.light.LightTypeParameterListBuilder
import com.intellij.psi.search.LocalSearchScope
import com.intellij.psi.search.SearchScope
import com.intellij.psi.util.MethodSignatureBackedByPsiMethod
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.asJava.builder.LightMemberOriginForDeclaration
import org.jetbrains.kotlin.asJava.elements.KtLightAbstractAnnotation
@@ -72,6 +73,21 @@ internal abstract class KtUltraLightMethod(
override fun getHierarchicalMethodSignature() = PsiSuperMethodImplUtil.getHierarchicalMethodSignature(this)
override fun findSuperMethodSignaturesIncludingStatic(checkAccess: Boolean): List<MethodSignatureBackedByPsiMethod> =
PsiSuperMethodImplUtil.findSuperMethodSignaturesIncludingStatic(this, checkAccess)
override fun findDeepestSuperMethod() = PsiSuperMethodImplUtil.findDeepestSuperMethod(this)
override fun findDeepestSuperMethods(): Array<out PsiMethod> = PsiSuperMethodImplUtil.findDeepestSuperMethods(this)
override fun findSuperMethods(): Array<out PsiMethod> = PsiSuperMethodImplUtil.findSuperMethods(this)
override fun findSuperMethods(checkAccess: Boolean): Array<out PsiMethod> =
PsiSuperMethodImplUtil.findSuperMethods(this, checkAccess)
override fun findSuperMethods(parentClass: PsiClass?): Array<out PsiMethod> =
PsiSuperMethodImplUtil.findSuperMethods(this, parentClass)
override fun getThrowsList(): PsiReferenceList = _throwsList
abstract fun computeDescriptor(): FunctionDescriptor?
@@ -59,7 +59,7 @@ open class KtUltraLightClass(classOrObject: KtClassOrObject, internal val suppor
// And usages of that property may be replaced with relevant registry key
@Volatile
@get:TestOnly
var forceUsingUltraLightClasses = false
var forceUsingOldLightClasses = false
}
private val tooComplex: Boolean by lazyPub { support.isTooComplexForUltraLightGeneration(classOrObject) }