[ULC] Add compiler flag -Xdisable-ultra-light-classes to fallback to light implementation in CLI
This commit is contained in:
+6
@@ -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"
|
||||||
|
|||||||
+1
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
@@ -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> =
|
||||||
|
|||||||
+8
-1
@@ -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
|
||||||
|
|||||||
+4
-3
@@ -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(
|
||||||
|
|||||||
+6
-3
@@ -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)
|
||||||
|
|||||||
+7
-3
@@ -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
@@ -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
@@ -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
|
||||||
|
|||||||
+5
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user