Changes after review
- Replace leaking ModuleResolverTracker with use of ModuleDescriptor.Capabilies - Provide API for retrieving ResolverForProject from ResolutionFacade - Update names
This commit is contained in:
@@ -17,7 +17,6 @@ import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
|
|||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.platform.TargetPlatform
|
import org.jetbrains.kotlin.platform.TargetPlatform
|
||||||
import org.jetbrains.kotlin.resolve.AnchorProvider
|
|
||||||
|
|
||||||
class FirModuleDescriptor(val session: FirSession) : ModuleDescriptor {
|
class FirModuleDescriptor(val session: FirSession) : ModuleDescriptor {
|
||||||
override val builtIns: KotlinBuiltIns
|
override val builtIns: KotlinBuiltIns
|
||||||
@@ -58,9 +57,6 @@ class FirModuleDescriptor(val session: FirSession) : ModuleDescriptor {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override val anchorProvider: AnchorProvider
|
|
||||||
get() = AnchorProvider.Default
|
|
||||||
|
|
||||||
override fun getOriginal(): DeclarationDescriptor {
|
override fun getOriginal(): DeclarationDescriptor {
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -70,7 +70,7 @@ class JvmResolverForModuleFactory(
|
|||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
val resolverForReferencedModule = referencedClassModule?.let {
|
val resolverForReferencedModule = referencedClassModule?.let {
|
||||||
resolverForProject.tryGetResolverForModuleWithAnchorCheck(it as M, moduleInfo)
|
resolverForProject.tryGetResolverForModuleWithResolutionAnchorFallback(it as M, moduleInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
val resolverForModule = resolverForReferencedModule?.takeIf {
|
val resolverForModule = resolverForReferencedModule?.takeIf {
|
||||||
|
|||||||
@@ -14,7 +14,8 @@ import org.jetbrains.kotlin.descriptors.PackageFragmentProvider
|
|||||||
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.resolve.AnchorProvider
|
import org.jetbrains.kotlin.resolve.RESOLUTION_ANCHOR_PROVIDER_CAPABILITY
|
||||||
|
import org.jetbrains.kotlin.resolve.ResolutionAnchorProvider
|
||||||
|
|
||||||
abstract class AbstractResolverForProject<M : ModuleInfo>(
|
abstract class AbstractResolverForProject<M : ModuleInfo>(
|
||||||
private val debugName: String,
|
private val debugName: String,
|
||||||
@@ -23,7 +24,7 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
|
|||||||
protected val fallbackModificationTracker: ModificationTracker? = null,
|
protected val fallbackModificationTracker: ModificationTracker? = null,
|
||||||
private val delegateResolver: ResolverForProject<M> = EmptyResolverForProject(),
|
private val delegateResolver: ResolverForProject<M> = EmptyResolverForProject(),
|
||||||
private val packageOracleFactory: PackageOracleFactory = PackageOracleFactory.OptimisticFactory,
|
private val packageOracleFactory: PackageOracleFactory = PackageOracleFactory.OptimisticFactory,
|
||||||
protected val anchorProvider: AnchorProvider = AnchorProvider.Default,
|
protected val resolutionAnchorProvider: ResolutionAnchorProvider = ResolutionAnchorProvider.Default,
|
||||||
) : ResolverForProject<M>() {
|
) : ResolverForProject<M>() {
|
||||||
|
|
||||||
protected class ModuleData(
|
protected class ModuleData(
|
||||||
@@ -56,14 +57,6 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
|
|||||||
abstract fun modulesContent(module: M): ModuleContent<M>
|
abstract fun modulesContent(module: M): ModuleContent<M>
|
||||||
abstract fun builtInsForModule(module: M): KotlinBuiltIns
|
abstract fun builtInsForModule(module: M): KotlinBuiltIns
|
||||||
abstract fun createResolverForModule(descriptor: ModuleDescriptor, moduleInfo: M): ResolverForModule
|
abstract fun createResolverForModule(descriptor: ModuleDescriptor, moduleInfo: M): ResolverForModule
|
||||||
|
|
||||||
protected open fun registerModuleDescriptorUpdate(
|
|
||||||
newDescriptor: ModuleDescriptor,
|
|
||||||
oldDescriptor: ModuleDescriptor?,
|
|
||||||
) {
|
|
||||||
// Nothing by default
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun tryGetResolverForModule(moduleInfo: M): ResolverForModule? {
|
override fun tryGetResolverForModule(moduleInfo: M): ResolverForModule? {
|
||||||
if (!isCorrectModuleInfo(moduleInfo)) {
|
if (!isCorrectModuleInfo(moduleInfo)) {
|
||||||
return null
|
return null
|
||||||
@@ -71,7 +64,7 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
|
|||||||
return resolverForModuleDescriptor(doGetDescriptorForModule(moduleInfo))
|
return resolverForModuleDescriptor(doGetDescriptorForModule(moduleInfo))
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun tryGetResolverForModuleWithAnchorCheck(targetModuleInfo: M, referencingModuleInfo: M): ResolverForModule? =
|
override fun tryGetResolverForModuleWithResolutionAnchorFallback(targetModuleInfo: M, referencingModuleInfo: M): ResolverForModule? =
|
||||||
tryGetResolverForModule(targetModuleInfo)
|
tryGetResolverForModule(targetModuleInfo)
|
||||||
|
|
||||||
private fun setupModuleDescriptor(module: M, moduleDescriptor: ModuleDescriptorImpl) {
|
private fun setupModuleDescriptor(module: M, moduleDescriptor: ModuleDescriptorImpl) {
|
||||||
@@ -158,8 +151,6 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
|
|||||||
}
|
}
|
||||||
if (moduleData.isOutOfDate()) {
|
if (moduleData.isOutOfDate()) {
|
||||||
moduleData = recreateModuleDescriptor(moduleFromThisResolver)
|
moduleData = recreateModuleDescriptor(moduleFromThisResolver)
|
||||||
} else {
|
|
||||||
registerModuleDescriptorUpdate(moduleData.moduleDescriptor, null)
|
|
||||||
}
|
}
|
||||||
moduleData.moduleDescriptor
|
moduleData.moduleDescriptor
|
||||||
}
|
}
|
||||||
@@ -176,9 +167,7 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
|
|||||||
|
|
||||||
val moduleData = createModuleDescriptor(module)
|
val moduleData = createModuleDescriptor(module)
|
||||||
descriptorByModule[module] = moduleData
|
descriptorByModule[module] = moduleData
|
||||||
|
|
||||||
registerModuleDescriptorUpdate(moduleData.moduleDescriptor, oldDescriptor)
|
|
||||||
|
|
||||||
return moduleData
|
return moduleData
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -188,9 +177,8 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
|
|||||||
projectContext.storageManager,
|
projectContext.storageManager,
|
||||||
builtInsForModule(module),
|
builtInsForModule(module),
|
||||||
module.platform,
|
module.platform,
|
||||||
module.capabilities,
|
module.capabilities + listOf(RESOLUTION_ANCHOR_PROVIDER_CAPABILITY to resolutionAnchorProvider),
|
||||||
module.stableName,
|
module.stableName,
|
||||||
anchorProvider
|
|
||||||
)
|
)
|
||||||
moduleInfoByDescriptor[moduleDescriptor] = module
|
moduleInfoByDescriptor[moduleDescriptor] = module
|
||||||
setupModuleDescriptor(module, moduleDescriptor)
|
setupModuleDescriptor(module, moduleDescriptor)
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ class ResolverForModule(
|
|||||||
abstract class ResolverForProject<M : ModuleInfo> {
|
abstract class ResolverForProject<M : ModuleInfo> {
|
||||||
fun resolverForModule(moduleInfo: M): ResolverForModule = resolverForModuleDescriptor(descriptorForModule(moduleInfo))
|
fun resolverForModule(moduleInfo: M): ResolverForModule = resolverForModuleDescriptor(descriptorForModule(moduleInfo))
|
||||||
abstract fun tryGetResolverForModule(moduleInfo: M): ResolverForModule?
|
abstract fun tryGetResolverForModule(moduleInfo: M): ResolverForModule?
|
||||||
abstract fun tryGetResolverForModuleWithAnchorCheck(targetModuleInfo: M, referencingModuleInfo: M): ResolverForModule?
|
abstract fun tryGetResolverForModuleWithResolutionAnchorFallback(targetModuleInfo: M, referencingModuleInfo: M): ResolverForModule?
|
||||||
abstract fun descriptorForModule(moduleInfo: M): ModuleDescriptor
|
abstract fun descriptorForModule(moduleInfo: M): ModuleDescriptor
|
||||||
abstract fun moduleInfoForModuleDescriptor(moduleDescriptor: ModuleDescriptor): M
|
abstract fun moduleInfoForModuleDescriptor(moduleDescriptor: ModuleDescriptor): M
|
||||||
abstract fun resolverForModuleDescriptor(descriptor: ModuleDescriptor): ResolverForModule
|
abstract fun resolverForModuleDescriptor(descriptor: ModuleDescriptor): ResolverForModule
|
||||||
@@ -76,7 +76,7 @@ class EmptyResolverForProject<M : ModuleInfo> : ResolverForProject<M>() {
|
|||||||
override val allModules: Collection<M> = listOf()
|
override val allModules: Collection<M> = listOf()
|
||||||
override fun diagnoseUnknownModuleInfo(infos: List<ModuleInfo>) = throw IllegalStateException("Should not be called for $infos")
|
override fun diagnoseUnknownModuleInfo(infos: List<ModuleInfo>) = throw IllegalStateException("Should not be called for $infos")
|
||||||
|
|
||||||
override fun tryGetResolverForModuleWithAnchorCheck(targetModuleInfo: M, referencingModuleInfo: M) =
|
override fun tryGetResolverForModuleWithResolutionAnchorFallback(targetModuleInfo: M, referencingModuleInfo: M) =
|
||||||
diagnoseUnknownModuleInfo(listOf(targetModuleInfo))
|
diagnoseUnknownModuleInfo(listOf(targetModuleInfo))
|
||||||
|
|
||||||
override fun moduleInfoForModuleDescriptor(descriptor: ModuleDescriptor): M {
|
override fun moduleInfoForModuleDescriptor(descriptor: ModuleDescriptor): M {
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jetbrains.kotlin.analyzer
|
|
||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
|
||||||
import com.intellij.openapi.components.ServiceManager
|
|
||||||
import com.intellij.openapi.project.Project
|
|
||||||
|
|
||||||
open class ModuleResolverTracker<M : ModuleInfo> {
|
|
||||||
open fun registerModuleUpdate(
|
|
||||||
newModule: ModuleDescriptor,
|
|
||||||
oldModule: ModuleDescriptor?,
|
|
||||||
resolverForProject: ResolverForProject<M>
|
|
||||||
) {
|
|
||||||
}
|
|
||||||
|
|
||||||
open fun findResolverForProjectByModuleDescriptor(moduleDescriptor: ModuleDescriptor): ResolverForProject<M>? = null
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
val Default = ModuleResolverTracker<ModuleInfo>()
|
|
||||||
|
|
||||||
fun getInstance(project: Project): ModuleResolverTracker<*> =
|
|
||||||
ServiceManager.getService(project, ModuleResolverTracker::class.java) ?: Default
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -20,7 +20,6 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
|||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.platform.TargetPlatform
|
import org.jetbrains.kotlin.platform.TargetPlatform
|
||||||
import org.jetbrains.kotlin.resolve.AnchorProvider
|
|
||||||
|
|
||||||
interface ModuleDescriptor : DeclarationDescriptor {
|
interface ModuleDescriptor : DeclarationDescriptor {
|
||||||
override fun getContainingDeclaration(): DeclarationDescriptor? = null
|
override fun getContainingDeclaration(): DeclarationDescriptor? = null
|
||||||
@@ -62,6 +61,4 @@ interface ModuleDescriptor : DeclarationDescriptor {
|
|||||||
val isValid: Boolean
|
val isValid: Boolean
|
||||||
|
|
||||||
fun assertValid()
|
fun assertValid()
|
||||||
|
|
||||||
val anchorProvider: AnchorProvider
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.descriptors
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
|
import org.jetbrains.kotlin.resolve.RESOLUTION_ANCHOR_PROVIDER_CAPABILITY
|
||||||
|
|
||||||
fun ModuleDescriptor.findClassifierAcrossModuleDependencies(classId: ClassId): ClassifierDescriptor? = withAnchorFallback {
|
fun ModuleDescriptor.findClassifierAcrossModuleDependencies(classId: ClassId): ClassifierDescriptor? = withAnchorFallback {
|
||||||
val packageViewDescriptor = getPackage(classId.packageFqName)
|
val packageViewDescriptor = getPackage(classId.packageFqName)
|
||||||
@@ -39,7 +40,7 @@ fun ModuleDescriptor.findClassifierAcrossModuleDependencies(classId: ClassId): C
|
|||||||
private inline fun ModuleDescriptor.withAnchorFallback(
|
private inline fun ModuleDescriptor.withAnchorFallback(
|
||||||
crossinline doSearch: ModuleDescriptor.() -> ClassifierDescriptor?
|
crossinline doSearch: ModuleDescriptor.() -> ClassifierDescriptor?
|
||||||
): ClassifierDescriptor? {
|
): ClassifierDescriptor? {
|
||||||
val anchor = anchorProvider.getAnchor(this)
|
val anchor = getCapability(RESOLUTION_ANCHOR_PROVIDER_CAPABILITY)?.getResolutionAnchor(this)
|
||||||
return if (anchor == null) doSearch() else doSearch() ?: anchor.doSearch()
|
return if (anchor == null) doSearch() else doSearch() ?: anchor.doSearch()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
|||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.platform.TargetPlatform
|
import org.jetbrains.kotlin.platform.TargetPlatform
|
||||||
import org.jetbrains.kotlin.resolve.AnchorProvider
|
|
||||||
import org.jetbrains.kotlin.storage.StorageManager
|
import org.jetbrains.kotlin.storage.StorageManager
|
||||||
import org.jetbrains.kotlin.types.checker.REFINER_CAPABILITY
|
import org.jetbrains.kotlin.types.checker.REFINER_CAPABILITY
|
||||||
import org.jetbrains.kotlin.types.checker.Ref
|
import org.jetbrains.kotlin.types.checker.Ref
|
||||||
@@ -40,7 +39,6 @@ class ModuleDescriptorImpl @JvmOverloads constructor(
|
|||||||
override val platform: TargetPlatform? = null,
|
override val platform: TargetPlatform? = null,
|
||||||
capabilities: Map<ModuleDescriptor.Capability<*>, Any?> = emptyMap(),
|
capabilities: Map<ModuleDescriptor.Capability<*>, Any?> = emptyMap(),
|
||||||
override val stableName: Name? = null,
|
override val stableName: Name? = null,
|
||||||
override val anchorProvider: AnchorProvider = AnchorProvider.Default,
|
|
||||||
) : DeclarationDescriptorImpl(Annotations.EMPTY, moduleName), ModuleDescriptor {
|
) : DeclarationDescriptorImpl(Annotations.EMPTY, moduleName), ModuleDescriptor {
|
||||||
private val capabilities: Map<ModuleDescriptor.Capability<*>, Any?>
|
private val capabilities: Map<ModuleDescriptor.Capability<*>, Any?>
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jetbrains.kotlin.resolve
|
|
||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
|
||||||
|
|
||||||
abstract class AnchorProvider {
|
|
||||||
open fun getAnchor(moduleDescriptor: ModuleDescriptor): ModuleDescriptor? = null
|
|
||||||
|
|
||||||
companion object Default : AnchorProvider()
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.resolve
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||||
|
|
||||||
|
interface ResolutionAnchorProvider {
|
||||||
|
fun getResolutionAnchor(moduleDescriptor: ModuleDescriptor): ModuleDescriptor? = null
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
val Default: ResolutionAnchorProvider = object : ResolutionAnchorProvider {
|
||||||
|
override fun getResolutionAnchor(moduleDescriptor: ModuleDescriptor): ModuleDescriptor? = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val RESOLUTION_ANCHOR_PROVIDER_CAPABILITY = ModuleDescriptor.Capability<ResolutionAnchorProvider>("ResolutionAnchorProvider")
|
||||||
@@ -31,7 +31,6 @@ import org.jetbrains.kotlin.incremental.components.LookupLocation;
|
|||||||
import org.jetbrains.kotlin.name.FqName;
|
import org.jetbrains.kotlin.name.FqName;
|
||||||
import org.jetbrains.kotlin.name.Name;
|
import org.jetbrains.kotlin.name.Name;
|
||||||
import org.jetbrains.kotlin.platform.TargetPlatform;
|
import org.jetbrains.kotlin.platform.TargetPlatform;
|
||||||
import org.jetbrains.kotlin.resolve.AnchorProvider;
|
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt;
|
import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt;
|
||||||
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter;
|
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter;
|
||||||
import org.jetbrains.kotlin.resolve.scopes.MemberScope;
|
import org.jetbrains.kotlin.resolve.scopes.MemberScope;
|
||||||
@@ -54,12 +53,6 @@ public class ErrorUtils {
|
|||||||
|
|
||||||
static {
|
static {
|
||||||
ERROR_MODULE = new ModuleDescriptor() {
|
ERROR_MODULE = new ModuleDescriptor() {
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public AnchorProvider getAnchorProvider() {
|
|
||||||
return AnchorProvider.Default;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public <T> T getCapability(@NotNull Capability<T> capability) {
|
public <T> T getCapability(@NotNull Capability<T> capability) {
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ package org.jetbrains.kotlin.idea.resolve
|
|||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.analyzer.AnalysisResult
|
import org.jetbrains.kotlin.analyzer.AnalysisResult
|
||||||
|
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
||||||
|
import org.jetbrains.kotlin.analyzer.ResolverForProject
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||||
@@ -38,6 +40,7 @@ interface ResolutionFacade {
|
|||||||
|
|
||||||
fun <T : Any> getFrontendService(moduleDescriptor: ModuleDescriptor, serviceClass: Class<T>): T
|
fun <T : Any> getFrontendService(moduleDescriptor: ModuleDescriptor, serviceClass: Class<T>): T
|
||||||
|
|
||||||
|
fun getResolverForProject(): ResolverForProject<out ModuleInfo>
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fun <reified T : Any> ResolutionFacade.frontendService(): T = this.getFrontendService(T::class.java)
|
inline fun <reified T : Any> ResolutionFacade.frontendService(): T = this.getFrontendService(T::class.java)
|
||||||
|
|||||||
-38
@@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jetbrains.kotlin.idea.caches.resolve
|
|
||||||
|
|
||||||
import com.intellij.openapi.project.Project
|
|
||||||
import org.jetbrains.kotlin.analyzer.ModuleResolverTracker
|
|
||||||
import org.jetbrains.kotlin.analyzer.ResolverForProject
|
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
|
||||||
import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo
|
|
||||||
import org.jetbrains.kotlin.idea.project.useAnchorServices
|
|
||||||
|
|
||||||
class IdeaModuleResolverTrackerImpl(private val project: Project) : ModuleResolverTracker<IdeaModuleInfo>() {
|
|
||||||
private val resolversForModules by lazy {
|
|
||||||
mutableMapOf<ModuleDescriptor, ResolverForProject<IdeaModuleInfo>>()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Synchronized
|
|
||||||
override fun registerModuleUpdate(
|
|
||||||
newModule: ModuleDescriptor,
|
|
||||||
oldModule: ModuleDescriptor?,
|
|
||||||
resolverForProject: ResolverForProject<IdeaModuleInfo>
|
|
||||||
) {
|
|
||||||
if (!project.useAnchorServices) return
|
|
||||||
|
|
||||||
if (oldModule != null) resolversForModules.remove(oldModule)
|
|
||||||
resolversForModules[newModule] = resolverForProject
|
|
||||||
}
|
|
||||||
|
|
||||||
@Synchronized
|
|
||||||
override fun findResolverForProjectByModuleDescriptor(moduleDescriptor: ModuleDescriptor): ResolverForProject<IdeaModuleInfo>? {
|
|
||||||
if (!project.useAnchorServices) return null
|
|
||||||
|
|
||||||
return resolversForModules[moduleDescriptor]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+22
-21
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
|||||||
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltIns
|
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltIns
|
||||||
import org.jetbrains.kotlin.caches.resolve.CompositeAnalyzerServices
|
import org.jetbrains.kotlin.caches.resolve.CompositeAnalyzerServices
|
||||||
import org.jetbrains.kotlin.caches.resolve.CompositeResolverForModuleFactory
|
import org.jetbrains.kotlin.caches.resolve.CompositeResolverForModuleFactory
|
||||||
|
import org.jetbrains.kotlin.caches.resolve.KotlinCacheService
|
||||||
import org.jetbrains.kotlin.caches.resolve.resolution
|
import org.jetbrains.kotlin.caches.resolve.resolution
|
||||||
import org.jetbrains.kotlin.context.ProjectContext
|
import org.jetbrains.kotlin.context.ProjectContext
|
||||||
import org.jetbrains.kotlin.context.withModule
|
import org.jetbrains.kotlin.context.withModule
|
||||||
@@ -32,7 +33,7 @@ import org.jetbrains.kotlin.platform.isCommon
|
|||||||
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
|
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
|
||||||
import org.jetbrains.kotlin.platform.jvm.isJvm
|
import org.jetbrains.kotlin.platform.jvm.isJvm
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
import org.jetbrains.kotlin.resolve.AnchorProvider
|
import org.jetbrains.kotlin.resolve.ResolutionAnchorProvider
|
||||||
import org.jetbrains.kotlin.resolve.jvm.JvmPlatformParameters
|
import org.jetbrains.kotlin.resolve.jvm.JvmPlatformParameters
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||||
|
|
||||||
@@ -53,7 +54,7 @@ class IdeaResolverForProject(
|
|||||||
fallbackModificationTracker,
|
fallbackModificationTracker,
|
||||||
delegateResolver,
|
delegateResolver,
|
||||||
ServiceManager.getService(projectContext.project, IdePackageOracleFactory::class.java),
|
ServiceManager.getService(projectContext.project, IdePackageOracleFactory::class.java),
|
||||||
ServiceManager.getService(projectContext.project, AnchorProvider::class.java)
|
ServiceManager.getService(projectContext.project, ResolutionAnchorProvider::class.java)
|
||||||
) {
|
) {
|
||||||
private val builtInsCache: BuiltInsCache =
|
private val builtInsCache: BuiltInsCache =
|
||||||
(delegateResolver as? IdeaResolverForProject)?.builtInsCache ?: BuiltInsCache(projectContext, this)
|
(delegateResolver as? IdeaResolverForProject)?.builtInsCache ?: BuiltInsCache(projectContext, this)
|
||||||
@@ -149,32 +150,32 @@ class IdeaResolverForProject(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun registerModuleDescriptorUpdate(
|
override fun tryGetResolverForModuleWithResolutionAnchorFallback(
|
||||||
newDescriptor: ModuleDescriptor,
|
|
||||||
oldDescriptor: ModuleDescriptor?
|
|
||||||
) {
|
|
||||||
ModuleResolverTracker
|
|
||||||
.getInstance(projectContext.project)
|
|
||||||
.safeAs<IdeaModuleResolverTrackerImpl>()
|
|
||||||
?.registerModuleUpdate(newDescriptor, oldDescriptor, this)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun tryGetResolverForModuleWithAnchorCheck(
|
|
||||||
targetModuleInfo: IdeaModuleInfo,
|
targetModuleInfo: IdeaModuleInfo,
|
||||||
referencingModuleInfo: IdeaModuleInfo,
|
referencingModuleInfo: IdeaModuleInfo,
|
||||||
): ResolverForModule? {
|
): ResolverForModule? {
|
||||||
tryGetResolverForModule(targetModuleInfo)?.let { return it }
|
tryGetResolverForModule(targetModuleInfo)?.let { return it }
|
||||||
|
|
||||||
|
return getResolverForProjectUsingResolutionAnchor(targetModuleInfo, referencingModuleInfo)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getResolverForProjectUsingResolutionAnchor(
|
||||||
|
targetModuleInfo: IdeaModuleInfo,
|
||||||
|
referencingModuleInfo: IdeaModuleInfo
|
||||||
|
): ResolverForModule? {
|
||||||
val moduleDescriptorOfReferencingModule = descriptorByModule[referencingModuleInfo]?.moduleDescriptor
|
val moduleDescriptorOfReferencingModule = descriptorByModule[referencingModuleInfo]?.moduleDescriptor
|
||||||
?: error("$referencingModuleInfo is not contained in this resolver, which means incorrect use of anchor-aware search")
|
?: error("$referencingModuleInfo is not contained in this resolver, which means incorrect use of anchor-aware search")
|
||||||
|
|
||||||
val anchorModuleDescriptor = anchorProvider.getAnchor(moduleDescriptorOfReferencingModule) ?: return null
|
val anchorModuleInfo = resolutionAnchorProvider.getResolutionAnchor(moduleDescriptorOfReferencingModule)?.moduleInfo ?: return null
|
||||||
|
|
||||||
val moduleResolverTracker =
|
val resolverForProjectFromAnchorModule = KotlinCacheService.getInstance(projectContext.project)
|
||||||
ModuleResolverTracker.getInstance(projectContext.project).safeAs<IdeaModuleResolverTrackerImpl>() ?: return null
|
.getResolutionFacadeByModuleInfo(anchorModuleInfo, anchorModuleInfo.platform)
|
||||||
|
?.getResolverForProject()
|
||||||
return moduleResolverTracker.findResolverForProjectByModuleDescriptor(anchorModuleDescriptor)
|
?: return null
|
||||||
?.tryGetResolverForModule(targetModuleInfo)
|
|
||||||
|
if (resolverForProjectFromAnchorModule !is IdeaResolverForProject) return null
|
||||||
|
|
||||||
|
return resolverForProjectFromAnchorModule.tryGetResolverForModule(targetModuleInfo)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+16
-20
@@ -12,23 +12,25 @@ import com.intellij.openapi.diagnostic.logger
|
|||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.util.xmlb.XmlSerializerUtil
|
import com.intellij.util.xmlb.XmlSerializerUtil
|
||||||
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
||||||
import org.jetbrains.kotlin.analyzer.ModuleResolverTracker
|
import org.jetbrains.kotlin.analyzer.moduleInfo
|
||||||
import org.jetbrains.kotlin.caches.project.cacheInvalidatingOnRootModifications
|
import org.jetbrains.kotlin.caches.project.cacheInvalidatingOnRootModifications
|
||||||
import org.jetbrains.kotlin.caches.resolve.KotlinCacheService
|
import org.jetbrains.kotlin.caches.resolve.KotlinCacheService
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||||
import org.jetbrains.kotlin.idea.caches.project.*
|
import org.jetbrains.kotlin.idea.caches.project.*
|
||||||
import org.jetbrains.kotlin.idea.project.useAnchorServices
|
import org.jetbrains.kotlin.idea.project.libraryToSourceAnalysisEnabled
|
||||||
import org.jetbrains.kotlin.resolve.AnchorProvider
|
import org.jetbrains.kotlin.resolve.ResolutionAnchorProvider
|
||||||
|
|
||||||
@State(name = "KotlinIdeAnchorService", storages = [Storage("anchors.xml")])
|
@State(name = "KotlinIdeAnchorService", storages = [Storage("anchors.xml")])
|
||||||
class KotlinIdeAnchorService(
|
class KotlinIdeResolutionAnchorService(
|
||||||
val project: Project
|
val project: Project
|
||||||
) : AnchorProvider(),
|
) : ResolutionAnchorProvider,
|
||||||
PersistentStateComponent<KotlinIdeAnchorService.State> {
|
PersistentStateComponent<KotlinIdeResolutionAnchorService.State> {
|
||||||
|
|
||||||
data class State(
|
data class State(
|
||||||
var moduleNameToAnchorName: Map<String, String> = emptyMap()
|
var moduleNameToAnchorName: Map<String, String> = emptyMap()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
private val logger = logger<KotlinIdeResolutionAnchorService>()
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
var myState: State = State()
|
var myState: State = State()
|
||||||
@@ -50,7 +52,7 @@ class KotlinIdeAnchorService(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun notFoundModule(moduleName: String): Nothing? {
|
private fun notFoundModule(moduleName: String): Nothing? {
|
||||||
logger<KotlinIdeAnchorService>().warn("Module <${moduleName}> not found in project model")
|
logger.warn("Module <${moduleName}> not found in project model")
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,13 +61,6 @@ class KotlinIdeAnchorService(
|
|||||||
buildMapping()
|
buildMapping()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getAnchorModuleDescriptorIfAny(moduleInfo: ModuleInfo): ModuleDescriptor? {
|
|
||||||
val mapped = moduleToAnchor[moduleInfo] ?: return null
|
|
||||||
return KotlinCacheService.getInstance(project)
|
|
||||||
.getResolutionFacadeByModuleInfo(mapped, mapped.platform)
|
|
||||||
?.moduleDescriptor
|
|
||||||
}
|
|
||||||
|
|
||||||
@Synchronized
|
@Synchronized
|
||||||
override fun getState(): State = myState
|
override fun getState(): State = myState
|
||||||
|
|
||||||
@@ -75,11 +70,12 @@ class KotlinIdeAnchorService(
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Synchronized
|
@Synchronized
|
||||||
override fun getAnchor(moduleDescriptor: ModuleDescriptor): ModuleDescriptor? {
|
override fun getResolutionAnchor(moduleDescriptor: ModuleDescriptor): ModuleDescriptor? {
|
||||||
if (!project.useAnchorServices) return null
|
if (!project.libraryToSourceAnalysisEnabled) return null
|
||||||
val resolver = ModuleResolverTracker.getInstance(project)
|
val moduleInfo = moduleDescriptor.moduleInfo ?: return null
|
||||||
.findResolverForProjectByModuleDescriptor(moduleDescriptor)
|
val mapped = moduleToAnchor[moduleInfo] ?: return null
|
||||||
?: return null
|
return KotlinCacheService.getInstance(project)
|
||||||
return getAnchorModuleDescriptorIfAny(resolver.moduleInfoForModuleDescriptor(moduleDescriptor))
|
.getResolutionFacadeByModuleInfo(mapped, mapped.platform)
|
||||||
|
?.moduleDescriptor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+5
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.caches.resolve
|
|||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.analyzer.AnalysisResult
|
import org.jetbrains.kotlin.analyzer.AnalysisResult
|
||||||
|
import org.jetbrains.kotlin.analyzer.ResolverForProject
|
||||||
import org.jetbrains.kotlin.container.get
|
import org.jetbrains.kotlin.container.get
|
||||||
import org.jetbrains.kotlin.container.getService
|
import org.jetbrains.kotlin.container.getService
|
||||||
import org.jetbrains.kotlin.container.tryGetService
|
import org.jetbrains.kotlin.container.tryGetService
|
||||||
@@ -115,6 +116,10 @@ internal class ModuleResolutionFacadeImpl(
|
|||||||
override fun <T : Any> getFrontendService(moduleDescriptor: ModuleDescriptor, serviceClass: Class<T>): T {
|
override fun <T : Any> getFrontendService(moduleDescriptor: ModuleDescriptor, serviceClass: Class<T>): T {
|
||||||
return projectFacade.resolverForDescriptor(moduleDescriptor).componentProvider.getService(serviceClass)
|
return projectFacade.resolverForDescriptor(moduleDescriptor).componentProvider.getService(serviceClass)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getResolverForProject(): ResolverForProject<IdeaModuleInfo> {
|
||||||
|
return projectFacade.getResolverForProject()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun ResolutionFacade.findModuleDescriptor(ideaModuleInfo: IdeaModuleInfo): ModuleDescriptor {
|
fun ResolutionFacade.findModuleDescriptor(ideaModuleInfo: IdeaModuleInfo): ModuleDescriptor {
|
||||||
|
|||||||
+2
@@ -145,6 +145,8 @@ internal class ProjectResolutionFacade(
|
|||||||
internal fun findModuleDescriptor(ideaModuleInfo: IdeaModuleInfo): ModuleDescriptor {
|
internal fun findModuleDescriptor(ideaModuleInfo: IdeaModuleInfo): ModuleDescriptor {
|
||||||
return cachedResolverForProject.descriptorForModule(ideaModuleInfo)
|
return cachedResolverForProject.descriptorForModule(ideaModuleInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal fun getResolverForProject(): ResolverForProject<IdeaModuleInfo> = cachedResolverForProject
|
||||||
|
|
||||||
internal fun getAnalysisResultsForElements(elements: Collection<KtElement>): AnalysisResult {
|
internal fun getAnalysisResultsForElements(elements: Collection<KtElement>): AnalysisResult {
|
||||||
assert(elements.isNotEmpty()) { "elements collection should not be empty" }
|
assert(elements.isNotEmpty()) { "elements collection should not be empty" }
|
||||||
|
|||||||
+5
@@ -14,6 +14,7 @@ import com.intellij.psi.PsiFile
|
|||||||
import com.intellij.psi.PsiNamedElement
|
import com.intellij.psi.PsiNamedElement
|
||||||
import org.jetbrains.kotlin.analyzer.AnalysisResult
|
import org.jetbrains.kotlin.analyzer.AnalysisResult
|
||||||
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
||||||
|
import org.jetbrains.kotlin.analyzer.ResolverForProject
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||||
import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo
|
import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo
|
||||||
@@ -89,6 +90,10 @@ private class ResolutionFacadeWithDebugInfo(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getResolverForProject(): ResolverForProject<out ModuleInfo> {
|
||||||
|
return delegate.getResolverForProject()
|
||||||
|
}
|
||||||
|
|
||||||
override fun <T : Any> getFrontendService(moduleDescriptor: ModuleDescriptor, serviceClass: Class<T>): T {
|
override fun <T : Any> getFrontendService(moduleDescriptor: ModuleDescriptor, serviceClass: Class<T>): T {
|
||||||
return wrapExceptions({ ResolvingWhat(serviceClass = serviceClass, moduleDescriptor = moduleDescriptor) }) {
|
return wrapExceptions({ ResolvingWhat(serviceClass = serviceClass, moduleDescriptor = moduleDescriptor) }) {
|
||||||
delegate.getFrontendService(moduleDescriptor, serviceClass)
|
delegate.getFrontendService(moduleDescriptor, serviceClass)
|
||||||
|
|||||||
+2
-4
@@ -6,10 +6,8 @@
|
|||||||
package org.jetbrains.kotlin.idea.caches.resolve.util
|
package org.jetbrains.kotlin.idea.caches.resolve.util
|
||||||
|
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.openapi.util.registry.Registry
|
|
||||||
import org.jetbrains.kotlin.context.GlobalContextImpl
|
import org.jetbrains.kotlin.context.GlobalContextImpl
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.PlatformAnalysisSettings
|
import org.jetbrains.kotlin.idea.project.libraryToSourceAnalysisEnabled
|
||||||
import org.jetbrains.kotlin.idea.project.useAnchorServices
|
|
||||||
import org.jetbrains.kotlin.idea.project.useCompositeAnalysis
|
import org.jetbrains.kotlin.idea.project.useCompositeAnalysis
|
||||||
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus
|
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus
|
||||||
import org.jetbrains.kotlin.storage.ExceptionTracker
|
import org.jetbrains.kotlin.storage.ExceptionTracker
|
||||||
@@ -34,7 +32,7 @@ private fun GlobalContextImpl.contextWithNewLockAndCompositeExceptionTracker(deb
|
|||||||
}
|
}
|
||||||
|
|
||||||
internal fun GlobalContextImpl.contextWithCompositeExceptionTracker(project: Project, debugName: String): GlobalContextImpl =
|
internal fun GlobalContextImpl.contextWithCompositeExceptionTracker(project: Project, debugName: String): GlobalContextImpl =
|
||||||
if (project.useCompositeAnalysis || project.useAnchorServices) {
|
if (project.useCompositeAnalysis || project.libraryToSourceAnalysisEnabled) {
|
||||||
this.contextWithCompositeExceptionTracker(debugName)
|
this.contextWithCompositeExceptionTracker(debugName)
|
||||||
} else {
|
} else {
|
||||||
this.contextWithNewLockAndCompositeExceptionTracker(debugName)
|
this.contextWithNewLockAndCompositeExceptionTracker(debugName)
|
||||||
|
|||||||
+6
-6
@@ -8,18 +8,18 @@ package org.jetbrains.kotlin.idea.project
|
|||||||
import com.intellij.ide.util.PropertiesComponent
|
import com.intellij.ide.util.PropertiesComponent
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
|
|
||||||
object KotlinAnchorSupportForLibraryAnalysisComponent {
|
object KotlinLibraryToSourceAnalysisComponent {
|
||||||
private const val anchorSupportOption = "kotlin.use.anchor.services"
|
private const val libraryToSourceAnalysisOption = "kotlin.library.to.source.analysis"
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun setState(project: Project, isEnabled: Boolean) {
|
fun setState(project: Project, isEnabled: Boolean) {
|
||||||
PropertiesComponent.getInstance(project).setValue(anchorSupportOption, isEnabled, false)
|
PropertiesComponent.getInstance(project).setValue(libraryToSourceAnalysisOption, isEnabled, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun isEnabled(project: Project): Boolean =
|
fun isEnabled(project: Project): Boolean =
|
||||||
PropertiesComponent.getInstance(project).getBoolean(anchorSupportOption)
|
PropertiesComponent.getInstance(project).getBoolean(libraryToSourceAnalysisOption)
|
||||||
}
|
}
|
||||||
|
|
||||||
val Project.useAnchorServices: Boolean
|
val Project.libraryToSourceAnalysisEnabled: Boolean
|
||||||
get() = KotlinAnchorSupportForLibraryAnalysisComponent.isEnabled(this)
|
get() = KotlinLibraryToSourceAnalysisComponent.isEnabled(this)
|
||||||
+1
-3
@@ -29,7 +29,7 @@ import org.jetbrains.kotlin.platform.TargetPlatform
|
|||||||
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
|
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
|
||||||
import org.jetbrains.kotlin.psi.KtCodeFragment
|
import org.jetbrains.kotlin.psi.KtCodeFragment
|
||||||
import org.jetbrains.kotlin.psi.externalDescriptors
|
import org.jetbrains.kotlin.psi.externalDescriptors
|
||||||
import org.jetbrains.kotlin.resolve.AnchorProvider
|
import org.jetbrains.kotlin.resolve.ResolutionAnchorProvider
|
||||||
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
import org.jetbrains.kotlin.types.Variance
|
import org.jetbrains.kotlin.types.Variance
|
||||||
@@ -196,8 +196,6 @@ private object DebugLabelModuleDescriptor : DeclarationDescriptorImpl(Annotation
|
|||||||
get() = true
|
get() = true
|
||||||
|
|
||||||
override fun assertValid() {}
|
override fun assertValid() {}
|
||||||
override val anchorProvider: AnchorProvider
|
|
||||||
get() = AnchorProvider.Default
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class DebugLabelPropertyDescriptor(
|
internal class DebugLabelPropertyDescriptor(
|
||||||
|
|||||||
@@ -1918,8 +1918,8 @@ signature.preview=Signature Preview
|
|||||||
move.members.from=Move members from:
|
move.members.from=Move members from:
|
||||||
open.moved.members.in.editor=Open moved members in editor
|
open.moved.members.in.editor=Open moved members in editor
|
||||||
to.fully.qualified.name=To (fully qualified name):
|
to.fully.qualified.name=To (fully qualified name):
|
||||||
toggle.anchor.support.for.library.analysis=Toggle anchor support for library analysis
|
toggle.library.to.source.dependency.support=Toggle library to source dependency support
|
||||||
enable.components.for.library.to.source.analysis.in.kotlin=Enable components for library-to-source analysis in Kotlin
|
enable.components.for.library.to.source.analysis.in.kotlin=Enable components for analyzing libraries depending on project source files in Kotlin
|
||||||
|
|
||||||
action.Kotlin.StopScratch.text=Stop Scratch Execution
|
action.Kotlin.StopScratch.text=Stop Scratch Execution
|
||||||
action.Kotlin.StopScratch.description=Stop scratch execution
|
action.Kotlin.StopScratch.description=Stop scratch execution
|
||||||
@@ -1975,7 +1975,7 @@ action.ShowKotlinBytecode.text=Show Kotlin Bytecode
|
|||||||
action.ConfigureKotlinJsInProject.text=Configure Kotlin (JavaScript) in Project
|
action.ConfigureKotlinJsInProject.text=Configure Kotlin (JavaScript) in Project
|
||||||
action.ConfigureKotlinInProject.text=Configure Kotlin in Project
|
action.ConfigureKotlinInProject.text=Configure Kotlin in Project
|
||||||
action.KotlinConsoleREPL.text=Kotlin REPL
|
action.KotlinConsoleREPL.text=Kotlin REPL
|
||||||
action.AnchorSupportForLibraryAnalysisToggleAction.text=Toggle Anchor Support For Modules
|
action.LibraryToSourceDependencySupportToggleAction.text=Toggle library to source dependency support
|
||||||
|
|
||||||
inspection.unused.unary.operator.display.name=Unused unary operator
|
inspection.unused.unary.operator.display.name=Unused unary operator
|
||||||
inspection.replace.guard.clause.with.function.call.display.name=Replace guard clause with kotlin's function call
|
inspection.replace.guard.clause.with.function.call.display.name=Replace guard clause with kotlin's function call
|
||||||
|
|||||||
@@ -90,7 +90,7 @@
|
|||||||
|
|
||||||
<action id="MultiplatformCompositeAnalysisToggleAction" class="org.jetbrains.kotlin.idea.actions.internal.MultiplatformCompositeAnalysisToggleAction"/>
|
<action id="MultiplatformCompositeAnalysisToggleAction" class="org.jetbrains.kotlin.idea.actions.internal.MultiplatformCompositeAnalysisToggleAction"/>
|
||||||
|
|
||||||
<action id="AnchorSupportForLibraryAnalysisToggleAction" class="org.jetbrains.kotlin.idea.actions.internal.AnchorSupportForLibraryAnalysisToggleAction"/>
|
<action id="LibraryToSourceDependencySupportToggleAction" class="org.jetbrains.kotlin.idea.actions.internal.LibraryToSourceDependencySupportToggleAction"/>
|
||||||
|
|
||||||
<action id="CopyAsDiagnosticTest" class="org.jetbrains.kotlin.idea.actions.internal.CopyAsDiagnosticTestAction"/>
|
<action id="CopyAsDiagnosticTest" class="org.jetbrains.kotlin.idea.actions.internal.CopyAsDiagnosticTestAction"/>
|
||||||
|
|
||||||
@@ -191,11 +191,8 @@
|
|||||||
<projectService serviceInterface="org.jetbrains.kotlin.caches.resolve.KotlinCacheService"
|
<projectService serviceInterface="org.jetbrains.kotlin.caches.resolve.KotlinCacheService"
|
||||||
serviceImplementation="org.jetbrains.kotlin.idea.caches.resolve.KotlinCacheServiceImpl"/>
|
serviceImplementation="org.jetbrains.kotlin.idea.caches.resolve.KotlinCacheServiceImpl"/>
|
||||||
|
|
||||||
<projectService serviceInterface="org.jetbrains.kotlin.resolve.AnchorProvider"
|
<projectService serviceInterface="org.jetbrains.kotlin.resolve.ResolutionAnchorProvider"
|
||||||
serviceImplementation="org.jetbrains.kotlin.idea.caches.resolve.KotlinIdeAnchorService"/>
|
serviceImplementation="org.jetbrains.kotlin.idea.caches.resolve.KotlinIdeResolutionAnchorService"/>
|
||||||
|
|
||||||
<projectService serviceInterface="org.jetbrains.kotlin.analyzer.ModuleResolverTracker"
|
|
||||||
serviceImplementation="org.jetbrains.kotlin.idea.caches.resolve.IdeaModuleResolverTrackerImpl"/>
|
|
||||||
|
|
||||||
<projectService serviceInterface="org.jetbrains.kotlin.idea.fir.FirIdeResolveStateService"
|
<projectService serviceInterface="org.jetbrains.kotlin.idea.fir.FirIdeResolveStateService"
|
||||||
serviceImplementation="org.jetbrains.kotlin.idea.fir.FirIdeResolveStateServiceImpl"/>
|
serviceImplementation="org.jetbrains.kotlin.idea.fir.FirIdeResolveStateServiceImpl"/>
|
||||||
|
|||||||
+6
-6
@@ -8,20 +8,20 @@ package org.jetbrains.kotlin.idea.actions.internal
|
|||||||
import com.intellij.openapi.actionSystem.AnActionEvent
|
import com.intellij.openapi.actionSystem.AnActionEvent
|
||||||
import com.intellij.openapi.actionSystem.ToggleAction
|
import com.intellij.openapi.actionSystem.ToggleAction
|
||||||
import org.jetbrains.kotlin.idea.KotlinBundle
|
import org.jetbrains.kotlin.idea.KotlinBundle
|
||||||
import org.jetbrains.kotlin.idea.project.KotlinAnchorSupportForLibraryAnalysisComponent
|
import org.jetbrains.kotlin.idea.project.KotlinLibraryToSourceAnalysisComponent
|
||||||
import org.jetbrains.kotlin.idea.project.useAnchorServices
|
import org.jetbrains.kotlin.idea.project.libraryToSourceAnalysisEnabled
|
||||||
|
|
||||||
class AnchorSupportForLibraryAnalysisToggleAction : ToggleAction(
|
class LibraryToSourceDependencySupportToggleAction : ToggleAction(
|
||||||
KotlinBundle.message("toggle.anchor.support.for.library.analysis"),
|
KotlinBundle.message("toggle.library.to.source.dependency.support"),
|
||||||
KotlinBundle.message("enable.components.for.library.to.source.analysis.in.kotlin"),
|
KotlinBundle.message("enable.components.for.library.to.source.analysis.in.kotlin"),
|
||||||
null
|
null
|
||||||
) {
|
) {
|
||||||
override fun isSelected(e: AnActionEvent): Boolean =
|
override fun isSelected(e: AnActionEvent): Boolean =
|
||||||
e.project?.useAnchorServices == true
|
e.project?.libraryToSourceAnalysisEnabled == true
|
||||||
|
|
||||||
override fun setSelected(e: AnActionEvent, state: Boolean) {
|
override fun setSelected(e: AnActionEvent, state: Boolean) {
|
||||||
e.project?.let {
|
e.project?.let {
|
||||||
KotlinAnchorSupportForLibraryAnalysisComponent.setState(it, state)
|
KotlinLibraryToSourceAnalysisComponent.setState(it, state)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
+6
@@ -8,6 +8,8 @@ package org.jetbrains.kotlin.scripting.ide_services.compiler.impl
|
|||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.analyzer.AnalysisResult
|
import org.jetbrains.kotlin.analyzer.AnalysisResult
|
||||||
|
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
||||||
|
import org.jetbrains.kotlin.analyzer.ResolverForProject
|
||||||
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
|
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
|
||||||
import org.jetbrains.kotlin.container.ComponentProvider
|
import org.jetbrains.kotlin.container.ComponentProvider
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
@@ -50,6 +52,10 @@ class KotlinResolutionFacadeForRepl(
|
|||||||
throw UnsupportedOperationException()
|
throw UnsupportedOperationException()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getResolverForProject(): ResolverForProject<out ModuleInfo> {
|
||||||
|
throw UnsupportedOperationException()
|
||||||
|
}
|
||||||
|
|
||||||
override fun <T : Any> getFrontendService(element: PsiElement, serviceClass: Class<T>): T {
|
override fun <T : Any> getFrontendService(element: PsiElement, serviceClass: Class<T>): T {
|
||||||
throw UnsupportedOperationException()
|
throw UnsupportedOperationException()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user