[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 override fun replaceAnnotations(newAnnotations: List<FirAnnotation>)
|
||||||
|
|
||||||
|
abstract fun replaceBlock(newBlock: FirBlock)
|
||||||
|
|
||||||
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirCodeFragment
|
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirCodeFragment
|
||||||
|
|
||||||
abstract fun <D> transformBlock(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.ResolveStateAccess
|
||||||
import org.jetbrains.kotlin.fir.declarations.asResolveState
|
import org.jetbrains.kotlin.fir.declarations.asResolveState
|
||||||
import org.jetbrains.kotlin.fir.declarations.impl.FirCodeFragmentImpl
|
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.FirAnnotation
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCodeFragmentSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirCodeFragmentSymbol
|
||||||
@@ -64,3 +65,20 @@ inline fun buildCodeFragment(init: FirCodeFragmentBuilder.() -> Unit): FirCodeFr
|
|||||||
}
|
}
|
||||||
return FirCodeFragmentBuilder().apply(init).build()
|
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>) {
|
override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) {
|
||||||
annotations = newAnnotations.toMutableOrEmpty()
|
annotations = newAnnotations.toMutableOrEmpty()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun replaceBlock(newBlock: FirBlock) {
|
||||||
|
block = newBlock
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
@@ -370,6 +370,10 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
|
|||||||
withCopy()
|
withCopy()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
builder(codeFragment) {
|
||||||
|
withCopy()
|
||||||
|
}
|
||||||
|
|
||||||
builder(resolvedQualifier) {
|
builder(resolvedQualifier) {
|
||||||
parents += abstractResolvedQualifierBuilder
|
parents += abstractResolvedQualifierBuilder
|
||||||
defaultFalse("isNullableLHSForCallableReference", "isFullyQualified")
|
defaultFalse("isNullableLHSForCallableReference", "isFullyQualified")
|
||||||
|
|||||||
+1
-1
@@ -497,7 +497,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
|
|||||||
|
|
||||||
codeFragment.configure {
|
codeFragment.configure {
|
||||||
+symbol("FirCodeFragmentSymbol")
|
+symbol("FirCodeFragmentSymbol")
|
||||||
+field(block).withTransform()
|
+field(block, withReplace = true).withTransform()
|
||||||
}
|
}
|
||||||
|
|
||||||
packageDirective.configure {
|
packageDirective.configure {
|
||||||
|
|||||||
Reference in New Issue
Block a user