[FIR] Add 'buildCodeFragmentCopy()' and 'replaceBlock()' for IDE analysis
This commit is contained in:
@@ -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
|
||||
|
||||
+18
@@ -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()
|
||||
}
|
||||
|
||||
+4
@@ -68,4 +68,8 @@ internal class FirCodeFragmentImpl(
|
||||
override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) {
|
||||
annotations = newAnnotations.toMutableOrEmpty()
|
||||
}
|
||||
|
||||
override fun replaceBlock(newBlock: FirBlock) {
|
||||
block = newBlock
|
||||
}
|
||||
}
|
||||
|
||||
+4
@@ -370,6 +370,10 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
|
||||
withCopy()
|
||||
}
|
||||
|
||||
builder(codeFragment) {
|
||||
withCopy()
|
||||
}
|
||||
|
||||
builder(resolvedQualifier) {
|
||||
parents += abstractResolvedQualifierBuilder
|
||||
defaultFalse("isNullableLHSForCallableReference", "isFullyQualified")
|
||||
|
||||
+1
-1
@@ -497,7 +497,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
|
||||
|
||||
codeFragment.configure {
|
||||
+symbol("FirCodeFragmentSymbol")
|
||||
+field(block).withTransform()
|
||||
+field(block, withReplace = true).withTransform()
|
||||
}
|
||||
|
||||
packageDirective.configure {
|
||||
|
||||
Reference in New Issue
Block a user