diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt index 2cc78186c7b..a11d803ca16 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt @@ -323,6 +323,12 @@ abstract class CommonCompilerArguments : CommonToolArguments() { ) var useFirExtendedCheckers: Boolean by FreezableVar(false) + @Argument( + value = "-Xdisable-ultra-light-classes", + description = "Do not use the ultra light classes implementation" + ) + var disableUltraLightClasses: Boolean by FreezableVar(false) + @Argument( value = "-Xuse-mixed-named-arguments", description = "Enable Support named arguments in their own position even if the result appears as mixed" diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt index a0dfb96ad65..df91c11f49b 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt @@ -401,6 +401,7 @@ class K2JVMCompilerArguments : CommonCompilerArguments() { result[JvmAnalysisFlags.suppressMissingBuiltinsError] = suppressMissingBuiltinsError result[JvmAnalysisFlags.irCheckLocalNames] = irCheckLocalNames result[AnalysisFlags.reportErrorsOnIrDependencies] = !useIR && !useFir && !allowJvmIrDependencies + result[JvmAnalysisFlags.disableUltraLightClasses] = disableUltraLightClasses return result } diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliLightClassGenerationSupport.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliLightClassGenerationSupport.kt index d49ab460d2b..53ddc5f4960 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliLightClassGenerationSupport.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliLightClassGenerationSupport.kt @@ -103,6 +103,9 @@ class CliLightClassGenerationSupport( return ultraLightSupport } + override val useUltraLightClasses: Boolean + get() = !KtUltraLightSupport.forceUsingOldLightClasses && !traceHolder.languageVersionSettings.getFlag(JvmAnalysisFlags.disableUltraLightClasses) + override fun createDataHolderForClass(classOrObject: KtClassOrObject, builder: LightClassBuilder): LightClassDataHolder.ForClass { //force resolve companion for light class generation traceHolder.bindingContext.get(BindingContext.CLASS, classOrObject)?.companionObjectDescriptor diff --git a/compiler/config.jvm/src/org/jetbrains/kotlin/config/JvmAnalysisFlags.kt b/compiler/config.jvm/src/org/jetbrains/kotlin/config/JvmAnalysisFlags.kt index dbd2578ae71..b6626b5b53a 100644 --- a/compiler/config.jvm/src/org/jetbrains/kotlin/config/JvmAnalysisFlags.kt +++ b/compiler/config.jvm/src/org/jetbrains/kotlin/config/JvmAnalysisFlags.kt @@ -30,6 +30,9 @@ object JvmAnalysisFlags { @JvmStatic val irCheckLocalNames by AnalysisFlag.Delegates.Boolean + @JvmStatic + val disableUltraLightClasses by AnalysisFlag.Delegates.Boolean + private object Delegates { object Jsr305StateWarnByDefault { operator fun provideDelegate(instance: Any?, property: KProperty<*>): AnalysisFlag.Delegate = diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassGenerationSupport.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassGenerationSupport.kt index 603440aa008..83029aa2a5c 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassGenerationSupport.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassGenerationSupport.kt @@ -57,6 +57,8 @@ abstract class LightClassGenerationSupport { ConstantExpressionEvaluator(moduleDescriptor, languageVersionSettings, expression.project) } + abstract val useUltraLightClasses: Boolean + fun createUltraLightClassForFacade( manager: PsiManager, facadeClassFqName: FqName, @@ -64,6 +66,8 @@ abstract class LightClassGenerationSupport { files: Collection, ): KtUltraLightClassForFacade? { + if (!useUltraLightClasses) return null + if (files.any { it.isScript() }) return null val filesToSupports: List> = files.map { @@ -80,6 +84,9 @@ abstract class LightClassGenerationSupport { } fun createUltraLightClass(element: KtClassOrObject): KtUltraLightClass? { + + if (!useUltraLightClasses) return null + if (element.shouldNotBeVisibleAsLightClass()) { return null } @@ -101,7 +108,7 @@ abstract class LightClassGenerationSupport { } fun createUltraLightClassForScript(script: KtScript): KtUltraLightClassForScript? = - KtUltraLightClassForScript(script, support = getUltraLightClassSupport(script)) + if (useUltraLightClasses) KtUltraLightClassForScript(script, support = getUltraLightClassSupport(script)) else null companion object { @JvmStatic diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacade.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacade.kt index c849eca2fb5..b89c7b2623b 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacade.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacade.kt @@ -269,10 +269,11 @@ open class KtLightClassForFacade constructor( val manager = PsiManager.getInstance(project) - return if (!KtUltraLightSupport.forceUsingOldLightClasses && Registry.`is`("kotlin.use.ultra.light.classes", true)) - LightClassGenerationSupport.getInstance(project).createUltraLightClassForFacade(manager, fqName, stubValue, sources) + return LightClassGenerationSupport.getInstance(project).run { + if (useUltraLightClasses) createUltraLightClassForFacade(manager, fqName, stubValue, sources) ?: error { "Unable to create UL class for facade" } - else KtLightClassForFacade(manager, fqName, stubValue, sources) + else KtLightClassForFacade(manager, fqName, stubValue, sources) + } } fun createForFacade( diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForScript.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForScript.kt index 162596fef10..66c994f07cd 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForScript.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForScript.kt @@ -208,9 +208,12 @@ open class KtLightClassForScript(val script: KtScript) : KtLazyLightClass(script return null } - if (!forceUsingOldLightClasses && Registry.`is`("kotlin.use.ultra.light.classes", true)) { - return LightClassGenerationSupport.getInstance(script.project).createUltraLightClassForScript(script) - ?: error("UL class cannot be created for script") + if (!forceUsingOldLightClasses) { + LightClassGenerationSupport.getInstance(script.project).run { + if (useUltraLightClasses) { + return createUltraLightClassForScript(script) ?: error("UL class cannot be created for script") + } + } } return KtLightClassForScript(script) 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 c25470ba95a..29ec1bab149 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 @@ -356,9 +356,13 @@ abstract class KtLightClassForSourceDeclaration( return null } - if (!forceUsingOldLightClasses && Registry.`is`("kotlin.use.ultra.light.classes", true)) { - return LightClassGenerationSupport.getInstance(classOrObject.project).createUltraLightClass(classOrObject) - ?: error { "Unable to create UL class for ${classOrObject::javaClass.name}" } + if (!forceUsingOldLightClasses) { + LightClassGenerationSupport.getInstance(classOrObject.project).run { + if (useUltraLightClasses) { + return createUltraLightClass(classOrObject) + ?: error { "Unable to create UL class for ${classOrObject::javaClass.name}" } + } + } } return when { diff --git a/compiler/testData/cli/js/jsExtraHelp.out b/compiler/testData/cli/js/jsExtraHelp.out index f3af3090898..93e45ad4934 100644 --- a/compiler/testData/cli/js/jsExtraHelp.out +++ b/compiler/testData/cli/js/jsExtraHelp.out @@ -34,6 +34,7 @@ where advanced options include: -Xdisable-default-scripting-plugin Do not enable scripting plugin by default -Xdisable-phases Disable backend phases + -Xdisable-ultra-light-classes Do not use the ultra light classes implementation -Xdump-directory Dump backend state into directory -Xdump-fqname FqName of declaration that should be dumped -Xdump-perf= Dump detailed performance statistics to the specified file diff --git a/compiler/testData/cli/jvm/extraHelp.out b/compiler/testData/cli/jvm/extraHelp.out index f8daee15d75..bb7f84061d1 100644 --- a/compiler/testData/cli/jvm/extraHelp.out +++ b/compiler/testData/cli/jvm/extraHelp.out @@ -117,6 +117,7 @@ where advanced options include: -Xdisable-default-scripting-plugin Do not enable scripting plugin by default -Xdisable-phases Disable backend phases + -Xdisable-ultra-light-classes Do not use the ultra light classes implementation -Xdump-directory Dump backend state into directory -Xdump-fqname FqName of declaration that should be dumped -Xdump-perf= Dump detailed performance statistics to the specified file 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 6a1bb3e0a7f..96adfd6ff51 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 @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.caches.resolve import com.intellij.openapi.module.ModuleUtilCore import com.intellij.openapi.project.Project +import com.intellij.openapi.util.registry.Registry import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.CachedValuesManager @@ -89,6 +90,10 @@ class IDELightClassGenerationSupport(project: Project) : LightClassGenerationSup override fun getUltraLightClassSupport(element: KtElement): KtUltraLightSupport = KtUltraLightSupportImpl(element) + override val useUltraLightClasses: Boolean + get() = + !KtUltraLightSupport.forceUsingOldLightClasses && Registry.`is`("kotlin.use.ultra.light.classes", true) + private val scopeFileComparator = JavaElementFinder.byClasspathComparator(GlobalSearchScope.allScope(project)) override fun createDataHolderForClass(classOrObject: KtClassOrObject, builder: LightClassBuilder): LightClassDataHolder.ForClass {