[FIR] Add 'buildCodeFragmentCopy()' and 'replaceBlock()' for IDE analysis

This commit is contained in:
Yan Zhulanow
2023-06-23 21:56:47 +09:00
parent 0fe527bb65
commit 8ffb329741
5 changed files with 29 additions and 1 deletions
@@ -36,6 +36,8 @@ abstract class FirCodeFragment : FirDeclaration() {
abstract override fun replaceAnnotations(newAnnotations: List<FirAnnotation>)
abstract fun replaceBlock(newBlock: FirBlock)
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirCodeFragment
abstract fun <D> transformBlock(transformer: FirTransformer<D>, data: D): FirCodeFragment
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.fir.declarations.FirResolveState
import org.jetbrains.kotlin.fir.declarations.ResolveStateAccess
import org.jetbrains.kotlin.fir.declarations.asResolveState
import org.jetbrains.kotlin.fir.declarations.impl.FirCodeFragmentImpl
import org.jetbrains.kotlin.fir.declarations.resolvePhase
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.symbols.impl.FirCodeFragmentSymbol
@@ -64,3 +65,20 @@ inline fun buildCodeFragment(init: FirCodeFragmentBuilder.() -> Unit): FirCodeFr
}
return FirCodeFragmentBuilder().apply(init).build()
}
@OptIn(ExperimentalContracts::class)
inline fun buildCodeFragmentCopy(original: FirCodeFragment, init: FirCodeFragmentBuilder.() -> Unit): FirCodeFragment {
contract {
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
}
val copyBuilder = FirCodeFragmentBuilder()
copyBuilder.source = original.source
copyBuilder.resolvePhase = original.resolvePhase
copyBuilder.annotations.addAll(original.annotations)
copyBuilder.moduleData = original.moduleData
copyBuilder.origin = original.origin
copyBuilder.attributes = original.attributes.copy()
copyBuilder.symbol = original.symbol
copyBuilder.block = original.block
return copyBuilder.apply(init).build()
}
@@ -68,4 +68,8 @@ internal class FirCodeFragmentImpl(
override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) {
annotations = newAnnotations.toMutableOrEmpty()
}
override fun replaceBlock(newBlock: FirBlock) {
block = newBlock
}
}
@@ -370,6 +370,10 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
withCopy()
}
builder(codeFragment) {
withCopy()
}
builder(resolvedQualifier) {
parents += abstractResolvedQualifierBuilder
defaultFalse("isNullableLHSForCallableReference", "isFullyQualified")
@@ -497,7 +497,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
codeFragment.configure {
+symbol("FirCodeFragmentSymbol")
+field(block).withTransform()
+field(block, withReplace = true).withTransform()
}
packageDirective.configure {