FIR: use real source element for return statement

fix fir
This commit is contained in:
Ilya Kirillov
2020-12-11 17:55:51 +01:00
parent 3af0257b38
commit a0ed14eafe
3 changed files with 16 additions and 3 deletions
@@ -1528,7 +1528,7 @@ class RawFirBuilder(
val source = expression.toFirSourceElement(FirFakeSourceElementKind.ImplicitUnit)
val result = expression.returnedExpression?.toFirExpression("Incorrect return expression")
?: buildUnitExpression { this.source = source }
return result.toReturn(source, expression.getTargetLabel()?.getReferencedName())
return result.toReturn(source, expression.getTargetLabel()?.getReferencedName(), fromKtReturnExpression = true)
}
override fun visitTryExpression(expression: KtTryExpression, data: Unit): FirElement {
@@ -148,7 +148,11 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
val ANONYMOUS_OBJECT_NAME = Name.special("<anonymous>")
}
fun FirExpression.toReturn(baseSource: FirSourceElement? = source, labelName: String? = null): FirReturnExpression {
fun FirExpression.toReturn(
baseSource: FirSourceElement? = source,
labelName: String? = null,
fromKtReturnExpression: Boolean = false
): FirReturnExpression {
return buildReturnExpression {
fun FirFunctionTarget.bindToErrorFunction(message: String, kind: DiagnosticKind) {
bind(
@@ -162,7 +166,9 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
)
}
source = baseSource?.fakeElement(FirFakeSourceElementKind.ImplicitReturn)
source =
if (fromKtReturnExpression) baseSource?.realElement()
else baseSource?.fakeElement(FirFakeSourceElementKind.ImplicitReturn)
result = this@toReturn
if (labelName == null) {
target = context.firFunctionTargets.lastOrNull { !it.isLambda } ?: FirFunctionTarget(labelName, isLambda = false).apply {
@@ -264,6 +264,13 @@ fun FirSourceElement.fakeElement(newKind: FirFakeSourceElementKind): FirSourceEl
}
}
fun FirSourceElement.realElement(): FirSourceElement = when (this) {
is FirRealPsiSourceElement<*> -> this
is FirLightSourceElement -> FirLightSourceElement(lighterASTNode, startOffset, endOffset, treeStructure, FirRealSourceElementKind)
is FirPsiSourceElement<*> -> FirRealPsiSourceElement(psi)
}
class FirLightSourceElement(
override val lighterASTNode: LighterASTNode,
override val startOffset: Int,