From 48a3d4b8e0267e615464c252434ef9937ed70ada Mon Sep 17 00:00:00 2001 From: Igor Yakovlev Date: Sat, 29 Aug 2020 01:40:55 +0300 Subject: [PATCH] [ULC] Add recursion guard to getLightClass Fixed KT-41325 --- .../caches/resolve/IDEKotlinAsJavaSupport.kt | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDEKotlinAsJavaSupport.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDEKotlinAsJavaSupport.kt index 38de1fbf9fb..372013b9479 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDEKotlinAsJavaSupport.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDEKotlinAsJavaSupport.kt @@ -118,6 +118,18 @@ class IDEKotlinAsJavaSupport(private val project: Project) : KotlinAsJavaSupport ) } + private val recursiveGuard = ThreadLocal() + + private inline fun guardedRun(body: () -> T): T? { + if (recursiveGuard.get() == true) return null + return try { + recursiveGuard.set(true) + body() + } finally { + recursiveGuard.set(false) + } + } + override fun getLightClass(classOrObject: KtClassOrObject): KtLightClass? { if (!classOrObject.isValid) { return null @@ -131,7 +143,9 @@ class IDEKotlinAsJavaSupport(private val project: Project) : KotlinAsJavaSupport ProjectRootsUtil.isLibraryClassFile(project, virtualFile) -> return getLightClassForDecompiledClassOrObject(classOrObject) ProjectRootsUtil.isLibrarySourceFile(project, virtualFile) -> - return SourceNavigationHelper.getOriginalClass(classOrObject) as? KtLightClass + return guardedRun { + SourceNavigationHelper.getOriginalClass(classOrObject) as? KtLightClass + } } } if ((classOrObject.containingFile as? KtFile)?.analysisContext != null ||