From d8a3dacdc519492f014ffd487fda0524e5cd9493 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 22 Feb 2021 16:00:54 +0100 Subject: [PATCH] FIR: return back supertypeRefs list recreation --- .../resolve/transformers/FirSupertypesResolution.kt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt index 4f4ba4a93f1..18f26cff764 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt @@ -284,7 +284,13 @@ private class FirSupertypeResolverVisitor( supertypeRefs: List ): List { return resolveSpecificClassLikeSupertypes(classLikeDeclaration) { transformer, scope -> - supertypeRefs.mapTo(mutableListOf()) { + /* + This list is backed by mutable list and during iterating on it we can resolve supertypes of that class via IDE light classes + as IJ Java resolve may resolve a lot of stuff by light classes + this causes ConcurrentModificationException + So we create a copy of supertypeRefs to avoid it + */ + supertypeRefs.createCopy().mapTo(mutableListOf()) { val superTypeRef = transformer.transformTypeRef(it, scope).single val typeParameterType = superTypeRef.coneTypeSafe() when { @@ -304,6 +310,8 @@ private class FirSupertypeResolverVisitor( } } + private fun List.createCopy(): List = ArrayList(this) + private fun addSupertypesFromExtensions(klass: FirClassLikeDeclaration<*>, supertypeRefs: MutableList) { if (supertypeGenerationExtensions.isEmpty()) return val provider = session.predicateBasedProvider