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
|
package org.jetbrains.kotlin.idea.fir.low.level.api.api
|
||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
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.builder.buildPropertyAccessorCopy
|
import org.jetbrains.kotlin.fir.declarations.builder.buildPropertyAccessorCopy
|
||||||
import org.jetbrains.kotlin.fir.declarations.builder.buildPropertyCopy
|
import org.jetbrains.kotlin.fir.declarations.builder.buildPropertyCopy
|
||||||
import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunctionCopy
|
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.resolve.FirTowerDataContext
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
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.FirModuleResolveStateForCompletion
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.FirModuleResolveStateImpl
|
import org.jetbrains.kotlin.idea.fir.low.level.api.FirModuleResolveStateImpl
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.FirTowerDataContextCollector
|
import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.FirTowerDataContextCollector
|
||||||
@@ -106,10 +106,9 @@ object LowLevelFirApiFacadeForCompletion {
|
|||||||
resolvePhase = minOf(originalFunction.resolvePhase, FirResolvePhase.DECLARATIONS)
|
resolvePhase = minOf(originalFunction.resolvePhase, FirResolvePhase.DECLARATIONS)
|
||||||
source = builtFunction.source
|
source = builtFunction.source
|
||||||
session = state.rootModuleSession
|
session = state.rootModuleSession
|
||||||
}
|
}.apply { reassignAllReturnTargets (builtFunction) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun buildPropertyCopyForCompletion(
|
private fun buildPropertyCopyForCompletion(
|
||||||
firIdeProvider: FirIdeProvider,
|
firIdeProvider: FirIdeProvider,
|
||||||
element: KtProperty,
|
element: KtProperty,
|
||||||
@@ -129,7 +128,7 @@ object LowLevelFirApiFacadeForCompletion {
|
|||||||
resolvePhase = minOf(builtSetter.resolvePhase, FirResolvePhase.DECLARATIONS)
|
resolvePhase = minOf(builtSetter.resolvePhase, FirResolvePhase.DECLARATIONS)
|
||||||
source = builtSetter.source
|
source = builtSetter.source
|
||||||
session = state.rootModuleSession
|
session = state.rootModuleSession
|
||||||
}
|
}.apply { reassignAllReturnTargets(builtSetter) }
|
||||||
} else {
|
} else {
|
||||||
builtSetter
|
builtSetter
|
||||||
}
|
}
|
||||||
@@ -146,4 +145,16 @@ object LowLevelFirApiFacadeForCompletion {
|
|||||||
session = state.rootModuleSession
|
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