Light classes: use JVM target from the module
Using "JVM_1_8" always resulted in incorrect mapping of Kotlin annotation targets to Java element types. The change in AbstractKotlinRenderLogTest is needed because while CliTraceHolder.module is technically a descriptor leak, it was never detected by this test accidentally, because of the depth cutoff equal to 10, which started to not be enough after the minor refactoring of replacing `Delegates.notNull` with `lateinit`.
This commit is contained in:
+27
-8
@@ -34,6 +34,7 @@ import org.jetbrains.kotlin.idea.compiler.IDELanguageSettingsProvider
|
||||
import org.jetbrains.kotlin.idea.project.IdeaEnvironment
|
||||
import org.jetbrains.kotlin.idea.project.ResolveElementCache
|
||||
import org.jetbrains.kotlin.idea.project.languageVersionSettings
|
||||
import org.jetbrains.kotlin.idea.resolve.ResolutionFacade
|
||||
import org.jetbrains.kotlin.idea.stubindex.KotlinOverridableInternalMembersShortNameIndex
|
||||
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
|
||||
import org.jetbrains.kotlin.incremental.components.LookupTracker
|
||||
@@ -69,12 +70,13 @@ import org.jetbrains.kotlin.types.TypeUtils
|
||||
import org.jetbrains.kotlin.types.WrappedTypeFactory
|
||||
import org.jetbrains.kotlin.utils.sure
|
||||
|
||||
|
||||
class IDELightClassConstructionContext(
|
||||
bindingContext: BindingContext, module: ModuleDescriptor,
|
||||
bindingContext: BindingContext,
|
||||
module: ModuleDescriptor,
|
||||
languageVersionSettings: LanguageVersionSettings,
|
||||
jvmTarget: JvmTarget,
|
||||
val mode: Mode
|
||||
) : LightClassConstructionContext(bindingContext, module, languageVersionSettings) {
|
||||
) : LightClassConstructionContext(bindingContext, module, languageVersionSettings, jvmTarget) {
|
||||
enum class Mode {
|
||||
LIGHT,
|
||||
EXACT
|
||||
@@ -106,6 +108,7 @@ internal object IDELightClassContexts {
|
||||
bindingContext,
|
||||
resolutionFacade.moduleDescriptor,
|
||||
classOrObject.languageVersionSettings,
|
||||
resolutionFacade.jvmTarget,
|
||||
EXACT
|
||||
)
|
||||
}
|
||||
@@ -122,6 +125,7 @@ internal object IDELightClassContexts {
|
||||
bindingContext,
|
||||
resolutionFacade.moduleDescriptor,
|
||||
classOrObject.languageVersionSettings,
|
||||
resolutionFacade.jvmTarget,
|
||||
EXACT
|
||||
)
|
||||
}
|
||||
@@ -132,20 +136,24 @@ internal object IDELightClassContexts {
|
||||
bindingContext,
|
||||
resolutionFacade.moduleDescriptor,
|
||||
classOrObject.languageVersionSettings,
|
||||
resolutionFacade.jvmTarget,
|
||||
EXACT
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
fun contextForFacade(files: List<KtFile>): LightClassConstructionContext {
|
||||
val resolutionFacade = files.first().getResolutionFacade()
|
||||
|
||||
@OptIn(FrontendInternals::class)
|
||||
val resolveSession = files.first().getResolutionFacade().getFrontendService(ResolveSession::class.java)
|
||||
val resolveSession = resolutionFacade.getFrontendService(ResolveSession::class.java)
|
||||
|
||||
forceResolvePackageDeclarations(files, resolveSession)
|
||||
return IDELightClassConstructionContext(
|
||||
resolveSession.bindingContext,
|
||||
resolveSession.moduleDescriptor,
|
||||
files.first().languageVersionSettings,
|
||||
resolutionFacade.jvmTarget,
|
||||
EXACT
|
||||
)
|
||||
}
|
||||
@@ -161,21 +169,26 @@ internal object IDELightClassContexts {
|
||||
bindingContext,
|
||||
resolutionFacade.moduleDescriptor,
|
||||
script.languageVersionSettings,
|
||||
resolutionFacade.jvmTarget,
|
||||
EXACT
|
||||
)
|
||||
}
|
||||
|
||||
ForceResolveUtil.forceResolveAllContents(descriptor)
|
||||
|
||||
return IDELightClassConstructionContext(bindingContext, resolutionFacade.moduleDescriptor, script.languageVersionSettings, EXACT)
|
||||
return IDELightClassConstructionContext(
|
||||
bindingContext, resolutionFacade.moduleDescriptor, script.languageVersionSettings, resolutionFacade.jvmTarget,
|
||||
EXACT
|
||||
)
|
||||
}
|
||||
|
||||
fun lightContextForClassOrObject(classOrObject: KtClassOrObject): LightClassConstructionContext? {
|
||||
if (!isDummyResolveApplicable(classOrObject)) return null
|
||||
|
||||
val resolutionFacade = classOrObject.getResolutionFacade()
|
||||
val resolveSession = setupAdHocResolve(
|
||||
classOrObject.project,
|
||||
classOrObject.getResolutionFacade().moduleDescriptor,
|
||||
resolutionFacade.moduleDescriptor,
|
||||
listOf(classOrObject.containingKtFile)
|
||||
)
|
||||
|
||||
@@ -188,13 +201,15 @@ internal object IDELightClassContexts {
|
||||
resolveSession.bindingContext,
|
||||
resolveSession.moduleDescriptor,
|
||||
classOrObject.languageVersionSettings,
|
||||
resolutionFacade.jvmTarget,
|
||||
LIGHT
|
||||
)
|
||||
}
|
||||
|
||||
fun lightContextForFacade(files: List<KtFile>): LightClassConstructionContext {
|
||||
val representativeFile = files.first()
|
||||
val resolveSession = setupAdHocResolve(representativeFile.project, representativeFile.getResolutionFacade().moduleDescriptor, files)
|
||||
val resolutionFacade = representativeFile.getResolutionFacade()
|
||||
val resolveSession = setupAdHocResolve(representativeFile.project, resolutionFacade.moduleDescriptor, files)
|
||||
|
||||
forceResolvePackageDeclarations(files, resolveSession)
|
||||
|
||||
@@ -202,10 +217,15 @@ internal object IDELightClassContexts {
|
||||
resolveSession.bindingContext,
|
||||
resolveSession.moduleDescriptor,
|
||||
files.first().languageVersionSettings,
|
||||
resolutionFacade.jvmTarget,
|
||||
LIGHT
|
||||
)
|
||||
}
|
||||
|
||||
@OptIn(FrontendInternals::class)
|
||||
private val ResolutionFacade.jvmTarget: JvmTarget
|
||||
get() = getFrontendService(JvmTarget::class.java)
|
||||
|
||||
private fun isDummyResolveApplicable(classOrObject: KtClassOrObject): Boolean {
|
||||
if (classOrObject.hasModifier(KtTokens.INLINE_KEYWORD)) return false
|
||||
|
||||
@@ -447,4 +467,3 @@ internal object IDELightClassContexts {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+4
-1
@@ -31,9 +31,12 @@ import org.jetbrains.kotlin.idea.FrontendInternals
|
||||
import org.jetbrains.kotlin.idea.caches.lightClasses.IDELightClassContexts
|
||||
import org.jetbrains.kotlin.idea.caches.lightClasses.LazyLightClassDataHolder
|
||||
import org.jetbrains.kotlin.idea.project.languageVersionSettings
|
||||
import org.jetbrains.kotlin.idea.project.platform
|
||||
import org.jetbrains.kotlin.idea.resolve.frontendService
|
||||
import org.jetbrains.kotlin.idea.stubindex.KotlinTypeAliasShortNameIndex
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.platform.jvm.JdkPlatform
|
||||
import org.jetbrains.kotlin.platform.subplatformsOfType
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver
|
||||
@@ -82,7 +85,7 @@ class IDELightClassGenerationSupport(project: Project) : LightClassGenerationSup
|
||||
BindingContext.EMPTY, ClassBuilderMode.LIGHT_CLASSES,
|
||||
moduleName, languageVersionSettings,
|
||||
useOldInlineClassesManglingScheme = false,
|
||||
jvmTarget = JvmTarget.JVM_1_8,
|
||||
jvmTarget = module?.platform?.subplatformsOfType<JdkPlatform>()?.firstOrNull()?.targetVersion ?: JvmTarget.DEFAULT,
|
||||
typePreprocessor = KotlinType::cleanFromAnonymousTypes,
|
||||
namePreprocessor = ::tryGetPredefinedName
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user