[ULC] Add compiler flag -Xdisable-ultra-light-classes to fallback to light implementation in CLI

This commit is contained in:
Igor Yakovlev
2020-09-02 14:51:46 +03:00
parent e53db4c771
commit c70383cc70
11 changed files with 45 additions and 10 deletions
@@ -323,6 +323,12 @@ abstract class CommonCompilerArguments : CommonToolArguments() {
) )
var useFirExtendedCheckers: Boolean by FreezableVar(false) 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( @Argument(
value = "-Xuse-mixed-named-arguments", value = "-Xuse-mixed-named-arguments",
description = "Enable Support named arguments in their own position even if the result appears as mixed" description = "Enable Support named arguments in their own position even if the result appears as mixed"
@@ -401,6 +401,7 @@ class K2JVMCompilerArguments : CommonCompilerArguments() {
result[JvmAnalysisFlags.suppressMissingBuiltinsError] = suppressMissingBuiltinsError result[JvmAnalysisFlags.suppressMissingBuiltinsError] = suppressMissingBuiltinsError
result[JvmAnalysisFlags.irCheckLocalNames] = irCheckLocalNames result[JvmAnalysisFlags.irCheckLocalNames] = irCheckLocalNames
result[AnalysisFlags.reportErrorsOnIrDependencies] = !useIR && !useFir && !allowJvmIrDependencies result[AnalysisFlags.reportErrorsOnIrDependencies] = !useIR && !useFir && !allowJvmIrDependencies
result[JvmAnalysisFlags.disableUltraLightClasses] = disableUltraLightClasses
return result return result
} }
@@ -103,6 +103,9 @@ class CliLightClassGenerationSupport(
return ultraLightSupport return ultraLightSupport
} }
override val useUltraLightClasses: Boolean
get() = !KtUltraLightSupport.forceUsingOldLightClasses && !traceHolder.languageVersionSettings.getFlag(JvmAnalysisFlags.disableUltraLightClasses)
override fun createDataHolderForClass(classOrObject: KtClassOrObject, builder: LightClassBuilder): LightClassDataHolder.ForClass { override fun createDataHolderForClass(classOrObject: KtClassOrObject, builder: LightClassBuilder): LightClassDataHolder.ForClass {
//force resolve companion for light class generation //force resolve companion for light class generation
traceHolder.bindingContext.get(BindingContext.CLASS, classOrObject)?.companionObjectDescriptor traceHolder.bindingContext.get(BindingContext.CLASS, classOrObject)?.companionObjectDescriptor
@@ -30,6 +30,9 @@ object JvmAnalysisFlags {
@JvmStatic @JvmStatic
val irCheckLocalNames by AnalysisFlag.Delegates.Boolean val irCheckLocalNames by AnalysisFlag.Delegates.Boolean
@JvmStatic
val disableUltraLightClasses by AnalysisFlag.Delegates.Boolean
private object Delegates { private object Delegates {
object Jsr305StateWarnByDefault { object Jsr305StateWarnByDefault {
operator fun provideDelegate(instance: Any?, property: KProperty<*>): AnalysisFlag.Delegate<Jsr305State> = operator fun provideDelegate(instance: Any?, property: KProperty<*>): AnalysisFlag.Delegate<Jsr305State> =
@@ -57,6 +57,8 @@ abstract class LightClassGenerationSupport {
ConstantExpressionEvaluator(moduleDescriptor, languageVersionSettings, expression.project) ConstantExpressionEvaluator(moduleDescriptor, languageVersionSettings, expression.project)
} }
abstract val useUltraLightClasses: Boolean
fun createUltraLightClassForFacade( fun createUltraLightClassForFacade(
manager: PsiManager, manager: PsiManager,
facadeClassFqName: FqName, facadeClassFqName: FqName,
@@ -64,6 +66,8 @@ abstract class LightClassGenerationSupport {
files: Collection<KtFile>, files: Collection<KtFile>,
): KtUltraLightClassForFacade? { ): KtUltraLightClassForFacade? {
if (!useUltraLightClasses) return null
if (files.any { it.isScript() }) return null if (files.any { it.isScript() }) return null
val filesToSupports: List<Pair<KtFile, KtUltraLightSupport>> = files.map { val filesToSupports: List<Pair<KtFile, KtUltraLightSupport>> = files.map {
@@ -80,6 +84,9 @@ abstract class LightClassGenerationSupport {
} }
fun createUltraLightClass(element: KtClassOrObject): KtUltraLightClass? { fun createUltraLightClass(element: KtClassOrObject): KtUltraLightClass? {
if (!useUltraLightClasses) return null
if (element.shouldNotBeVisibleAsLightClass()) { if (element.shouldNotBeVisibleAsLightClass()) {
return null return null
} }
@@ -101,7 +108,7 @@ abstract class LightClassGenerationSupport {
} }
fun createUltraLightClassForScript(script: KtScript): KtUltraLightClassForScript? = fun createUltraLightClassForScript(script: KtScript): KtUltraLightClassForScript? =
KtUltraLightClassForScript(script, support = getUltraLightClassSupport(script)) if (useUltraLightClasses) KtUltraLightClassForScript(script, support = getUltraLightClassSupport(script)) else null
companion object { companion object {
@JvmStatic @JvmStatic
@@ -269,10 +269,11 @@ open class KtLightClassForFacade constructor(
val manager = PsiManager.getInstance(project) val manager = PsiManager.getInstance(project)
return if (!KtUltraLightSupport.forceUsingOldLightClasses && Registry.`is`("kotlin.use.ultra.light.classes", true)) return LightClassGenerationSupport.getInstance(project).run {
LightClassGenerationSupport.getInstance(project).createUltraLightClassForFacade(manager, fqName, stubValue, sources) if (useUltraLightClasses) createUltraLightClassForFacade(manager, fqName, stubValue, sources)
?: error { "Unable to create UL class for facade" } ?: error { "Unable to create UL class for facade" }
else KtLightClassForFacade(manager, fqName, stubValue, sources) else KtLightClassForFacade(manager, fqName, stubValue, sources)
}
} }
fun createForFacade( fun createForFacade(
@@ -208,9 +208,12 @@ open class KtLightClassForScript(val script: KtScript) : KtLazyLightClass(script
return null return null
} }
if (!forceUsingOldLightClasses && Registry.`is`("kotlin.use.ultra.light.classes", true)) { if (!forceUsingOldLightClasses) {
return LightClassGenerationSupport.getInstance(script.project).createUltraLightClassForScript(script) LightClassGenerationSupport.getInstance(script.project).run {
?: error("UL class cannot be created for script") if (useUltraLightClasses) {
return createUltraLightClassForScript(script) ?: error("UL class cannot be created for script")
}
}
} }
return KtLightClassForScript(script) return KtLightClassForScript(script)
@@ -356,9 +356,13 @@ abstract class KtLightClassForSourceDeclaration(
return null return null
} }
if (!forceUsingOldLightClasses && Registry.`is`("kotlin.use.ultra.light.classes", true)) { if (!forceUsingOldLightClasses) {
return LightClassGenerationSupport.getInstance(classOrObject.project).createUltraLightClass(classOrObject) LightClassGenerationSupport.getInstance(classOrObject.project).run {
?: error { "Unable to create UL class for ${classOrObject::javaClass.name}" } if (useUltraLightClasses) {
return createUltraLightClass(classOrObject)
?: error { "Unable to create UL class for ${classOrObject::javaClass.name}" }
}
}
} }
return when { return when {
+1
View File
@@ -34,6 +34,7 @@ where advanced options include:
-Xdisable-default-scripting-plugin -Xdisable-default-scripting-plugin
Do not enable scripting plugin by default Do not enable scripting plugin by default
-Xdisable-phases Disable backend phases -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-directory Dump backend state into directory
-Xdump-fqname FqName of declaration that should be dumped -Xdump-fqname FqName of declaration that should be dumped
-Xdump-perf=<path> Dump detailed performance statistics to the specified file -Xdump-perf=<path> Dump detailed performance statistics to the specified file
+1
View File
@@ -117,6 +117,7 @@ where advanced options include:
-Xdisable-default-scripting-plugin -Xdisable-default-scripting-plugin
Do not enable scripting plugin by default Do not enable scripting plugin by default
-Xdisable-phases Disable backend phases -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-directory Dump backend state into directory
-Xdump-fqname FqName of declaration that should be dumped -Xdump-fqname FqName of declaration that should be dumped
-Xdump-perf=<path> Dump detailed performance statistics to the specified file -Xdump-perf=<path> Dump detailed performance statistics to the specified file
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.caches.resolve
import com.intellij.openapi.module.ModuleUtilCore import com.intellij.openapi.module.ModuleUtilCore
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.util.registry.Registry
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.CachedValueProvider
import com.intellij.psi.util.CachedValuesManager import com.intellij.psi.util.CachedValuesManager
@@ -89,6 +90,10 @@ class IDELightClassGenerationSupport(project: Project) : LightClassGenerationSup
override fun getUltraLightClassSupport(element: KtElement): KtUltraLightSupport = KtUltraLightSupportImpl(element) 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)) private val scopeFileComparator = JavaElementFinder.byClasspathComparator(GlobalSearchScope.allScope(project))
override fun createDataHolderForClass(classOrObject: KtClassOrObject, builder: LightClassBuilder): LightClassDataHolder.ForClass { override fun createDataHolderForClass(classOrObject: KtClassOrObject, builder: LightClassBuilder): LightClassDataHolder.ForClass {