Support forcing usage of ultra-light classes in tests

This commit is contained in:
Denis Zharkov
2018-10-30 16:00:02 +03:00
parent 03e937ddfa
commit 5f45ab1e2b
3 changed files with 23 additions and 3 deletions
@@ -341,7 +341,7 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC
return null
}
if (Registry.`is`("kotlin.use.ultra.light.classes", false)) {
if (KtUltraLightClass.forceUsingUltraLightClasses || Registry.`is`("kotlin.use.ultra.light.classes", false)) {
LightClassGenerationSupport.getInstance(classOrObject.project).createUltraLightClass(classOrObject)?.let { return it }
}
@@ -14,6 +14,7 @@ import com.intellij.psi.impl.PsiSuperMethodImplUtil
import com.intellij.psi.impl.light.*
import com.intellij.psi.util.TypeConversionUtil
import org.jetbrains.annotations.NonNls
import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.asJava.LightClassGenerationSupport
import org.jetbrains.kotlin.asJava.builder.LightClassData
import org.jetbrains.kotlin.asJava.builder.LightMemberOriginForDeclaration
@@ -47,6 +48,15 @@ import org.jetbrains.kotlin.types.KotlinType
class KtUltraLightClass(classOrObject: KtClassOrObject, private val support: UltraLightSupport) :
KtLightClassImpl(classOrObject) {
companion object {
// This property may be removed once IntelliJ versions earlier than 2018.3 become unsupported
// And usages of that property may be replaced with relevant registry change
@Volatile
@TestOnly
var forceUsingUltraLightClasses = false
}
private val tooComplex: Boolean by lazyPub { support.isTooComplexForUltraLightGeneration(classOrObject) }
override fun isFinal(isFinalByPsi: Boolean) = if (tooComplex) super.isFinal(isFinalByPsi) else isFinalByPsi
@@ -658,4 +668,4 @@ interface UltraLightSupport {
val moduleName: String
fun findAnnotation(owner: KtAnnotated, fqName: FqName): Pair<KtAnnotationEntry, AnnotationDescriptor>?
fun isTooComplexForUltraLightGeneration(element: KtClassOrObject): Boolean
}
}
@@ -5,7 +5,10 @@
package org.jetbrains.kotlin.idea.perf
import com.intellij.openapi.Disposable
import com.intellij.openapi.util.Disposer
import com.intellij.psi.*
import com.intellij.testFramework.UsefulTestCase
import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.asJava.LightClassGenerationSupport
import org.jetbrains.kotlin.asJava.classes.KtLightClassForSourceDeclaration
@@ -14,6 +17,13 @@ import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtFile
import org.junit.Assert
fun UsefulTestCase.forceUsingUltraLightClassesForTest() {
KtUltraLightClass.forceUsingUltraLightClasses = true
Disposer.register(testRootDisposable, Disposable {
KtUltraLightClass.forceUsingUltraLightClasses = false
})
}
@TestOnly
object UltraLightChecker {
fun checkClassEquivalence(file: KtFile) {
@@ -122,4 +132,4 @@ object UltraLightChecker {
"}"
}
}
}