FIR: make transformInplace to be thread safe if no transformation was done

^KT-50822 fixed
This commit is contained in:
Ilya Kirillov
2022-01-18 12:23:56 +03:00
committed by teamcity
parent 0eda3d6cd5
commit ce1e4f252f
@@ -17,8 +17,10 @@ fun <T : FirElement, D> MutableList<T>.transformInplace(transformer: FirTransfor
while (iterator.hasNext()) { while (iterator.hasNext()) {
val next = iterator.next() as FirPureAbstractElement val next = iterator.next() as FirPureAbstractElement
val result = next.transform<T, D>(transformer, data) val result = next.transform<T, D>(transformer, data)
if (result !== next) {
iterator.set(result) iterator.set(result)
} }
}
} }
sealed class TransformData<out D> { sealed class TransformData<out D> {
@@ -36,8 +38,10 @@ inline fun <T : FirElement, D> MutableList<T>.transformInplace(transformer: FirT
TransformData.Nothing -> continue TransformData.Nothing -> continue
} }
val result = next.transform<T, D>(transformer, data) val result = next.transform<T, D>(transformer, data)
if (result !== next) {
iterator.set(result) iterator.set(result)
} }
}
} }
fun <R, D> List<FirElement>.acceptAllElements(visitor: FirVisitor<R, D>, data: D) { fun <R, D> List<FirElement>.acceptAllElements(visitor: FirVisitor<R, D>, data: D) {