[ULC] Add recursion guard to getLightClass

Fixed KT-41325
This commit is contained in:
Igor Yakovlev
2020-08-29 01:40:55 +03:00
parent 873224dfbc
commit 48a3d4b8e0
@@ -118,6 +118,18 @@ class IDEKotlinAsJavaSupport(private val project: Project) : KotlinAsJavaSupport
)
}
private val recursiveGuard = ThreadLocal<Boolean>()
private inline fun <T> 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 ||