org.jetbrains.kotlin.fir.visitors.FirTransformerUtil.kt Maven / Gradle / Ivy
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.visitors
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirPureAbstractElement
fun T.transformSingle(transformer: FirTransformer, data: D): T {
return (this as FirPureAbstractElement).transform(transformer, data).single
}
fun MutableList.transformInplace(transformer: FirTransformer, data: D) {
val iterator = this.listIterator()
while (iterator.hasNext()) {
val next = iterator.next() as FirPureAbstractElement
val result = next.transform(transformer, data)
if (result.isSingle) {
iterator.set(result.single)
} else {
val resultIterator = result.list.listIterator()
if (!resultIterator.hasNext()) {
iterator.remove()
} else {
iterator.set(resultIterator.next())
}
while (resultIterator.hasNext()) {
iterator.add(resultIterator.next())
}
}
}
}
sealed class TransformData {
class Data(val value: D) : TransformData()
object Nothing : TransformData()
}
inline fun MutableList.transformInplace(transformer: FirTransformer, dataProducer: (Int) -> TransformData) {
val iterator = this.listIterator()
var index = 0
while (iterator.hasNext()) {
val next = iterator.next() as FirPureAbstractElement
val data = when (val data = dataProducer(index++)) {
is TransformData.Data -> data.value
TransformData.Nothing -> continue
}
val result = next.transform(transformer, data).single
iterator.set(result)
}
}