FIR IDE: fix function targets on context element copy
This commit is contained in:
+18
-7
@@ -6,16 +6,16 @@
|
||||
package org.jetbrains.kotlin.idea.fir.low.level.api.api
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildPropertyAccessorCopy
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildPropertyCopy
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunctionCopy
|
||||
import org.jetbrains.kotlin.fir.expressions.FirReturnExpression
|
||||
import org.jetbrains.kotlin.fir.resolve.FirTowerDataContext
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
|
||||
import org.jetbrains.kotlin.idea.fir.low.level.api.FirModuleResolveStateForCompletion
|
||||
import org.jetbrains.kotlin.idea.fir.low.level.api.FirModuleResolveStateImpl
|
||||
import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.FirTowerDataContextCollector
|
||||
@@ -106,10 +106,9 @@ object LowLevelFirApiFacadeForCompletion {
|
||||
resolvePhase = minOf(originalFunction.resolvePhase, FirResolvePhase.DECLARATIONS)
|
||||
source = builtFunction.source
|
||||
session = state.rootModuleSession
|
||||
}
|
||||
}.apply { reassignAllReturnTargets (builtFunction) }
|
||||
}
|
||||
|
||||
|
||||
private fun buildPropertyCopyForCompletion(
|
||||
firIdeProvider: FirIdeProvider,
|
||||
element: KtProperty,
|
||||
@@ -129,7 +128,7 @@ object LowLevelFirApiFacadeForCompletion {
|
||||
resolvePhase = minOf(builtSetter.resolvePhase, FirResolvePhase.DECLARATIONS)
|
||||
source = builtSetter.source
|
||||
session = state.rootModuleSession
|
||||
}
|
||||
}.apply { reassignAllReturnTargets(builtSetter) }
|
||||
} else {
|
||||
builtSetter
|
||||
}
|
||||
@@ -146,4 +145,16 @@ object LowLevelFirApiFacadeForCompletion {
|
||||
session = state.rootModuleSession
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private fun FirFunction<*>.reassignAllReturnTargets(from: FirFunction<*>) {
|
||||
this.accept(object : FirVisitorVoid() {
|
||||
override fun visitElement(element: FirElement) {
|
||||
if (element is FirReturnExpression && element.target.labeledElement == from) {
|
||||
element.target.bind(this@reassignAllReturnTargets)
|
||||
}
|
||||
element.acceptChildren(this)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user