[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? { override fun getLightClass(classOrObject: KtClassOrObject): KtLightClass? {
if (!classOrObject.isValid) { if (!classOrObject.isValid) {
return null return null
@@ -131,7 +143,9 @@ class IDEKotlinAsJavaSupport(private val project: Project) : KotlinAsJavaSupport
ProjectRootsUtil.isLibraryClassFile(project, virtualFile) -> ProjectRootsUtil.isLibraryClassFile(project, virtualFile) ->
return getLightClassForDecompiledClassOrObject(classOrObject) return getLightClassForDecompiledClassOrObject(classOrObject)
ProjectRootsUtil.isLibrarySourceFile(project, virtualFile) -> ProjectRootsUtil.isLibrarySourceFile(project, virtualFile) ->
return SourceNavigationHelper.getOriginalClass(classOrObject) as? KtLightClass return guardedRun {
SourceNavigationHelper.getOriginalClass(classOrObject) as? KtLightClass
}
} }
} }
if ((classOrObject.containingFile as? KtFile)?.analysisContext != null || if ((classOrObject.containingFile as? KtFile)?.analysisContext != null ||