[ULC] Add LanguageVersionSettings to CliLightClassGenerationSupport
+ refactoring
This commit is contained in:
@@ -24,10 +24,7 @@ import org.jetbrains.kotlin.cli.common.messages.MessageUtil
|
||||
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
|
||||
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
|
||||
import org.jetbrains.kotlin.cli.jvm.plugins.PluginCliParser
|
||||
import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||
import org.jetbrains.kotlin.config.IncrementalCompilation
|
||||
import org.jetbrains.kotlin.config.Services
|
||||
import org.jetbrains.kotlin.config.*
|
||||
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
|
||||
import org.jetbrains.kotlin.incremental.components.LookupTracker
|
||||
import org.jetbrains.kotlin.incremental.js.IncrementalDataProvider
|
||||
|
||||
+20
-64
@@ -16,8 +16,7 @@
|
||||
|
||||
package org.jetbrains.kotlin.cli.jvm.compiler
|
||||
|
||||
import com.intellij.psi.PsiManager
|
||||
import com.intellij.psi.util.CachedValue
|
||||
import com.intellij.openapi.project.Project
|
||||
import org.jetbrains.kotlin.asJava.LightClassBuilder
|
||||
import org.jetbrains.kotlin.asJava.LightClassGenerationSupport
|
||||
import org.jetbrains.kotlin.asJava.builder.InvalidLightClassDataHolder
|
||||
@@ -28,14 +27,9 @@ import org.jetbrains.kotlin.asJava.classes.*
|
||||
import org.jetbrains.kotlin.codegen.ClassBuilderMode
|
||||
import org.jetbrains.kotlin.codegen.JvmCodegenUtil
|
||||
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
|
||||
import org.jetbrains.kotlin.config.JvmTarget
|
||||
import org.jetbrains.kotlin.config.LanguageFeature
|
||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
|
||||
import org.jetbrains.kotlin.config.*
|
||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.load.java.components.JavaDeprecationSettings
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
@@ -43,7 +37,6 @@ import org.jetbrains.kotlin.resolve.deprecation.CoroutineCompatibilitySupport
|
||||
import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver
|
||||
import org.jetbrains.kotlin.storage.LockBasedStorageManager
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator as ResolveEvaluator
|
||||
|
||||
/**
|
||||
* This class solves the problem of interdependency between analyzing Kotlin code and generating JetLightClasses
|
||||
@@ -57,23 +50,25 @@ import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluat
|
||||
|
||||
* To mitigate this, CliLightClassGenerationSupport hold a trace that is shared between the analyzer and JetLightClasses
|
||||
*/
|
||||
class CliLightClassGenerationSupport(private val traceHolder: CliTraceHolder) : LightClassGenerationSupport() {
|
||||
class CliLightClassGenerationSupport(
|
||||
val traceHolder: CliTraceHolder,
|
||||
private val project: Project
|
||||
) : LightClassGenerationSupport() {
|
||||
|
||||
private val ultraLightSupport = object : KtUltraLightSupport {
|
||||
private class CliLightClassSupport(
|
||||
private val project: Project,
|
||||
override val languageVersionSettings: LanguageVersionSettings
|
||||
) : KtUltraLightSupport {
|
||||
|
||||
//TODO: languageVersionSettings is always default
|
||||
private val languageVersionSettings: LanguageVersionSettings
|
||||
get() = getContext().languageVersionSettings
|
||||
?: LanguageVersionSettingsImpl.DEFAULT
|
||||
// This is the way to untie CliLightClassSupport and CliLightClassGenerationSupport to prevent descriptors leak
|
||||
private val traceHolder: CliTraceHolder
|
||||
get() = (getInstance(project) as CliLightClassGenerationSupport).traceHolder
|
||||
|
||||
override val isReleasedCoroutine
|
||||
get() = languageVersionSettings.supportsFeature(LanguageFeature.ReleaseCoroutines)
|
||||
|
||||
override fun possiblyHasAlias(file: KtFile, shortName: Name): Boolean = true
|
||||
|
||||
override fun getConstantEvaluator(expression: KtExpression): org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator =
|
||||
ResolveEvaluator(moduleDescriptor, languageVersionSettings, expression.project)
|
||||
|
||||
override val moduleDescriptor get() = traceHolder.module
|
||||
|
||||
override val moduleName: String get() = JvmCodegenUtil.getModuleName(moduleDescriptor)
|
||||
@@ -99,53 +94,15 @@ class CliLightClassGenerationSupport(private val traceHolder: CliTraceHolder) :
|
||||
}
|
||||
}
|
||||
|
||||
override fun createUltraLightClassForFacade(
|
||||
manager: PsiManager,
|
||||
facadeClassFqName: FqName,
|
||||
lightClassDataCache: CachedValue<LightClassDataHolder.ForFacade>,
|
||||
files: Collection<KtFile>
|
||||
): KtUltraLightClassForFacade? {
|
||||
|
||||
if (files.any { it.isScript() }) return null
|
||||
|
||||
val filesToSupports: List<Pair<KtFile, KtUltraLightSupport>> = files.map {
|
||||
it to UltraLightSupportViaService(it)
|
||||
}
|
||||
|
||||
return KtUltraLightClassForFacade(
|
||||
manager,
|
||||
facadeClassFqName,
|
||||
lightClassDataCache,
|
||||
files,
|
||||
filesToSupports
|
||||
)
|
||||
private val ultraLightSupport: KtUltraLightSupport by lazyPub {
|
||||
CliLightClassSupport(project, traceHolder.languageVersionSettings)
|
||||
}
|
||||
|
||||
override fun createUltraLightClass(element: KtClassOrObject): KtUltraLightClass? {
|
||||
if (element.shouldNotBeVisibleAsLightClass()) {
|
||||
return null
|
||||
}
|
||||
|
||||
return UltraLightSupportViaService(element).let { support ->
|
||||
when {
|
||||
element is KtObjectDeclaration && element.isObjectLiteral() ->
|
||||
KtUltraLightClassForAnonymousDeclaration(element, support)
|
||||
element.safeIsLocal() ->
|
||||
KtUltraLightClassForLocalDeclaration(element, support)
|
||||
|
||||
(element.hasModifier(KtTokens.INLINE_KEYWORD)) ->
|
||||
KtUltraLightInlineClass(element, support)
|
||||
|
||||
else -> KtUltraLightClass(element, support)
|
||||
}
|
||||
}
|
||||
override fun getUltraLightClassSupport(element: KtElement): KtUltraLightSupport {
|
||||
require(element.project == project) { "ULC support created from another project from requested" }
|
||||
return ultraLightSupport
|
||||
}
|
||||
|
||||
override fun createUltraLightClassForScript(script: KtScript): KtUltraLightClassForScript? =
|
||||
KtUltraLightClassForScript(script, support = UltraLightSupportViaService(script))
|
||||
|
||||
override fun getUltraLightClassSupport(element: KtElement): KtUltraLightSupport = ultraLightSupport
|
||||
|
||||
override fun createDataHolderForClass(classOrObject: KtClassOrObject, builder: LightClassBuilder): LightClassDataHolder.ForClass {
|
||||
//force resolve companion for light class generation
|
||||
traceHolder.bindingContext.get(BindingContext.CLASS, classOrObject)?.companionObjectDescriptor
|
||||
@@ -167,7 +124,8 @@ class CliLightClassGenerationSupport(private val traceHolder: CliTraceHolder) :
|
||||
return LightClassDataHolderImpl(stub, diagnostics)
|
||||
}
|
||||
|
||||
private fun getContext(): LightClassConstructionContext = LightClassConstructionContext(traceHolder.bindingContext, traceHolder.module)
|
||||
private fun getContext(): LightClassConstructionContext =
|
||||
LightClassConstructionContext(traceHolder.bindingContext, traceHolder.module)
|
||||
|
||||
override fun resolveToDescriptor(declaration: KtDeclaration): DeclarationDescriptor? {
|
||||
return traceHolder.bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, declaration)
|
||||
@@ -178,6 +136,4 @@ class CliLightClassGenerationSupport(private val traceHolder: CliTraceHolder) :
|
||||
override fun analyzeAnnotation(element: KtAnnotationEntry) = traceHolder.bindingContext.get(BindingContext.ANNOTATION, element)
|
||||
|
||||
override fun analyzeWithContent(element: KtClassOrObject) = traceHolder.bindingContext
|
||||
|
||||
|
||||
}
|
||||
@@ -6,6 +6,7 @@
|
||||
package org.jetbrains.kotlin.cli.jvm.compiler
|
||||
|
||||
import org.jetbrains.annotations.TestOnly
|
||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||
import org.jetbrains.kotlin.psi.KtPsiUtil
|
||||
@@ -23,11 +24,19 @@ class CliTraceHolder : CodeAnalyzerInitializer {
|
||||
private set
|
||||
var module: ModuleDescriptor by Delegates.notNull()
|
||||
private set
|
||||
var languageVersionSettings: LanguageVersionSettings by Delegates.notNull()
|
||||
private set
|
||||
|
||||
|
||||
override fun initialize(trace: BindingTrace, module: ModuleDescriptor, codeAnalyzer: KotlinCodeAnalyzer) {
|
||||
override fun initialize(
|
||||
trace: BindingTrace,
|
||||
module: ModuleDescriptor,
|
||||
codeAnalyzer: KotlinCodeAnalyzer,
|
||||
languageVersionSettings: LanguageVersionSettings
|
||||
) {
|
||||
this.bindingContext = trace.bindingContext
|
||||
this.module = module
|
||||
this.languageVersionSettings = languageVersionSettings
|
||||
|
||||
if (trace !is CliBindingTrace) {
|
||||
throw IllegalArgumentException("Shared trace is expected to be subclass of ${CliBindingTrace::class.java.simpleName} class")
|
||||
|
||||
@@ -77,10 +77,7 @@ import org.jetbrains.kotlin.cli.jvm.modules.CoreJrtFileSystem
|
||||
import org.jetbrains.kotlin.codegen.extensions.ClassBuilderInterceptorExtension
|
||||
import org.jetbrains.kotlin.codegen.extensions.ExpressionCodegenExtension
|
||||
import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar
|
||||
import org.jetbrains.kotlin.config.APPEND_JAVA_SOURCE_ROOTS_HANDLER_KEY
|
||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||
import org.jetbrains.kotlin.config.JVMConfigurationKeys
|
||||
import org.jetbrains.kotlin.config.languageVersionSettings
|
||||
import org.jetbrains.kotlin.config.*
|
||||
import org.jetbrains.kotlin.extensions.*
|
||||
import org.jetbrains.kotlin.extensions.internal.CandidateInterceptor
|
||||
import org.jetbrains.kotlin.extensions.internal.TypeResolutionInterceptor
|
||||
@@ -108,12 +105,13 @@ import java.util.zip.ZipFile
|
||||
|
||||
class KotlinCoreEnvironment private constructor(
|
||||
val projectEnvironment: JavaCoreProjectEnvironment,
|
||||
initialConfiguration: CompilerConfiguration,
|
||||
private val initialConfiguration: CompilerConfiguration,
|
||||
configFiles: EnvironmentConfigFiles
|
||||
) {
|
||||
|
||||
class ProjectEnvironment(
|
||||
disposable: Disposable, applicationEnvironment: KotlinCoreApplicationEnvironment
|
||||
disposable: Disposable,
|
||||
applicationEnvironment: KotlinCoreApplicationEnvironment
|
||||
) :
|
||||
KotlinCoreProjectEnvironment(disposable, applicationEnvironment) {
|
||||
|
||||
@@ -637,7 +635,7 @@ class KotlinCoreEnvironment private constructor(
|
||||
fun registerKotlinLightClassSupport(project: MockProject) {
|
||||
with(project) {
|
||||
val traceHolder = CliTraceHolder()
|
||||
val cliLightClassGenerationSupport = CliLightClassGenerationSupport(traceHolder)
|
||||
val cliLightClassGenerationSupport = CliLightClassGenerationSupport(traceHolder, project)
|
||||
val kotlinAsJavaSupport = CliKotlinAsJavaSupport(this, traceHolder)
|
||||
registerService(LightClassGenerationSupport::class.java, cliLightClassGenerationSupport)
|
||||
registerService(CliLightClassGenerationSupport::class.java, cliLightClassGenerationSupport)
|
||||
|
||||
Reference in New Issue
Block a user