From 1b5f72bd599a3725c8b2bf3b27cd8bd49cde7987 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Mon, 25 Feb 2019 15:26:36 +0300 Subject: [PATCH] Enable ultra-light classes by default ^KT-29267 Fixed --- .../KtLightClassForSourceDeclaration.kt | 20 +++++++++++++------ .../kotlin/asJava/classes/KtLightClassImpl.kt | 7 +++++-- .../kotlin/asJava/classes/ultraLightMethod.kt | 16 +++++++++++++++ .../kotlin/asJava/classes/ultraLightPsi.kt | 2 +- .../kotlin/generators/tests/GenerateTests.kt | 2 +- .../generators/tests/GenerateTests.kt.183 | 2 +- .../resolve/IDELightClassGenerationSupport.kt | 3 ++- idea/resources/META-INF/jvm.xml | 2 +- idea/resources/META-INF/jvm.xml.183 | 2 +- .../common/common.kt | 1 - .../AbstractJavaAgainstKotlinCheckerTest.kt | 6 +++--- ...heckerWithoutUltraLightTestGenerated.java} | 6 +++--- .../resolve/AbstractIdeLightClassTest.kt | 2 ++ .../lightClasses/LightClassEqualsTest.java | 4 ++-- ...AbstractKotlinNavigationMultiModuleTest.kt | 5 ----- .../kotlin/idea/perf/UltraLightChecker.kt | 8 ++++---- .../KotlinChangeSignatureTest.kt | 2 -- 17 files changed, 56 insertions(+), 34 deletions(-) rename idea/tests/org/jetbrains/kotlin/checkers/{JavaAgainstKotlinSourceCheckerWithUltraLightTestGenerated.java => JavaAgainstKotlinSourceCheckerWithoutUltraLightTestGenerated.java} (97%) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt index f2d6dc712dc..105d2324b35 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt @@ -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> { 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) } } 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 c750b41d366..7bd0a5146e8 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 @@ -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) -} \ No newline at end of file +} diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMethod.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMethod.kt index ca6a8fee1ed..a0c0882601a 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMethod.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMethod.kt @@ -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 = + PsiSuperMethodImplUtil.findSuperMethodSignaturesIncludingStatic(this, checkAccess) + + override fun findDeepestSuperMethod() = PsiSuperMethodImplUtil.findDeepestSuperMethod(this) + + override fun findDeepestSuperMethods(): Array = PsiSuperMethodImplUtil.findDeepestSuperMethods(this) + + override fun findSuperMethods(): Array = PsiSuperMethodImplUtil.findSuperMethods(this) + + override fun findSuperMethods(checkAccess: Boolean): Array = + PsiSuperMethodImplUtil.findSuperMethods(this, checkAccess) + + override fun findSuperMethods(parentClass: PsiClass?): Array = + PsiSuperMethodImplUtil.findSuperMethods(this, parentClass) + override fun getThrowsList(): PsiReferenceList = _throwsList abstract fun computeDescriptor(): FunctionDescriptor? diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightPsi.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightPsi.kt index 98aeabbf8f2..1bd1dc5244b 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightPsi.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightPsi.kt @@ -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) } diff --git a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt index 970263043a5..6b45ea4ef74 100644 --- a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt +++ b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt @@ -186,7 +186,7 @@ fun main(args: Array) { model("kotlinAndJavaChecker/javaWithKotlin") } - testClass { + testClass { model("kotlinAndJavaChecker/javaAgainstKotlin") model("kotlinAndJavaChecker/javaWithKotlin") } diff --git a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.183 b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.183 index a45a8a76d34..011f9851c8f 100644 --- a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.183 +++ b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.183 @@ -197,7 +197,7 @@ fun main(args: Array) { model("kotlinAndJavaChecker/javaWithKotlin") } - testClass { + testClass { model("kotlinAndJavaChecker/javaAgainstKotlin") model("kotlinAndJavaChecker/javaWithKotlin") } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt index 71f2cd0581b..2ef6a7a2087 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.kt @@ -65,7 +65,8 @@ class IDELightClassGenerationSupport(private val project: Project) : LightClassG if (element.shouldNotBeVisibleAsLightClass() || element is KtObjectDeclaration && element.isObjectLiteral() || element.isLocal || - element is KtEnumEntry + element is KtEnumEntry || + element.containingKtFile.isScript() ) { return null } diff --git a/idea/resources/META-INF/jvm.xml b/idea/resources/META-INF/jvm.xml index b21476dcad2..8f532c82e81 100644 --- a/idea/resources/META-INF/jvm.xml +++ b/idea/resources/META-INF/jvm.xml @@ -159,7 +159,7 @@ testDataPath.replace(".kt", ".extra.kt") testDataPath.endsWith(".kts") -> testDataPath.replace(".kts", ".extra.kts") diff --git a/idea/tests/org/jetbrains/kotlin/idea/lightClasses/LightClassEqualsTest.java b/idea/tests/org/jetbrains/kotlin/idea/lightClasses/LightClassEqualsTest.java index bae45f29be3..f9b682650aa 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/lightClasses/LightClassEqualsTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/lightClasses/LightClassEqualsTest.java @@ -49,8 +49,8 @@ public class LightClassEqualsTest extends KotlinLightCodeInsightFixtureTestCase private static void doTestEquals(@Nullable KtClassOrObject origin) { assertNotNull(origin); - PsiClass lightClass1 = KtLightClassForSourceDeclaration.Companion.createNoCache(origin); - PsiClass lightClass2 = KtLightClassForSourceDeclaration.Companion.createNoCache(origin); + PsiClass lightClass1 = KtLightClassForSourceDeclaration.Companion.createNoCache(origin, true); + PsiClass lightClass2 = KtLightClassForSourceDeclaration.Companion.createNoCache(origin, true); assertNotNull(lightClass1); assertNotNull(lightClass2); diff --git a/idea/tests/org/jetbrains/kotlin/idea/navigation/AbstractKotlinNavigationMultiModuleTest.kt b/idea/tests/org/jetbrains/kotlin/idea/navigation/AbstractKotlinNavigationMultiModuleTest.kt index 3732a02bccc..31497b28dc9 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/navigation/AbstractKotlinNavigationMultiModuleTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/navigation/AbstractKotlinNavigationMultiModuleTest.kt @@ -13,12 +13,10 @@ import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiFile import org.jetbrains.kotlin.idea.codeInsight.GotoSuperActionHandler import org.jetbrains.kotlin.idea.multiplatform.setupMppProjectFromDirStructure -import org.jetbrains.kotlin.idea.perf.forceUsingUltraLightClassesForTest import org.jetbrains.kotlin.idea.stubs.AbstractMultiModuleTest import org.jetbrains.kotlin.idea.test.PluginTestCaseBase import org.jetbrains.kotlin.idea.test.extractMarkerOffset import org.jetbrains.kotlin.idea.test.findFileWithCaret -import org.jetbrains.kotlin.test.InTextDirectivesUtils import java.io.File abstract class AbstractKotlinNavigationMultiModuleTest : AbstractMultiModuleTest() { @@ -27,9 +25,6 @@ abstract class AbstractKotlinNavigationMultiModuleTest : AbstractMultiModuleTest protected fun doTest(testDataDir: String) { setupMppProjectFromDirStructure(File(testDataDir)) val file = project.findFileWithCaret() - if (InTextDirectivesUtils.isDirectiveDefined(file.text, "ULTRA_LIGHT_CLASSES")) { - forceUsingUltraLightClassesForTest() - } val doc = PsiDocumentManager.getInstance(myProject).getDocument(file)!! val offset = doc.extractMarkerOffset(project, "") diff --git a/idea/tests/org/jetbrains/kotlin/idea/perf/UltraLightChecker.kt b/idea/tests/org/jetbrains/kotlin/idea/perf/UltraLightChecker.kt index 2fd2c35e848..db583a99b5b 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/perf/UltraLightChecker.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/perf/UltraLightChecker.kt @@ -19,10 +19,10 @@ import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtFile import org.junit.Assert -fun UsefulTestCase.forceUsingUltraLightClassesForTest() { - KtUltraLightClass.forceUsingUltraLightClasses = true +fun UsefulTestCase.forceUsingOldLightClassesForTest() { + KtUltraLightClass.forceUsingOldLightClasses = true Disposer.register(testRootDisposable, Disposable { - KtUltraLightClass.forceUsingUltraLightClasses = false + KtUltraLightClass.forceUsingOldLightClasses = false }) } @@ -37,7 +37,7 @@ object UltraLightChecker { SyntaxTraverser.psiTraverser(file).filter(KtClassOrObject::class.java).toList() fun checkClassEquivalence(ktClass: KtClassOrObject): KtUltraLightClass? { - val gold = KtLightClassForSourceDeclaration.create(ktClass) + val gold = KtLightClassForSourceDeclaration.createNoCache(ktClass, forceUsingOldLightClasses = true) val ultraLightClass = LightClassGenerationSupport.getInstance(ktClass.project).createUltraLightClass(ktClass) ?: return null if (gold != null) { diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureTest.kt b/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureTest.kt index 07c209f21e3..61809082095 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureTest.kt @@ -26,7 +26,6 @@ import org.jetbrains.kotlin.asJava.toLightMethods import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.idea.caches.resolve.analyze -import org.jetbrains.kotlin.idea.perf.forceUsingUltraLightClassesForTest import org.jetbrains.kotlin.idea.refactoring.changeSignature.ui.KotlinChangeSignatureDialog.Companion.getTypeCodeFragmentContext import org.jetbrains.kotlin.idea.refactoring.changeSignature.ui.KotlinChangeSignatureDialog.Companion.getTypeInfo import org.jetbrains.kotlin.idea.refactoring.changeSignature.ui.KotlinMethodNode @@ -568,7 +567,6 @@ class KotlinChangeSignatureTest : KotlinLightCodeInsightFixtureTestCase() { fun testConvertParameterToReceiverForMember1() = doTest { receiverParameterInfo = newParameters[0] } fun testConvertParameterToReceiverForMemberUltraLight() { - forceUsingUltraLightClassesForTest() doTest { receiverParameterInfo = newParameters[0] } }