FIR body resolve: support subject type calculation
This commit is contained in:
@@ -13,7 +13,6 @@ import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirElseIfTrueCondition
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionStub
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirUnitExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirWhenSubjectExpression
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||
@@ -38,7 +37,6 @@ fun ConeKotlinType.render(): String {
|
||||
return when (this) {
|
||||
is ConeTypeVariableType -> "TypeVariable(${this.lookupTag.name})"
|
||||
is ConeDefinitelyNotNullType -> "${original.render()}!"
|
||||
is ConeKotlinErrorType -> "error: $reason"
|
||||
is ConeClassErrorType -> "class error: $reason"
|
||||
is ConeCapturedType -> "captured type: lowerType = ${lowerType?.render()}"
|
||||
is ConeClassLikeType -> {
|
||||
@@ -540,6 +538,10 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
|
||||
println("}")
|
||||
}
|
||||
|
||||
override fun visitWhenSubjectExpression(whenSubjectExpression: FirWhenSubjectExpression) {
|
||||
print("\$subj\$")
|
||||
}
|
||||
|
||||
override fun visitTryExpression(tryExpression: FirTryExpression) {
|
||||
tryExpression.annotations.renderAnnotations()
|
||||
print("try")
|
||||
@@ -604,7 +606,6 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
|
||||
when (expression) {
|
||||
is FirExpressionStub -> "STUB"
|
||||
is FirUnitExpression -> "Unit"
|
||||
is FirWhenSubjectExpression -> "\$subj\$"
|
||||
is FirElseIfTrueCondition -> "else"
|
||||
else -> "??? ${expression.javaClass}"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
/*
|
||||
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.fir
|
||||
|
||||
import org.jetbrains.kotlin.fir.expressions.FirWhenExpression
|
||||
|
||||
class FirWhenSubject {
|
||||
lateinit var whenExpression: FirWhenExpression
|
||||
|
||||
fun bind(expression: FirWhenExpression) {
|
||||
whenExpression = expression
|
||||
}
|
||||
}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
/*
|
||||
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.fir.expressions
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirWhenSubject
|
||||
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
||||
|
||||
interface FirWhenSubjectExpression : FirExpression {
|
||||
val whenSubject: FirWhenSubject
|
||||
|
||||
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
|
||||
visitor.visitWhenSubjectExpression(this, data)
|
||||
}
|
||||
+6
-5
@@ -6,11 +6,12 @@
|
||||
package org.jetbrains.kotlin.fir.expressions.impl
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.fir.FirAbstractElement
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.FirWhenSubject
|
||||
import org.jetbrains.kotlin.fir.expressions.FirWhenSubjectExpression
|
||||
|
||||
class FirWhenSubjectExpression(
|
||||
class FirWhenSubjectExpressionImpl(
|
||||
session: FirSession,
|
||||
psi: PsiElement?
|
||||
): FirAbstractExpression(session, psi)
|
||||
psi: PsiElement?,
|
||||
override val whenSubject: FirWhenSubject
|
||||
) : FirAbstractExpression(session, psi), FirWhenSubjectExpression
|
||||
+8
@@ -276,6 +276,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
|
||||
return transformExpression(whenExpression, data)
|
||||
}
|
||||
|
||||
open fun transformWhenSubjectExpression(whenSubjectExpression: FirWhenSubjectExpression, data: D): CompositeTransformResult<FirStatement> {
|
||||
return transformExpression(whenSubjectExpression, data)
|
||||
}
|
||||
|
||||
open fun transformWrappedArgumentExpression(wrappedArgumentExpression: FirWrappedArgumentExpression, data: D): CompositeTransformResult<FirStatement> {
|
||||
return transformExpression(wrappedArgumentExpression, data)
|
||||
}
|
||||
@@ -752,6 +756,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
|
||||
return transformWhenExpression(whenExpression, data)
|
||||
}
|
||||
|
||||
final override fun visitWhenSubjectExpression(whenSubjectExpression: FirWhenSubjectExpression, data: D): CompositeTransformResult<FirElement> {
|
||||
return transformWhenSubjectExpression(whenSubjectExpression, data)
|
||||
}
|
||||
|
||||
final override fun visitWhileLoop(whileLoop: FirWhileLoop, data: D): CompositeTransformResult<FirElement> {
|
||||
return transformWhileLoop(whileLoop, data)
|
||||
}
|
||||
|
||||
@@ -276,6 +276,10 @@ abstract class FirVisitor<out R, in D> {
|
||||
return visitExpression(whenExpression, data)
|
||||
}
|
||||
|
||||
open fun visitWhenSubjectExpression(whenSubjectExpression: FirWhenSubjectExpression, data: D): R {
|
||||
return visitExpression(whenSubjectExpression, data)
|
||||
}
|
||||
|
||||
open fun visitWrappedArgumentExpression(wrappedArgumentExpression: FirWrappedArgumentExpression, data: D): R {
|
||||
return visitExpression(wrappedArgumentExpression, data)
|
||||
}
|
||||
|
||||
+8
@@ -276,6 +276,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
|
||||
visitExpression(whenExpression, null)
|
||||
}
|
||||
|
||||
open fun visitWhenSubjectExpression(whenSubjectExpression: FirWhenSubjectExpression) {
|
||||
visitExpression(whenSubjectExpression, null)
|
||||
}
|
||||
|
||||
open fun visitWrappedArgumentExpression(wrappedArgumentExpression: FirWrappedArgumentExpression) {
|
||||
visitExpression(wrappedArgumentExpression, null)
|
||||
}
|
||||
@@ -752,6 +756,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
|
||||
visitWhenExpression(whenExpression)
|
||||
}
|
||||
|
||||
final override fun visitWhenSubjectExpression(whenSubjectExpression: FirWhenSubjectExpression, data: Nothing?) {
|
||||
visitWhenSubjectExpression(whenSubjectExpression)
|
||||
}
|
||||
|
||||
final override fun visitWhileLoop(whileLoop: FirWhileLoop, data: Nothing?) {
|
||||
visitWhileLoop(whileLoop)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user