From a989599a43803d53f60e010556d0e85345093c40 Mon Sep 17 00:00:00 2001 From: Ting-Yuan Huang Date: Tue, 15 Oct 2024 12:13:30 -0700 Subject: [PATCH] KSP1: Try to invalidate KotlinCliJavaFileManagerImpl.topLevelClassesCache See https://github.com/JetBrains/kotlin/pull/5369 for more details. (cherry picked from commit f12968a9dba1480c7a7338105d5191e3c0a604e6) --- .../ksp/KotlinSymbolProcessingExtension.kt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/KotlinSymbolProcessingExtension.kt b/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/KotlinSymbolProcessingExtension.kt index 266c9aa720..41fc2a334d 100644 --- a/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/KotlinSymbolProcessingExtension.kt +++ b/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/KotlinSymbolProcessingExtension.kt @@ -50,8 +50,10 @@ import com.intellij.openapi.vfs.StandardFileSystems import com.intellij.openapi.vfs.VirtualFileManager import com.intellij.psi.PsiJavaFile import com.intellij.psi.PsiManager +import com.intellij.psi.impl.file.impl.JavaFileManager import org.jetbrains.kotlin.analyzer.AnalysisResult import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity +import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCliJavaFileManagerImpl import org.jetbrains.kotlin.config.JvmAnalysisFlags import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.container.ComponentProvider @@ -157,6 +159,8 @@ abstract class AbstractKotlinSymbolProcessingExtension( val psiManager = PsiManager.getInstance(project) if (initialized) { psiManager.dropPsiCaches() + psiManager.dropResolveCaches() + invalidateKotlinCliJavaFileManagerCache(project) } else { // In case of broken builds. if (javaShadowBase.exists()) { @@ -503,3 +507,13 @@ fun findTargetInfos(languageVersionSettings: LanguageVersionSettings, module: Mo else -> UnknownPlatformInfoImpl(platform.toString()) } } ?: emptyList() + +// FIXME: remove as soon as possible. +private fun invalidateKotlinCliJavaFileManagerCache(project: Project): Boolean { + val javaFileManager = (JavaFileManager.getInstance(project) as? KotlinCliJavaFileManagerImpl) ?: return false + val privateCacheField = KotlinCliJavaFileManagerImpl::class.java.getDeclaredField("topLevelClassesCache") + if (!privateCacheField.trySetAccessible()) + return false + (privateCacheField.get(javaFileManager) as? MutableMap<*, *>)?.clear() ?: return false + return true +}