[Analysis API] Do not hold a reference to 'KtCodeFragment' from modules
'KtModule' references may be cached for indefinite time. If so, unused fake documents will wait long before being cleaned up. ^KT-62562 Fixed
This commit is contained in:
+11
-3
@@ -11,13 +11,19 @@ import org.jetbrains.kotlin.analysis.project.structure.KtCodeFragmentModule
|
|||||||
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||||
import org.jetbrains.kotlin.platform.TargetPlatform
|
import org.jetbrains.kotlin.platform.TargetPlatform
|
||||||
import org.jetbrains.kotlin.psi.KtCodeFragment
|
import org.jetbrains.kotlin.psi.KtCodeFragment
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.createSmartPointer
|
||||||
import org.jetbrains.kotlin.resolve.PlatformDependentAnalyzerServices
|
import org.jetbrains.kotlin.resolve.PlatformDependentAnalyzerServices
|
||||||
import java.util.Objects
|
import java.util.Objects
|
||||||
|
|
||||||
public class KtCodeFragmentModuleImpl(
|
public class KtCodeFragmentModuleImpl(
|
||||||
override val codeFragment: KtCodeFragment,
|
codeFragment: KtCodeFragment,
|
||||||
override val contextModule: KtModule
|
override val contextModule: KtModule
|
||||||
) : KtCodeFragmentModule {
|
) : KtCodeFragmentModule {
|
||||||
|
private val codeFragmentRef = codeFragment.createSmartPointer()
|
||||||
|
|
||||||
|
override val codeFragment: KtCodeFragment
|
||||||
|
get() = codeFragmentRef.element?.takeIf { it.isValid } ?: error("Code fragment module is invalid")
|
||||||
|
|
||||||
override val project: Project
|
override val project: Project
|
||||||
get() = contextModule.project
|
get() = contextModule.project
|
||||||
|
|
||||||
@@ -46,13 +52,15 @@ public class KtCodeFragmentModuleImpl(
|
|||||||
if (this === other) return true
|
if (this === other) return true
|
||||||
|
|
||||||
if (other is KtCodeFragmentModuleImpl) {
|
if (other is KtCodeFragmentModuleImpl) {
|
||||||
return codeFragment == other.codeFragment && contextModule == other.contextModule
|
val selfCodeFragment = this.codeFragmentRef.element
|
||||||
|
val otherCodeFragment = other.codeFragmentRef.element
|
||||||
|
return selfCodeFragment != null && selfCodeFragment == otherCodeFragment && contextModule == other.contextModule
|
||||||
}
|
}
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun hashCode(): Int {
|
override fun hashCode(): Int {
|
||||||
return Objects.hash(codeFragment, contextModule)
|
return Objects.hash(codeFragmentRef.element, contextModule)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user