FIR: use real source element for return statement
fix fir
This commit is contained in:
@@ -1528,7 +1528,7 @@ class RawFirBuilder(
|
|||||||
val source = expression.toFirSourceElement(FirFakeSourceElementKind.ImplicitUnit)
|
val source = expression.toFirSourceElement(FirFakeSourceElementKind.ImplicitUnit)
|
||||||
val result = expression.returnedExpression?.toFirExpression("Incorrect return expression")
|
val result = expression.returnedExpression?.toFirExpression("Incorrect return expression")
|
||||||
?: buildUnitExpression { this.source = source }
|
?: 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 {
|
override fun visitTryExpression(expression: KtTryExpression, data: Unit): FirElement {
|
||||||
|
|||||||
+8
-2
@@ -148,7 +148,11 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
|
|||||||
val ANONYMOUS_OBJECT_NAME = Name.special("<anonymous>")
|
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 {
|
return buildReturnExpression {
|
||||||
fun FirFunctionTarget.bindToErrorFunction(message: String, kind: DiagnosticKind) {
|
fun FirFunctionTarget.bindToErrorFunction(message: String, kind: DiagnosticKind) {
|
||||||
bind(
|
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
|
result = this@toReturn
|
||||||
if (labelName == null) {
|
if (labelName == null) {
|
||||||
target = context.firFunctionTargets.lastOrNull { !it.isLambda } ?: FirFunctionTarget(labelName, isLambda = false).apply {
|
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(
|
class FirLightSourceElement(
|
||||||
override val lighterASTNode: LighterASTNode,
|
override val lighterASTNode: LighterASTNode,
|
||||||
override val startOffset: Int,
|
override val startOffset: Int,
|
||||||
|
|||||||
Reference in New Issue
Block a user