[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)
@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"
@@ -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
}
@@ -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
@@ -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<Jsr305State> =
@@ -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<KtFile>,
): KtUltraLightClassForFacade? {
if (!useUltraLightClasses) return null
if (files.any { it.isScript() }) return null
val filesToSupports: List<Pair<KtFile, KtUltraLightSupport>> = 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
@@ -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(
@@ -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)
@@ -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 {
+1
View File
@@ -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=<path> Dump detailed performance statistics to the specified file
+1
View File
@@ -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=<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.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 {