Optimization: make FIR expression an abstract class

NB: this commit does significant fir:tree refactoring.
It provides some boost due to faster abstract class dispatching in JVM.
This commit is contained in:
Mikhail Glukhikh
2019-06-11 12:11:18 +03:00
parent dab6fe29b1
commit 688c2cf74f
79 changed files with 839 additions and 463 deletions
@@ -474,7 +474,7 @@ internal fun generateTemporaryVariable(
session: FirSession, psi: PsiElement?, specialName: String, initializer: FirExpression session: FirSession, psi: PsiElement?, specialName: String, initializer: FirExpression
): FirVariable = generateTemporaryVariable(session, psi, Name.special("<$specialName>"), initializer) ): FirVariable = generateTemporaryVariable(session, psi, Name.special("<$specialName>"), initializer)
private fun FirModifiableQualifiedAccess.initializeLValue( private fun FirModifiableQualifiedAccess<*>.initializeLValue(
session: FirSession, session: FirSession,
left: KtExpression?, left: KtExpression?,
convertQualified: KtQualifiedExpression.() -> FirQualifiedAccess? convertQualified: KtQualifiedExpression.() -> FirQualifiedAccess?
@@ -314,7 +314,7 @@ class RawFirBuilder(val session: FirSession, val stubMode: Boolean) {
} }
} }
private fun KtCallElement.extractArgumentsTo(container: FirAbstractCall) { private fun KtCallElement.extractArgumentsTo(container: FirCallWithArgumentList) {
for (argument in this.valueArguments) { for (argument in this.valueArguments) {
val argumentExpression = argument.toFirExpression() val argumentExpression = argument.toFirExpression()
container.arguments += when (argument) { container.arguments += when (argument) {
@@ -1124,7 +1124,7 @@ class RawFirBuilder(val session: FirSession, val stubMode: Boolean) {
} }
} }
private fun FirAbstractLoopJump.bindLabel(expression: KtExpressionWithLabel): FirAbstractLoopJump { private fun FirLoopJump.bindLabel(expression: KtExpressionWithLabel): FirLoopJump {
val labelName = expression.getLabelName() val labelName = expression.getLabelName()
target = FirLoopTarget(labelName) target = FirLoopTarget(labelName)
val lastLoop = firLoops.lastOrNull() val lastLoop = firLoops.lastOrNull()
@@ -1301,7 +1301,7 @@ class RawFirBuilder(val session: FirSession, val stubMode: Boolean) {
val selector = expression.selectorExpression val selector = expression.selectorExpression
?: return FirErrorExpressionImpl(session, expression, "Qualified expression without selector") ?: return FirErrorExpressionImpl(session, expression, "Qualified expression without selector")
val firSelector = selector.toFirExpression("Incorrect selector expression") val firSelector = selector.toFirExpression("Incorrect selector expression")
if (firSelector is FirModifiableQualifiedAccess) { if (firSelector is FirModifiableQualifiedAccess<*>) {
firSelector.safe = expression is KtSafeQualifiedExpression firSelector.safe = expression is KtSafeQualifiedExpression
firSelector.explicitReceiver = expression.receiverExpression.toFirExpression("Incorrect receiver expression") firSelector.explicitReceiver = expression.receiverExpression.toFirExpression("Incorrect receiver expression")
} }
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.FirElseIfTrueCondition import org.jetbrains.kotlin.fir.expressions.impl.FirElseIfTrueCondition
import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionStub import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionStub
import org.jetbrains.kotlin.fir.expressions.impl.FirLoopJump
import org.jetbrains.kotlin.fir.expressions.impl.FirUnitExpression import org.jetbrains.kotlin.fir.expressions.impl.FirUnitExpression
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol
@@ -587,8 +588,8 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
whileLoop.block.accept(this) whileLoop.block.accept(this)
} }
private fun visitLoopJump(jump: FirJump<FirLoop>) { override fun visitLoopJump(loopJump: FirLoopJump) {
val target = jump.target val target = loopJump.target
val labeledElement = target.labeledElement val labeledElement = target.labeledElement
print("@@@[") print("@@@[")
labeledElement.condition.accept(this) labeledElement.condition.accept(this)
@@ -5,14 +5,19 @@
package org.jetbrains.kotlin.fir.declarations package org.jetbrains.kotlin.fir.declarations
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirLabeledElement import org.jetbrains.kotlin.fir.FirLabeledElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.VisitedSupertype import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.impl.FirUnknownTypeExpression
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirAnonymousFunction : @VisitedSupertype FirFunction, FirExpression, FirTypedDeclaration, FirLabeledElement { abstract class FirAnonymousFunction(
val receiverTypeRef: FirTypeRef? session: FirSession,
psi: PsiElement?
) : @VisitedSupertype FirFunction, FirUnknownTypeExpression(session, psi), FirTypedDeclaration, FirLabeledElement {
abstract val receiverTypeRef: FirTypeRef?
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitAnonymousFunction(this, data) visitor.visitAnonymousFunction(this, data)
@@ -5,12 +5,18 @@
package org.jetbrains.kotlin.fir.declarations package org.jetbrains.kotlin.fir.declarations
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.VisitedSupertype import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirUnknownTypeExpression
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirAnonymousObject : @VisitedSupertype FirClass, FirExpression { abstract class FirAnonymousObject(
session: FirSession,
psi: PsiElement?
) : @VisitedSupertype FirClass, FirUnknownTypeExpression(session, psi) {
override val classKind: ClassKind override val classKind: ClassKind
get() = ClassKind.OBJECT get() = ClassKind.OBJECT
@@ -19,6 +25,6 @@ interface FirAnonymousObject : @VisitedSupertype FirClass, FirExpression {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) { override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
super<FirClass>.acceptChildren(visitor, data) super<FirClass>.acceptChildren(visitor, data)
super<FirExpression>.acceptChildren(visitor, data) super<FirUnknownTypeExpression>.acceptChildren(visitor, data)
} }
} }
@@ -5,13 +5,18 @@
package org.jetbrains.kotlin.fir.declarations package org.jetbrains.kotlin.fir.declarations
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.BaseTransformedType import org.jetbrains.kotlin.fir.BaseTransformedType
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.VisitedSupertype import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.expressions.FirCall import org.jetbrains.kotlin.fir.expressions.FirCall
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
@BaseTransformedType @BaseTransformedType
interface FirEnumEntry : @VisitedSupertype FirRegularClass, FirCall { abstract class FirEnumEntry(
session: FirSession,
psi: PsiElement?
) : @VisitedSupertype FirRegularClass, FirCall(session, psi) {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitEnumEntry(this, data) visitor.visitEnumEntry(this, data)
@@ -6,13 +6,11 @@
package org.jetbrains.kotlin.fir.declarations.impl package org.jetbrains.kotlin.fir.declarations.impl
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.FirLabel
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.transformSingle import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirAnonymousFunctionImpl( class FirAnonymousFunctionImpl(
@@ -20,21 +18,21 @@ class FirAnonymousFunctionImpl(
psi: PsiElement?, psi: PsiElement?,
override var returnTypeRef: FirTypeRef, override var returnTypeRef: FirTypeRef,
override var receiverTypeRef: FirTypeRef? override var receiverTypeRef: FirTypeRef?
) : FirAbstractFunction(session, psi), FirAnonymousFunction, FirModifiableFunction { ) : FirAnonymousFunction(session, psi), FirModifiableFunction {
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(session, null)
override var label: FirLabel? = null override var label: FirLabel? = null
override fun replaceTypeRef(newTypeRef: FirTypeRef) { override val valueParameters = mutableListOf<FirValueParameter>()
typeRef = newTypeRef
} override var body: FirBlock? = null
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
typeRef = typeRef.transformSingle(transformer, data)
returnTypeRef = returnTypeRef.transformSingle(transformer, data) returnTypeRef = returnTypeRef.transformSingle(transformer, data)
receiverTypeRef = receiverTypeRef?.transformSingle(transformer, data) receiverTypeRef = receiverTypeRef?.transformSingle(transformer, data)
label = label?.transformSingle(transformer, data) label = label?.transformSingle(transformer, data)
return super<FirAbstractFunction>.transformChildren(transformer, data) valueParameters.transformInplace(transformer, data)
body = body?.transformSingle(transformer, data)
return super<FirAnonymousFunction>.transformChildren(transformer, data)
} }
override fun <D> transformReturnTypeRef(transformer: FirTransformer<D>, data: D) { override fun <D> transformReturnTypeRef(transformer: FirTransformer<D>, data: D) {
@@ -11,35 +11,26 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.transformInplace import org.jetbrains.kotlin.fir.transformInplace
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
class FirAnonymousObjectImpl( class FirAnonymousObjectImpl(
session: FirSession, session: FirSession,
psi: PsiElement? psi: PsiElement?
) : FirAbstractAnnotatedDeclaration(session, psi), FirAnonymousObject, FirModifiableClass { ) : FirAnonymousObject(session, psi), FirModifiableClass {
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(session, null)
override val superTypeRefs = mutableListOf<FirTypeRef>() override val superTypeRefs = mutableListOf<FirTypeRef>()
override val declarations = mutableListOf<FirDeclaration>() override val declarations = mutableListOf<FirDeclaration>()
override fun replaceTypeRef(newTypeRef: FirTypeRef) {
typeRef = newTypeRef
}
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R { override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R {
return super<FirAnonymousObject>.accept(visitor, data) return super<FirAnonymousObject>.accept(visitor, data)
} }
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
typeRef = typeRef.transformSingle(transformer, data)
superTypeRefs.transformInplace(transformer, data) superTypeRefs.transformInplace(transformer, data)
declarations.transformInplace(transformer, data) declarations.transformInplace(transformer, data)
return super<FirAbstractAnnotatedDeclaration>.transformChildren(transformer, data) return super<FirAnonymousObject>.transformChildren(transformer, data)
} }
} }
@@ -10,8 +10,7 @@ import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.expressions.FirCall import org.jetbrains.kotlin.fir.expressions.FirCall
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
@@ -21,40 +20,63 @@ import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitEnumTypeRef import org.jetbrains.kotlin.fir.types.impl.FirImplicitEnumTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
class FirEnumEntryImpl( class FirEnumEntryImpl(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
symbol: FirClassSymbol, override val symbol: FirClassSymbol,
name: Name override val name: Name
) : FirClassImpl( ) : FirEnumEntry(session, psi), FirModifiableClass {
session, init {
psi, symbol.bind(this)
symbol, }
name,
visibility = Visibilities.UNKNOWN, override var status = FirDeclarationStatusImpl(session, Visibilities.UNKNOWN, Modality.FINAL)
modality = Modality.FINAL,
isExpect = false, override val classKind: ClassKind
isActual = false, get() = ClassKind.ENUM_ENTRY
classKind = ClassKind.ENUM_ENTRY,
isInner = false, override val typeParameters = mutableListOf<FirTypeParameter>()
isCompanion = false,
isData = false, override val superTypeRefs = mutableListOf<FirTypeRef>()
isInline = false
), FirEnumEntry { override val declarations = mutableListOf<FirDeclaration>()
override val companionObject: FirRegularClass?
get() = null
override var typeRef: FirTypeRef = FirImplicitEnumTypeRef(session, null) override var typeRef: FirTypeRef = FirImplicitEnumTypeRef(session, null)
override val arguments = mutableListOf<FirExpression>() override val arguments = mutableListOf<FirExpression>()
override fun replaceSupertypes(newSupertypes: List<FirTypeRef>): FirRegularClass {
superTypeRefs.clear()
superTypeRefs.addAll(newSupertypes)
return this
}
override fun replaceTypeRef(newTypeRef: FirTypeRef) { override fun replaceTypeRef(newTypeRef: FirTypeRef) {
typeRef = newTypeRef typeRef = newTypeRef
} }
fun addDeclaration(declaration: FirDeclaration) {
declarations += declaration
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirRegularClass { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirRegularClass {
superTypeRefs.transformInplace(transformer, data)
typeParameters.transformInplace(transformer, data)
status = status.transformSingle(transformer, data)
declarations.firstIsInstanceOrNull<FirConstructorImpl>()?.typeParameters?.transformInplace(transformer, data)
// Transform declarations in last turn
declarations.transformInplace(transformer, data)
typeRef = typeRef.transformSingle(transformer, data) typeRef = typeRef.transformSingle(transformer, data)
arguments.transformInplace(transformer, data) arguments.transformInplace(transformer, data)
return super<FirClassImpl>.transformChildren(transformer, data) return super<FirEnumEntry>.transformChildren(transformer, data) as FirRegularClass
} }
override fun <D> transformArguments(transformer: FirTransformer<D>, data: D): FirCall { override fun <D> transformArguments(transformer: FirTransformer<D>, data: D): FirCall {
@@ -5,8 +5,10 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.BaseTransformedType import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.impl.FirUnknownTypeCallWithArgumentList
import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.ConeClassLikeType
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -14,12 +16,14 @@ import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
@BaseTransformedType abstract class FirAnnotationCall(
interface FirAnnotationCall : FirCall { session: FirSession,
val annotationTypeRef: FirTypeRef psi: PsiElement?
) : FirUnknownTypeCallWithArgumentList(session, psi) {
abstract val annotationTypeRef: FirTypeRef
// May be should be not-null (with correct default target) // May be should be not-null (with correct default target)
val useSiteTarget: AnnotationUseSiteTarget? abstract val useSiteTarget: AnnotationUseSiteTarget?
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitAnnotationCall(this, data) visitor.visitAnnotationCall(this, data)
@@ -5,9 +5,15 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.impl.FirUnknownTypeCallWithArgumentList
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirArrayOfCall : FirCall { abstract class FirArrayOfCall(
session: FirSession,
psi: PsiElement?
) : FirUnknownTypeCallWithArgumentList(session, psi) {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitArrayOfCall(this, data) visitor.visitArrayOfCall(this, data)
} }
@@ -5,12 +5,17 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.VisitedSupertype import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirArraySetCall : @VisitedSupertype FirCall, FirAssignment { abstract class FirArraySetCall(
session: FirSession,
psi: PsiElement?
) : @VisitedSupertype FirCall(session, psi), FirAssignment {
// NB: arguments of this thing are indexes AND rvalue // NB: arguments of this thing are indexes AND rvalue
val indexes: List<FirExpression> abstract val indexes: List<FirExpression>
override val arguments get() = indexes + rValue override val arguments get() = indexes + rValue
@@ -18,11 +23,8 @@ interface FirArraySetCall : @VisitedSupertype FirCall, FirAssignment {
visitor.visitArraySetCall(this, data) visitor.visitArraySetCall(this, data)
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) { override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
for (index in indexes) { super<FirCall>.acceptChildren(visitor, data)
index.accept(visitor, data) calleeReference.accept(visitor, data)
} rValue.accept(visitor, data)
acceptAnnotations(visitor, data)
typeRef.accept(visitor, data)
super<FirAssignment>.acceptChildren(visitor, data)
} }
} }
@@ -5,10 +5,16 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.impl.FirUnknownTypeExpression
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirBlock : FirExpression { abstract class FirBlock(
val statements: List<FirStatement> session: FirSession,
psi: PsiElement?
) : FirUnknownTypeExpression(session, psi) {
abstract val statements: List<FirStatement>
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitBlock(this, data) visitor.visitBlock(this, data)
@@ -5,9 +5,15 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.impl.FirLoopJump
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirBreakExpression : FirJump<FirLoop> { abstract class FirBreakExpression(
session: FirSession,
psi: PsiElement?
) : FirLoopJump(session, psi) {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitBreakExpression(this, data) visitor.visitBreakExpression(this, data)
} }
@@ -5,13 +5,18 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.BaseTransformedType import org.jetbrains.kotlin.fir.BaseTransformedType
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
@BaseTransformedType @BaseTransformedType
interface FirCall : FirExpression { abstract class FirCall(
val arguments: List<FirExpression> session: FirSession,
psi: PsiElement?
) : FirExpression(session, psi) {
abstract val arguments: List<FirExpression>
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitCall(this, data) visitor.visitCall(this, data)
@@ -23,5 +28,5 @@ interface FirCall : FirExpression {
super.acceptChildren(visitor, data) super.acceptChildren(visitor, data)
} }
fun <D> transformArguments(transformer: FirTransformer<D>, data: D): FirCall abstract fun <D> transformArguments(transformer: FirTransformer<D>, data: D): FirCall
} }
@@ -5,9 +5,14 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirCallableReferenceAccess : FirQualifiedAccessExpression { abstract class FirCallableReferenceAccess(
session: FirSession,
psi: PsiElement?
) : FirQualifiedAccessExpression(session, psi) {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitCallableReferenceAccess(this, data) visitor.visitCallableReferenceAccess(this, data)
} }
@@ -5,11 +5,17 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.impl.FirUnknownTypeExpression
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirClassReferenceExpression : FirExpression { abstract class FirClassReferenceExpression(
val classTypeRef: FirTypeRef session: FirSession,
psi: PsiElement?
) : FirUnknownTypeExpression(session, psi) {
abstract val classTypeRef: FirTypeRef
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitClassReferenceExpression(this, data) visitor.visitClassReferenceExpression(this, data)
@@ -5,12 +5,19 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.impl.FirUnknownTypeExpression
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
import org.jetbrains.kotlin.ir.expressions.IrConstKind import org.jetbrains.kotlin.ir.expressions.IrConstKind
interface FirConstExpression<T> : FirExpression { abstract class FirConstExpression<T>(
val kind: IrConstKind<T> session: FirSession,
val value: T psi: PsiElement?
) : FirUnknownTypeExpression(session, psi) {
abstract val kind: IrConstKind<T>
abstract val value: T
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R { override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R {
return visitor.visitConstExpression(this, data) return visitor.visitConstExpression(this, data)
@@ -5,9 +5,15 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.impl.FirLoopJump
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirContinueExpression : FirJump<FirLoop> { abstract class FirContinueExpression(
session: FirSession,
psi: PsiElement?
) : FirLoopJump(session, psi) {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitContinueExpression(this, data) visitor.visitContinueExpression(this, data)
} }
@@ -5,15 +5,21 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.VisitedSupertype import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.expressions.impl.FirCallWithArgumentList
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirDelegatedConstructorCall : @VisitedSupertype FirCall, FirQualifiedAccess { abstract class FirDelegatedConstructorCall(
session: FirSession,
psi: PsiElement?
) : @VisitedSupertype FirCallWithArgumentList(session, psi), FirQualifiedAccess {
// Do we need 'constructedType: FirType' here? // Do we need 'constructedType: FirType' here?
val constructedTypeRef: FirTypeRef abstract val constructedTypeRef: FirTypeRef
val isThis: Boolean abstract val isThis: Boolean
val isSuper: Boolean val isSuper: Boolean
get() = !isThis get() = !isThis
@@ -24,6 +30,6 @@ interface FirDelegatedConstructorCall : @VisitedSupertype FirCall, FirQualifiedA
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) { override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
constructedTypeRef.accept(visitor, data) constructedTypeRef.accept(visitor, data)
calleeReference.accept(visitor, data) calleeReference.accept(visitor, data)
super<FirCall>.acceptChildren(visitor, data) super<FirCallWithArgumentList>.acceptChildren(visitor, data)
} }
} }
@@ -5,10 +5,16 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.impl.FirUnknownTypeExpression
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirErrorExpression : FirExpression { abstract class FirErrorExpression(
val reason: String session: FirSession,
psi: PsiElement?
) : FirUnknownTypeExpression(session, psi) {
abstract val reason: String
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R { override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R {
return visitor.visitErrorExpression(this, data) return visitor.visitErrorExpression(this, data)
@@ -5,15 +5,21 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirResolvedCallableReference import org.jetbrains.kotlin.fir.FirResolvedCallableReference
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.impl.FirAnnotatedStatement
import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirExpression : FirStatement { abstract class FirExpression(
val typeRef: FirTypeRef session: FirSession,
psi: PsiElement?
) : FirAnnotatedStatement(session, psi) {
abstract val typeRef: FirTypeRef
fun replaceTypeRef(newTypeRef: FirTypeRef) abstract fun replaceTypeRef(newTypeRef: FirTypeRef)
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitExpression(this, data) visitor.visitExpression(this, data)
@@ -9,27 +9,25 @@ import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirNamedReference import org.jetbrains.kotlin.fir.FirNamedReference
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.VisitedSupertype import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.expressions.impl.FirAbstractCall import org.jetbrains.kotlin.fir.expressions.impl.FirUnknownTypeCallWithArgumentList
import org.jetbrains.kotlin.fir.types.FirTypeProjectionContainer import org.jetbrains.kotlin.fir.types.FirTypeProjectionContainer
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
abstract class FirFunctionCall( abstract class FirFunctionCall(
session: FirSession, session: FirSession,
psi: PsiElement? psi: PsiElement?
) : FirAbstractCall(session, psi), @VisitedSupertype FirCall, FirQualifiedAccess, FirTypeProjectionContainer { ) : @VisitedSupertype FirUnknownTypeCallWithArgumentList(session, psi), FirQualifiedAccess, FirTypeProjectionContainer {
abstract override val calleeReference: FirNamedReference abstract override val calleeReference: FirNamedReference
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitFunctionCall(this, data) visitor.visitFunctionCall(this, data)
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) { override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
for (argument in arguments) { calleeReference.accept(visitor, data)
argument.accept(visitor, data) explicitReceiver?.accept(visitor, data)
}
for (typeArgument in typeArguments) { for (typeArgument in typeArguments) {
typeArgument.accept(visitor, data) typeArgument.accept(visitor, data)
} }
typeRef.accept(visitor, data) super<FirUnknownTypeCallWithArgumentList>.acceptChildren(visitor, data)
super<FirQualifiedAccess>.acceptChildren(visitor, data)
} }
} }
@@ -5,9 +5,15 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.impl.FirUnknownTypeCallWithArgumentList
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirGetClassCall : FirCall { abstract class FirGetClassCall(
session: FirSession,
psi: PsiElement?
) : FirUnknownTypeCallWithArgumentList(session, psi) {
val argument: FirExpression get() = arguments.first() val argument: FirExpression get() = arguments.first()
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
@@ -5,12 +5,17 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirTarget import org.jetbrains.kotlin.fir.FirTarget
import org.jetbrains.kotlin.fir.FirTargetElement import org.jetbrains.kotlin.fir.FirTargetElement
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirJump<E : FirTargetElement> : FirExpression { abstract class FirJump<E : FirTargetElement>(
val target: FirTarget<E> session: FirSession,
psi: PsiElement?
) : FirExpression(session, psi) {
abstract val target: FirTarget<E>
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitJump(this, data) visitor.visitJump(this, data)
@@ -5,10 +5,16 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.impl.FirCallWithArgumentList
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirOperatorCall : FirCall { abstract class FirOperatorCall(
val operation: FirOperation session: FirSession,
psi: PsiElement?
) : FirCallWithArgumentList(session, psi) {
abstract val operation: FirOperation
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitOperatorCall(this, data) visitor.visitOperatorCall(this, data)
@@ -5,15 +5,22 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.VisitedSupertype import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.expressions.impl.FirUnknownTypeExpression
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirQualifiedAccessExpression : @VisitedSupertype FirQualifiedAccess, FirExpression { abstract class FirQualifiedAccessExpression(
session: FirSession,
psi: PsiElement?
) : FirQualifiedAccess, @VisitedSupertype FirUnknownTypeExpression(session, psi) {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitQualifiedAccessExpression(this, data) visitor.visitQualifiedAccessExpression(this, data)
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) { override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
super<FirQualifiedAccess>.acceptChildren(visitor, data) calleeReference.accept(visitor, data)
typeRef.accept(visitor, data) explicitReceiver?.accept(visitor, data)
super<FirUnknownTypeExpression>.acceptChildren(visitor, data)
} }
} }
@@ -5,16 +5,23 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.impl.FirUnknownTypeExpression
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
interface FirResolvedQualifier : FirExpression { abstract class FirResolvedQualifier(
session: FirSession,
psi: PsiElement?
) : FirUnknownTypeExpression(session, psi) {
abstract val packageFqName: FqName
abstract val relativeClassFqName: FqName?
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitResolvedQualifier(this, data) override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitResolvedQualifier(this, data)
val packageFqName: FqName
val relativeClassFqName: FqName?
val classId val classId
get() = relativeClassFqName?.let { get() = relativeClassFqName?.let {
ClassId(packageFqName, it, false) ClassId(packageFqName, it, false)
@@ -5,11 +5,16 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirFunction
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirReturnExpression : FirJump<FirFunction> { abstract class FirReturnExpression(
val result: FirExpression session: FirSession,
psi: PsiElement?
) : FirJump<FirFunction>(session, psi) {
abstract val result: FirExpression
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitReturnExpression(this, data) visitor.visitReturnExpression(this, data)
@@ -5,9 +5,15 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.impl.FirCallWithArgumentList
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirStringConcatenationCall : FirCall { abstract class FirStringConcatenationCall(
session: FirSession,
psi: PsiElement?
) : FirCallWithArgumentList(session, psi) {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitStringConcatenationCall(this, data) visitor.visitStringConcatenationCall(this, data)
} }
@@ -5,10 +5,15 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirThrowExpression : FirExpression { abstract class FirThrowExpression(
val exception: FirExpression session: FirSession,
psi: PsiElement?
) : FirExpression(session, psi) {
abstract val exception: FirExpression
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitThrowExpression(this, data) visitor.visitThrowExpression(this, data)
@@ -5,14 +5,20 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.impl.FirUnknownTypeExpression
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirTryExpression : FirExpression { abstract class FirTryExpression(
val tryBlock: FirBlock session: FirSession,
psi: PsiElement?
) : FirUnknownTypeExpression(session, psi) {
abstract val tryBlock: FirBlock
val catches: List<FirCatch> abstract val catches: List<FirCatch>
val finallyBlock: FirBlock? abstract val finallyBlock: FirBlock?
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitTryExpression(this, data) visitor.visitTryExpression(this, data)
@@ -5,14 +5,21 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.impl.FirOperationBasedCall
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
// is/!is/as/as? // is/!is/as/as?
interface FirTypeOperatorCall : FirOperatorCall { abstract class FirTypeOperatorCall(
session: FirSession,
psi: PsiElement?,
operation: FirOperation
) : FirOperationBasedCall(session, psi, operation) {
val argument: FirExpression get() = arguments.first() val argument: FirExpression get() = arguments.first()
val conversionTypeRef: FirTypeRef abstract val conversionTypeRef: FirTypeRef
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitTypeOperatorCall(this, data) visitor.visitTypeOperatorCall(this, data)
@@ -5,9 +5,15 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.impl.FirUnknownTypeCallWithArgumentList
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirUncheckedNotNullCast : FirCall { abstract class FirUncheckedNotNullCast(
session: FirSession,
psi: PsiElement?
) : FirUnknownTypeCallWithArgumentList(session, psi) {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitUncheckedNotNullCast(this, data) override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitUncheckedNotNullCast(this, data)
val expression: FirExpression get() = arguments[0] val expression: FirExpression get() = arguments[0]
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.fir.VisitedSupertype import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
@@ -5,20 +5,25 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.impl.FirUnknownTypeExpression
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirWhenExpression : FirExpression { abstract class FirWhenExpression(
val subject: FirExpression? session: FirSession,
psi: PsiElement?
) : FirUnknownTypeExpression(session, psi) {
abstract val subject: FirExpression?
// when (val subjectVariable = subject()) { ... } // when (val subjectVariable = subject()) { ... }
val subjectVariable: FirVariable? abstract val subjectVariable: FirVariable?
val branches: List<FirWhenBranch> abstract val branches: List<FirWhenBranch>
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitWhenExpression(this, data) visitor.visitWhenExpression(this, data)
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) { override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
subjectVariable?.accept(visitor, data) ?: subject?.accept(visitor, data) subjectVariable?.accept(visitor, data) ?: subject?.accept(visitor, data)
for (branch in branches) { for (branch in branches) {
@@ -5,11 +5,17 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirWhenSubject import org.jetbrains.kotlin.fir.FirWhenSubject
import org.jetbrains.kotlin.fir.expressions.impl.FirUnknownTypeExpression
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirWhenSubjectExpression : FirExpression { abstract class FirWhenSubjectExpression(
val whenSubject: FirWhenSubject session: FirSession,
psi: PsiElement?
) : FirUnknownTypeExpression(session, psi) {
abstract val whenSubject: FirWhenSubject
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitWhenSubjectExpression(this, data) visitor.visitWhenSubjectExpression(this, data)
@@ -7,14 +7,13 @@ package org.jetbrains.kotlin.fir.expressions
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.impl.FirAbstractStatement
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
abstract class FirWrappedArgumentExpression( abstract class FirWrappedArgumentExpression(
session: FirSession, session: FirSession,
psi: PsiElement? psi: PsiElement?
) : FirAbstractStatement(session, psi), FirExpression { ) : FirExpression(session, psi) {
abstract val expression: FirExpression abstract val expression: FirExpression
open val isSpread: Boolean open val isSpread: Boolean
@@ -32,6 +31,6 @@ abstract class FirWrappedArgumentExpression(
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) { override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
expression.accept(visitor, data) expression.accept(visitor, data)
super<FirExpression>.acceptChildren(visitor, data) super.acceptChildren(visitor, data)
} }
} }
@@ -16,7 +16,7 @@ abstract class FirAbstractLoop(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
override var condition: FirExpression override var condition: FirExpression
) : FirAbstractStatement(session, psi), FirLoop { ) : FirAnnotatedStatement(session, psi), FirLoop {
override lateinit var block: FirBlock override lateinit var block: FirBlock
override var label: FirLabel? = null override var label: FirLabel? = null
@@ -25,6 +25,6 @@ abstract class FirAbstractLoop(
condition = condition.transformSingle(transformer, data) condition = condition.transformSingle(transformer, data)
block = block.transformSingle(transformer, data) block = block.transformSingle(transformer, data)
label = label?.transformSingle(transformer, data) label = label?.transformSingle(transformer, data)
return super<FirAbstractStatement>.transformChildren(transformer, data) return super<FirAnnotatedStatement>.transformChildren(transformer, data)
} }
} }
@@ -15,7 +15,7 @@ abstract class FirAbstractQualifiedAccess(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
final override var safe: Boolean = false final override var safe: Boolean = false
) : FirAbstractStatement(session, psi), FirModifiableQualifiedAccess { ) : FirAnnotatedStatement(session, psi), FirModifiableQualifiedAccess<FirReference> {
final override lateinit var calleeReference: FirReference final override lateinit var calleeReference: FirReference
final override var explicitReceiver: FirExpression? = null final override var explicitReceiver: FirExpression? = null
@@ -23,7 +23,7 @@ abstract class FirAbstractQualifiedAccess(
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
calleeReference = calleeReference.transformSingle(transformer, data) calleeReference = calleeReference.transformSingle(transformer, data)
explicitReceiver = explicitReceiver?.transformSingle(transformer, data) explicitReceiver = explicitReceiver?.transformSingle(transformer, data)
return super<FirAbstractStatement>.transformChildren(transformer, data) return super<FirAnnotatedStatement>.transformChildren(transformer, data)
} }
override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirQualifiedAccess { override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirQualifiedAccess {
@@ -9,7 +9,7 @@ import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirStatement
abstract class FirAbstractStatement( abstract class FirAnnotatedStatement(
session: FirSession, session: FirSession,
psi: PsiElement? psi: PsiElement?
) : FirAbstractAnnotatedElement(session, psi), FirStatement ) : FirAbstractAnnotatedElement(session, psi), FirStatement
@@ -19,10 +19,10 @@ class FirAnnotationCallImpl(
psi: PsiElement?, psi: PsiElement?,
override val useSiteTarget: AnnotationUseSiteTarget?, override val useSiteTarget: AnnotationUseSiteTarget?,
override var annotationTypeRef: FirTypeRef override var annotationTypeRef: FirTypeRef
) : FirAbstractCall(session, psi), FirAnnotationCall { ) : FirAnnotationCall(session, psi) {
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
annotationTypeRef = annotationTypeRef.transformSingle(transformer, data) annotationTypeRef = annotationTypeRef.transformSingle(transformer, data)
return super<FirAbstractCall>.transformChildren(transformer, data) return super.transformChildren(transformer, data)
} }
} }
@@ -12,4 +12,4 @@ import org.jetbrains.kotlin.fir.expressions.FirArrayOfCall
class FirArrayOfCallImpl( class FirArrayOfCallImpl(
session: FirSession, session: FirSession,
psi: PsiElement? psi: PsiElement?
) : FirAbstractCall(session, psi), FirArrayOfCall ) : FirArrayOfCall(session, psi)
@@ -6,22 +6,30 @@
package org.jetbrains.kotlin.fir.expressions.impl package org.jetbrains.kotlin.fir.expressions.impl
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.transformInplace
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.FirVisitor
class FirArraySetCallImpl( class FirArraySetCallImpl(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
value: FirExpression, override var rValue: FirExpression,
operation: FirOperation override val operation: FirOperation
) : FirAbstractAssignment(session, psi, value, operation, false), FirArraySetCall { ) : FirArraySetCall(session, psi), FirModifiableQualifiedAccess<FirReference> {
override lateinit var calleeReference: FirReference
override var lValue: FirReference
get() = calleeReference
set(value) {
calleeReference = value
}
override var explicitReceiver: FirExpression?
get() = null
set(_) {}
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(session, null) override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(session, null)
override fun replaceTypeRef(newTypeRef: FirTypeRef) { override fun replaceTypeRef(newTypeRef: FirTypeRef) {
@@ -30,14 +38,9 @@ class FirArraySetCallImpl(
override val indexes = mutableListOf<FirExpression>() override val indexes = mutableListOf<FirExpression>()
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <D> transformRValue(transformer: FirTransformer<D>, data: D): FirAssignment {
super<FirArraySetCall>.accept(visitor, data) rValue = rValue.transformSingle(transformer, data)
return this
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
typeRef = typeRef.transformSingle(transformer, data)
indexes.transformInplace(transformer, data)
return super<FirAbstractAssignment>.transformChildren(transformer, data)
} }
override fun <D> transformArguments(transformer: FirTransformer<D>, data: D): FirCall { override fun <D> transformArguments(transformer: FirTransformer<D>, data: D): FirCall {
@@ -45,4 +48,13 @@ class FirArraySetCallImpl(
indexes.transformInplace(transformer, data) indexes.transformInplace(transformer, data)
return this return this
} }
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
calleeReference = calleeReference.transformSingle(transformer, data)
rValue = rValue.transformSingle(transformer, data)
typeRef = typeRef.transformSingle(transformer, data)
indexes.transformInplace(transformer, data)
return super<FirArraySetCall>.transformChildren(transformer, data)
}
} }
@@ -16,11 +16,11 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirBlockImpl( class FirBlockImpl(
session: FirSession, session: FirSession,
psi: PsiElement? psi: PsiElement?
) : FirAbstractBlock(session, psi), FirBlock { ) : FirBlock(session, psi) {
override val statements = mutableListOf<FirStatement>() override val statements = mutableListOf<FirStatement>()
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
statements.transformInplace(transformer, data) statements.transformInplace(transformer, data)
return super<FirAbstractBlock>.transformChildren(transformer, data) return super.transformChildren(transformer, data)
} }
} }
@@ -12,4 +12,4 @@ import org.jetbrains.kotlin.fir.expressions.FirBreakExpression
class FirBreakExpressionImpl( class FirBreakExpressionImpl(
session: FirSession, session: FirSession,
psi: PsiElement? psi: PsiElement?
) : FirAbstractLoopJump(session, psi), FirBreakExpression ) : FirBreakExpression(session, psi)
@@ -1,29 +1,32 @@
/* /*
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors. * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * 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.impl package org.jetbrains.kotlin.fir.expressions.impl
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirCall import org.jetbrains.kotlin.fir.expressions.FirCall
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.transformInplace
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
abstract class FirAbstractCall( abstract class FirCallWithArgumentList(
session: FirSession, session: FirSession,
psi: PsiElement? psi: PsiElement?
) : FirAbstractExpression(session, psi), FirCall { ) : FirCall(session, psi) {
final override val arguments = mutableListOf<FirExpression>() override val arguments = mutableListOf<FirExpression>()
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
arguments.transformInplace(transformer, data) arguments.transformInplace(transformer, data)
return super<FirAbstractExpression>.transformChildren(transformer, data) return super.transformChildren(transformer, data)
} }
override fun <D> transformArguments(transformer: FirTransformer<D>, data: D): FirCall { override fun <D> transformArguments(transformer: FirTransformer<D>, data: D): FirCall {
arguments.transformInplace(transformer, data) arguments.transformInplace(transformer, data)
return this return this
} }
} }
@@ -7,26 +7,25 @@ package org.jetbrains.kotlin.fir.expressions.impl
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirReference
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.transformSingle import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirCallableReferenceAccessImpl( class FirCallableReferenceAccessImpl(
session: FirSession, session: FirSession,
psi: PsiElement? psi: PsiElement?
) : FirAbstractQualifiedAccess(session, psi), FirCallableReferenceAccess { ) : FirCallableReferenceAccess(session, psi), FirModifiableQualifiedAccess<FirReference> {
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(session, null) override lateinit var calleeReference: FirReference
override fun replaceTypeRef(newTypeRef: FirTypeRef) { override var explicitReceiver: FirExpression? = null
typeRef = newTypeRef
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
typeRef = typeRef.transformSingle(transformer, data) calleeReference = calleeReference.transformSingle(transformer, data)
explicitReceiver = explicitReceiver?.transformSingle(transformer, data)
return super<FirAbstractQualifiedAccess>.transformChildren(transformer, data) return super<FirCallableReferenceAccess>.transformChildren(transformer, data)
} }
} }
@@ -17,9 +17,9 @@ class FirClassReferenceExpressionImpl(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
override var classTypeRef: FirTypeRef override var classTypeRef: FirTypeRef
) : FirAbstractExpression(session, psi), FirClassReferenceExpression { ) : FirClassReferenceExpression(session, psi) {
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
classTypeRef = classTypeRef.transformSingle(transformer, data) classTypeRef = classTypeRef.transformSingle(transformer, data)
return super<FirAbstractExpression>.transformChildren(transformer, data) return super.transformChildren(transformer, data)
} }
} }
@@ -15,7 +15,7 @@ class FirConstExpressionImpl<T>(
psi: PsiElement?, psi: PsiElement?,
override val kind: IrConstKind<T>, override val kind: IrConstKind<T>,
override val value: T override val value: T
) : FirAbstractExpression(session, psi), FirConstExpression<T> ) : FirConstExpression<T>(session, psi)
fun <T> FirConstExpressionImpl(session: FirSession, psi: PsiElement?, kind: IrConstKind<T>, value: T?, errorReason: String) = fun <T> FirConstExpressionImpl(session: FirSession, psi: PsiElement?, kind: IrConstKind<T>, value: T?, errorReason: String) =
value?.let { FirConstExpressionImpl(session, psi, kind, it) } ?: FirErrorExpressionImpl(session, psi, errorReason) value?.let { FirConstExpressionImpl(session, psi, kind, it) } ?: FirErrorExpressionImpl(session, psi, errorReason)
@@ -12,4 +12,4 @@ import org.jetbrains.kotlin.fir.expressions.FirContinueExpression
class FirContinueExpressionImpl( class FirContinueExpressionImpl(
session: FirSession, session: FirSession,
psi: PsiElement? psi: PsiElement?
) : FirAbstractLoopJump(session, psi), FirContinueExpression ) : FirContinueExpression(session, psi)
@@ -23,7 +23,7 @@ class FirDelegatedConstructorCallImpl(
psi: PsiElement?, psi: PsiElement?,
override var constructedTypeRef: FirTypeRef, override var constructedTypeRef: FirTypeRef,
override val isThis: Boolean override val isThis: Boolean
) : FirAbstractCall(session, psi), FirDelegatedConstructorCall { ) : FirDelegatedConstructorCall(session, psi) {
override var calleeReference: FirReference = override var calleeReference: FirReference =
if (isThis) FirExplicitThisReference(session, psi, null) else FirExplicitSuperReference(session, psi, constructedTypeRef) if (isThis) FirExplicitThisReference(session, psi, null) else FirExplicitSuperReference(session, psi, constructedTypeRef)
@@ -35,8 +35,9 @@ class FirDelegatedConstructorCallImpl(
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
constructedTypeRef = constructedTypeRef.transformSingle(transformer, data) constructedTypeRef = constructedTypeRef.transformSingle(transformer, data)
calleeReference = calleeReference.transformSingle(transformer, data) calleeReference = calleeReference.transformSingle(transformer, data)
typeRef = typeRef.transformSingle(transformer, data)
return super<FirAbstractCall>.transformChildren(transformer, data) return super.transformChildren(transformer, data)
} }
override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccess { override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccess {
@@ -44,4 +45,6 @@ class FirDelegatedConstructorCallImpl(
} }
override var typeRef: FirTypeRef = FirImplicitUnitTypeRef(session, psi) override var typeRef: FirTypeRef = FirImplicitUnitTypeRef(session, psi)
override fun replaceTypeRef(newTypeRef: FirTypeRef) {}
} }
@@ -6,15 +6,26 @@
package org.jetbrains.kotlin.fir.expressions.impl package org.jetbrains.kotlin.fir.expressions.impl
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.expressions.FirExpression
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitUnitTypeRef import org.jetbrains.kotlin.fir.types.impl.FirImplicitUnitTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer
// Representation of "dummy" condition at else branch // Representation of "dummy" condition at else branch
class FirElseIfTrueCondition( class FirElseIfTrueCondition(
session: FirSession, session: FirSession,
psi: PsiElement? psi: PsiElement?
) : FirAbstractExpression(session, psi) { ) : FirExpression(session, psi) {
override var typeRef: FirTypeRef = FirImplicitUnitTypeRef(session, psi) override var typeRef: FirTypeRef = FirImplicitUnitTypeRef(session, psi)
override fun replaceTypeRef(newTypeRef: FirTypeRef) {}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
typeRef = typeRef.transformSingle(transformer, data)
return super.transformChildren(transformer, data)
}
} }
@@ -11,6 +11,6 @@ import org.jetbrains.kotlin.fir.expressions.FirStatement
class FirEmptyExpressionBlock( class FirEmptyExpressionBlock(
session: FirSession session: FirSession
) : FirAbstractBlock(session, null), FirBlock { ) : FirBlock(session, null) {
override val statements: List<FirStatement> = listOf() override val statements: List<FirStatement> = listOf()
} }
@@ -13,4 +13,4 @@ class FirErrorExpressionImpl(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
override val reason: String override val reason: String
) : FirAbstractExpression(session, psi), FirErrorExpression ) : FirErrorExpression(session, psi)
@@ -7,9 +7,8 @@ package org.jetbrains.kotlin.fir.expressions.impl
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirExpression
class FirExpressionStub( class FirExpressionStub(
session: FirSession, session: FirSession,
psi: PsiElement? psi: PsiElement?
) : FirAbstractExpression(session, psi) ) : FirUnknownTypeExpression(session, psi)
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.fir.expressions.impl
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.expressions.FirCall
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess
@@ -18,7 +17,7 @@ class FirFunctionCallImpl(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
override var safe: Boolean = false override var safe: Boolean = false
) : FirFunctionCall(session, psi), FirModifiableQualifiedAccess { ) : FirFunctionCall(session, psi), FirModifiableQualifiedAccess<FirNamedReference> {
override val typeArguments = mutableListOf<FirTypeProjection>() override val typeArguments = mutableListOf<FirTypeProjection>()
override lateinit var calleeReference: FirNamedReference override lateinit var calleeReference: FirNamedReference
@@ -12,4 +12,4 @@ import org.jetbrains.kotlin.fir.expressions.FirGetClassCall
class FirGetClassCallImpl( class FirGetClassCallImpl(
session: FirSession, session: FirSession,
psi: PsiElement? psi: PsiElement?
) : FirAbstractCall(session, psi), FirGetClassCall ) : FirGetClassCall(session, psi)
@@ -6,18 +6,28 @@
package org.jetbrains.kotlin.fir.expressions.impl package org.jetbrains.kotlin.fir.expressions.impl
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.FirTarget import org.jetbrains.kotlin.fir.FirTarget
import org.jetbrains.kotlin.fir.expressions.FirJump import org.jetbrains.kotlin.fir.expressions.FirJump
import org.jetbrains.kotlin.fir.expressions.FirLoop import org.jetbrains.kotlin.fir.expressions.FirLoop
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitNothingTypeRef import org.jetbrains.kotlin.fir.types.impl.FirImplicitNothingTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer
abstract class FirAbstractLoopJump( abstract class FirLoopJump(
session: FirSession, session: FirSession,
psi: PsiElement? psi: PsiElement?
) : FirAbstractExpression(session, psi), FirJump<FirLoop> { ) : FirJump<FirLoop>(session, psi) {
override lateinit var target: FirTarget<FirLoop> override lateinit var target: FirTarget<FirLoop>
override var typeRef: FirTypeRef = FirImplicitNothingTypeRef(session, psi) override var typeRef: FirTypeRef = FirImplicitNothingTypeRef(session, psi)
override fun replaceTypeRef(newTypeRef: FirTypeRef) {}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
typeRef = typeRef.transformSingle(transformer, data)
return super.transformChildren(transformer, data)
}
} }
@@ -5,15 +5,28 @@
package org.jetbrains.kotlin.fir.expressions.impl package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.fir.FirReference
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.visitors.FirTransformer
interface FirModifiableQualifiedAccess<C : FirReference> : FirQualifiedAccess {
override var calleeReference: C
interface FirModifiableQualifiedAccess : FirQualifiedAccess {
override var safe: Boolean override var safe: Boolean
get() = super.safe get() = false
set(_) {} set(_) {}
override var explicitReceiver: FirExpression? override var explicitReceiver: FirExpression?
get() = super.explicitReceiver
set(_) {} override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirQualifiedAccess {
calleeReference = calleeReference.transformSingle(transformer, data)
return this
}
override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccess {
explicitReceiver = explicitReceiver?.transformSingle(transformer, data)
return this
}
} }
@@ -6,20 +6,33 @@
package org.jetbrains.kotlin.fir.expressions.impl package org.jetbrains.kotlin.fir.expressions.impl
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.expressions.FirOperation import org.jetbrains.kotlin.fir.expressions.FirOperation
import org.jetbrains.kotlin.fir.expressions.FirOperatorCall
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitBooleanTypeRef import org.jetbrains.kotlin.fir.types.impl.FirImplicitBooleanTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl
import org.jetbrains.kotlin.fir.visitors.FirTransformer
abstract class FirAbstractOperationBasedCall( abstract class FirOperationBasedCall(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
val operation: FirOperation final override val operation: FirOperation
) : FirAbstractCall(session, psi) { ) : FirOperatorCall(session, psi) {
override var typeRef: FirTypeRef = if (operation in FirOperation.BOOLEANS) { override var typeRef: FirTypeRef = if (operation in FirOperation.BOOLEANS) {
FirImplicitBooleanTypeRef(session, null) FirImplicitBooleanTypeRef(session, null)
} else { } else {
FirImplicitTypeRefImpl(session, null) FirImplicitTypeRefImpl(session, null)
} }
override fun replaceTypeRef(newTypeRef: FirTypeRef) {
typeRef = newTypeRef
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
typeRef = typeRef.transformSingle(transformer, data)
return super.transformChildren(transformer, data)
}
} }
@@ -8,10 +8,9 @@ package org.jetbrains.kotlin.fir.expressions.impl
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirOperation import org.jetbrains.kotlin.fir.expressions.FirOperation
import org.jetbrains.kotlin.fir.expressions.FirOperatorCall
class FirOperatorCallImpl( class FirOperatorCallImpl(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
operation: FirOperation operation: FirOperation
) : FirAbstractOperationBasedCall(session, psi, operation), FirOperatorCall ) : FirOperationBasedCall(session, psi, operation)
@@ -7,27 +7,26 @@ package org.jetbrains.kotlin.fir.expressions.impl
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirReference
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
import org.jetbrains.kotlin.fir.transformSingle import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirQualifiedAccessExpressionImpl( class FirQualifiedAccessExpressionImpl(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
safe: Boolean = false override var safe: Boolean = false
) : FirAbstractQualifiedAccess(session, psi, safe), FirQualifiedAccessExpression { ) : FirModifiableQualifiedAccess<FirReference>, FirQualifiedAccessExpression(session, psi) {
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(session, null) override lateinit var calleeReference: FirReference
override fun replaceTypeRef(newTypeRef: FirTypeRef) { override var explicitReceiver: FirExpression? = null
typeRef = newTypeRef
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
typeRef = typeRef.transformSingle(transformer, data) calleeReference = calleeReference.transformSingle(transformer, data)
explicitReceiver = explicitReceiver?.transformSingle(transformer, data)
return super<FirAbstractQualifiedAccess>.transformChildren(transformer, data) return super<FirQualifiedAccessExpression>.transformChildren(transformer, data)
} }
} }
@@ -16,7 +16,7 @@ class FirResolvedQualifierImpl(
psi: PsiElement?, psi: PsiElement?,
override val packageFqName: FqName, override val packageFqName: FqName,
override val relativeClassFqName: FqName? override val relativeClassFqName: FqName?
) : FirResolvedQualifier, FirAbstractExpression(session, psi) { ) : FirResolvedQualifier(session, psi) {
constructor(session: FirSession, psi: PsiElement?, classId: ClassId) : this( constructor(session: FirSession, psi: PsiElement?, classId: ClassId) : this(
session, session,
psi, psi,
@@ -12,20 +12,22 @@ import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirReturnExpression import org.jetbrains.kotlin.fir.expressions.FirReturnExpression
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitNothingTypeRef import org.jetbrains.kotlin.fir.types.impl.FirImplicitNothingTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitUnitTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirReturnExpressionImpl( class FirReturnExpressionImpl(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
override var result: FirExpression override var result: FirExpression
) : FirAbstractExpression(session, psi), FirReturnExpression { ) : FirReturnExpression(session, psi) {
override lateinit var target: FirTarget<FirFunction> override lateinit var target: FirTarget<FirFunction>
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
result = result.transformSingle(transformer, data) result = result.transformSingle(transformer, data)
return super<FirAbstractExpression>.transformChildren(transformer, data) typeRef = typeRef.transformSingle(transformer, data)
return super.transformChildren(transformer, data)
} }
override var typeRef: FirTypeRef = FirImplicitNothingTypeRef(session, psi) override var typeRef: FirTypeRef = FirImplicitNothingTypeRef(session, psi)
override fun replaceTypeRef(newTypeRef: FirTypeRef) {}
} }
@@ -15,12 +15,12 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirSingleExpressionBlock( class FirSingleExpressionBlock(
session: FirSession, session: FirSession,
private var statement: FirStatement private var statement: FirStatement
) : FirAbstractBlock(session, statement.psi), FirBlock { ) : FirBlock(session, statement.psi) {
override val statements override val statements
get() = listOf(statement) get() = listOf(statement)
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
statement = statement.transformSingle(transformer, data) statement = statement.transformSingle(transformer, data)
return super<FirAbstractBlock>.transformChildren(transformer, data) return super.transformChildren(transformer, data)
} }
} }
@@ -6,14 +6,24 @@
package org.jetbrains.kotlin.fir.expressions.impl package org.jetbrains.kotlin.fir.expressions.impl
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.expressions.FirStringConcatenationCall import org.jetbrains.kotlin.fir.expressions.FirStringConcatenationCall
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitStringTypeRef import org.jetbrains.kotlin.fir.types.impl.FirImplicitStringTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirStringConcatenationCallImpl( class FirStringConcatenationCallImpl(
session: FirSession, session: FirSession,
psi: PsiElement? psi: PsiElement?
) : FirAbstractCall(session, psi), FirStringConcatenationCall { ) : FirStringConcatenationCall(session, psi) {
override fun replaceTypeRef(newTypeRef: FirTypeRef) {}
override var typeRef: FirTypeRef = FirImplicitStringTypeRef(session, psi) override var typeRef: FirTypeRef = FirImplicitStringTypeRef(session, psi)
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
typeRef = typeRef.transformSingle(transformer, data)
return super.transformChildren(transformer, data)
}
} }
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.fir.expressions.impl package org.jetbrains.kotlin.fir.expressions.impl
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirAbstractElement
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
@@ -20,10 +19,13 @@ class FirThrowExpressionImpl(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
override var exception: FirExpression override var exception: FirExpression
) : FirAbstractExpression(session, psi), FirThrowExpression { ) : FirThrowExpression(session, psi) {
override fun replaceTypeRef(newTypeRef: FirTypeRef) {}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
exception = exception.transformSingle(transformer, data) exception = exception.transformSingle(transformer, data)
return super<FirAbstractExpression>.transformChildren(transformer, data) typeRef = typeRef.transformSingle(transformer, data)
return super.transformChildren(transformer, data)
} }
override var typeRef: FirTypeRef = FirImplicitNothingTypeRef(session, psi) override var typeRef: FirTypeRef = FirImplicitNothingTypeRef(session, psi)
@@ -6,10 +6,13 @@
package org.jetbrains.kotlin.fir.expressions.impl package org.jetbrains.kotlin.fir.expressions.impl
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.expressions.FirCatch import org.jetbrains.kotlin.fir.expressions.FirCatch
import org.jetbrains.kotlin.fir.expressions.FirTryExpression import org.jetbrains.kotlin.fir.expressions.FirTryExpression
import org.jetbrains.kotlin.fir.transformInplace
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirTryExpressionImpl( class FirTryExpressionImpl(
@@ -17,13 +20,13 @@ class FirTryExpressionImpl(
psi: PsiElement?, psi: PsiElement?,
override var tryBlock: FirBlock, override var tryBlock: FirBlock,
override var finallyBlock: FirBlock? override var finallyBlock: FirBlock?
) : FirAbstractExpression(session, psi), FirTryExpression { ) : FirTryExpression(session, psi) {
override val catches = mutableListOf<FirCatch>() override val catches = mutableListOf<FirCatch>()
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
tryBlock = tryBlock.transformSingle(transformer, data) tryBlock = tryBlock.transformSingle(transformer, data)
finallyBlock = finallyBlock?.transformSingle(transformer, data) finallyBlock = finallyBlock?.transformSingle(transformer, data)
catches.transformInplace(transformer, data) catches.transformInplace(transformer, data)
return super<FirAbstractExpression>.transformChildren(transformer, data) return super.transformChildren(transformer, data)
} }
} }
@@ -19,9 +19,9 @@ class FirTypeOperatorCallImpl(
psi: PsiElement?, psi: PsiElement?,
operation: FirOperation, operation: FirOperation,
override var conversionTypeRef: FirTypeRef override var conversionTypeRef: FirTypeRef
) : FirAbstractOperationBasedCall(session, psi, operation), FirTypeOperatorCall { ) : FirTypeOperatorCall(session, psi, operation) {
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
conversionTypeRef = conversionTypeRef.transformSingle(transformer, data) conversionTypeRef = conversionTypeRef.transformSingle(transformer, data)
return super<FirAbstractOperationBasedCall>.transformChildren(transformer, data) return super.transformChildren(transformer, data)
} }
} }
@@ -9,14 +9,12 @@ import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirUncheckedNotNullCast import org.jetbrains.kotlin.fir.expressions.FirUncheckedNotNullCast
import org.jetbrains.kotlin.fir.expressions.FirOperation
import org.jetbrains.kotlin.fir.types.FirTypeRef
class FirUncheckedNotNullCastImpl( class FirUncheckedNotNullCastImpl(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
expression: FirExpression expression: FirExpression
) : FirAbstractCall(session, psi), FirUncheckedNotNullCast { ) : FirUncheckedNotNullCast(session, psi) {
init { init {
arguments += expression arguments += expression
} }
@@ -6,13 +6,24 @@
package org.jetbrains.kotlin.fir.expressions.impl package org.jetbrains.kotlin.fir.expressions.impl
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.expressions.FirExpression
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitUnitTypeRef import org.jetbrains.kotlin.fir.types.impl.FirImplicitUnitTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirUnitExpression( class FirUnitExpression(
session: FirSession, session: FirSession,
psi: PsiElement? psi: PsiElement?
) : FirAbstractExpression(session, psi) { ) : FirExpression(session, psi) {
override fun replaceTypeRef(newTypeRef: FirTypeRef) {}
override var typeRef: FirTypeRef = FirImplicitUnitTypeRef(session, psi) override var typeRef: FirTypeRef = FirImplicitUnitTypeRef(session, psi)
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
typeRef = typeRef.transformSingle(transformer, data)
return super.transformChildren(transformer, data)
}
} }
@@ -8,16 +8,15 @@ package org.jetbrains.kotlin.fir.expressions.impl
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.transformSingle import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
abstract class FirAbstractBlock( abstract class FirUnknownTypeCallWithArgumentList(
session: FirSession, session: FirSession,
psi: PsiElement? psi: PsiElement?
) : FirAbstractAnnotatedElement(session, psi), FirBlock { ) : FirCallWithArgumentList(session, psi) {
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(session, null) override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(session, null)
override fun replaceTypeRef(newTypeRef: FirTypeRef) { override fun replaceTypeRef(newTypeRef: FirTypeRef) {
@@ -27,6 +26,6 @@ abstract class FirAbstractBlock(
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
typeRef = typeRef.transformSingle(transformer, data) typeRef = typeRef.transformSingle(transformer, data)
return super<FirAbstractAnnotatedElement>.transformChildren(transformer, data) return super.transformChildren(transformer, data)
} }
} }
@@ -10,24 +10,23 @@ import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.transformSingle import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
abstract class FirAbstractExpression( abstract class FirUnknownTypeExpression(
session: FirSession, session: FirSession,
psi: PsiElement? psi: PsiElement?
) : FirAbstractStatement(session, psi), FirExpression { ) : FirExpression(session, psi) {
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(session, null) final override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(session, null)
override fun replaceTypeRef(newTypeRef: FirTypeRef) { final override fun replaceTypeRef(newTypeRef: FirTypeRef) {
typeRef = newTypeRef typeRef = newTypeRef
} }
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
typeRef = typeRef.transformSingle(transformer, data) typeRef = typeRef.transformSingle(transformer, data)
return super<FirAbstractStatement>.transformChildren(transformer, data) return super.transformChildren(transformer, data)
} }
} }
@@ -18,7 +18,7 @@ class FirWhenExpressionImpl(
psiElement: PsiElement?, psiElement: PsiElement?,
override var subject: FirExpression? = null, override var subject: FirExpression? = null,
override var subjectVariable: FirVariable? = null override var subjectVariable: FirVariable? = null
) : FirAbstractExpression(session, psiElement), FirWhenExpression { ) : FirWhenExpression(session, psiElement) {
override val branches = mutableListOf<FirWhenBranch>() override val branches = mutableListOf<FirWhenBranch>()
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
@@ -28,6 +28,6 @@ class FirWhenExpressionImpl(
subject = subject?.transformSingle(transformer, data) subject = subject?.transformSingle(transformer, data)
} }
branches.transformInplace(transformer, data) branches.transformInplace(transformer, data)
return super<FirAbstractExpression>.transformChildren(transformer, data) return super.transformChildren(transformer, data)
} }
} }
@@ -14,4 +14,4 @@ class FirWhenSubjectExpressionImpl(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
override val whenSubject: FirWhenSubject override val whenSubject: FirWhenSubject
) : FirAbstractExpression(session, psi), FirWhenSubjectExpression ) : FirWhenSubjectExpression(session, psi)
@@ -172,52 +172,60 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformElement(statement, data) return transformElement(statement, data)
} }
open fun transformClass(klass: FirClass, data: D): CompositeTransformResult<FirStatement> { open fun transformAnnotatedStatement(annotatedStatement: FirAnnotatedStatement, data: D): CompositeTransformResult<FirStatement> {
return transformStatement(klass, data) return transformStatement(annotatedStatement, data)
}
open fun transformAnonymousObject(anonymousObject: FirAnonymousObject, data: D): CompositeTransformResult<FirStatement> {
return transformClass(anonymousObject, data)
}
open fun transformModifiableClass(modifiableClass: FirModifiableClass, data: D): CompositeTransformResult<FirStatement> {
return transformClass(modifiableClass, data)
}
open fun transformErrorStatement(errorStatement: FirErrorStatement, data: D): CompositeTransformResult<FirStatement> {
return transformStatement(errorStatement, data)
} }
open fun transformExpression(expression: FirExpression, data: D): CompositeTransformResult<FirStatement> { open fun transformExpression(expression: FirExpression, data: D): CompositeTransformResult<FirStatement> {
return transformStatement(expression, data) return transformAnnotatedStatement(expression, data)
}
open fun transformBlock(block: FirBlock, data: D): CompositeTransformResult<FirStatement> {
return transformExpression(block, data)
} }
open fun transformCall(call: FirCall, data: D): CompositeTransformResult<FirStatement> { open fun transformCall(call: FirCall, data: D): CompositeTransformResult<FirStatement> {
return transformExpression(call, data) return transformExpression(call, data)
} }
open fun transformAnnotationCall(annotationCall: FirAnnotationCall, data: D): CompositeTransformResult<FirStatement> {
return transformCall(annotationCall, data)
}
open fun transformArrayOfCall(arrayOfCall: FirArrayOfCall, data: D): CompositeTransformResult<FirStatement> {
return transformCall(arrayOfCall, data)
}
open fun transformArraySetCall(arraySetCall: FirArraySetCall, data: D): CompositeTransformResult<FirStatement> { open fun transformArraySetCall(arraySetCall: FirArraySetCall, data: D): CompositeTransformResult<FirStatement> {
return transformCall(arraySetCall, data) return transformCall(arraySetCall, data)
} }
open fun transformCallWithArgumentList(callWithArgumentList: FirCallWithArgumentList, data: D): CompositeTransformResult<FirStatement> {
return transformCall(callWithArgumentList, data)
}
open fun transformDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: D): CompositeTransformResult<FirStatement> { open fun transformDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: D): CompositeTransformResult<FirStatement> {
return transformCall(delegatedConstructorCall, data) return transformCallWithArgumentList(delegatedConstructorCall, data)
}
open fun transformOperatorCall(operatorCall: FirOperatorCall, data: D): CompositeTransformResult<FirStatement> {
return transformCallWithArgumentList(operatorCall, data)
}
open fun transformOperationBasedCall(operationBasedCall: FirOperationBasedCall, data: D): CompositeTransformResult<FirStatement> {
return transformOperatorCall(operationBasedCall, data)
}
open fun transformTypeOperatorCall(typeOperatorCall: FirTypeOperatorCall, data: D): CompositeTransformResult<FirStatement> {
return transformOperationBasedCall(typeOperatorCall, data)
}
open fun transformStringConcatenationCall(stringConcatenationCall: FirStringConcatenationCall, data: D): CompositeTransformResult<FirStatement> {
return transformCallWithArgumentList(stringConcatenationCall, data)
}
open fun transformUnknownTypeCallWithArgumentList(unknownTypeCallWithArgumentList: FirUnknownTypeCallWithArgumentList, data: D): CompositeTransformResult<FirStatement> {
return transformCallWithArgumentList(unknownTypeCallWithArgumentList, data)
}
open fun transformAnnotationCall(annotationCall: FirAnnotationCall, data: D): CompositeTransformResult<FirStatement> {
return transformUnknownTypeCallWithArgumentList(annotationCall, data)
}
open fun transformArrayOfCall(arrayOfCall: FirArrayOfCall, data: D): CompositeTransformResult<FirStatement> {
return transformUnknownTypeCallWithArgumentList(arrayOfCall, data)
} }
open fun transformFunctionCall(functionCall: FirFunctionCall, data: D): CompositeTransformResult<FirStatement> { open fun transformFunctionCall(functionCall: FirFunctionCall, data: D): CompositeTransformResult<FirStatement> {
return transformCall(functionCall, data) return transformUnknownTypeCallWithArgumentList(functionCall, data)
} }
open fun transformComponentCall(componentCall: FirComponentCall, data: D): CompositeTransformResult<FirStatement> { open fun transformComponentCall(componentCall: FirComponentCall, data: D): CompositeTransformResult<FirStatement> {
@@ -225,71 +233,79 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
} }
open fun transformGetClassCall(getClassCall: FirGetClassCall, data: D): CompositeTransformResult<FirStatement> { open fun transformGetClassCall(getClassCall: FirGetClassCall, data: D): CompositeTransformResult<FirStatement> {
return transformCall(getClassCall, data) return transformUnknownTypeCallWithArgumentList(getClassCall, data)
}
open fun transformOperatorCall(operatorCall: FirOperatorCall, data: D): CompositeTransformResult<FirStatement> {
return transformCall(operatorCall, data)
}
open fun transformTypeOperatorCall(typeOperatorCall: FirTypeOperatorCall, data: D): CompositeTransformResult<FirStatement> {
return transformOperatorCall(typeOperatorCall, data)
}
open fun transformStringConcatenationCall(stringConcatenationCall: FirStringConcatenationCall, data: D): CompositeTransformResult<FirStatement> {
return transformCall(stringConcatenationCall, data)
} }
open fun transformUncheckedNotNullCast(uncheckedNotNullCast: FirUncheckedNotNullCast, data: D): CompositeTransformResult<FirStatement> { open fun transformUncheckedNotNullCast(uncheckedNotNullCast: FirUncheckedNotNullCast, data: D): CompositeTransformResult<FirStatement> {
return transformCall(uncheckedNotNullCast, data) return transformUnknownTypeCallWithArgumentList(uncheckedNotNullCast, data)
}
open fun transformClassReferenceExpression(classReferenceExpression: FirClassReferenceExpression, data: D): CompositeTransformResult<FirStatement> {
return transformExpression(classReferenceExpression, data)
}
open fun <T> transformConstExpression(constExpression: FirConstExpression<T>, data: D): CompositeTransformResult<FirStatement> {
return transformExpression(constExpression, data)
}
open fun transformErrorExpression(errorExpression: FirErrorExpression, data: D): CompositeTransformResult<FirStatement> {
return transformExpression(errorExpression, data)
} }
open fun <E : FirTargetElement> transformJump(jump: FirJump<E>, data: D): CompositeTransformResult<FirStatement> { open fun <E : FirTargetElement> transformJump(jump: FirJump<E>, data: D): CompositeTransformResult<FirStatement> {
return transformExpression(jump, data) return transformExpression(jump, data)
} }
open fun transformLoopJump(loopJump: FirLoopJump, data: D): CompositeTransformResult<FirStatement> {
return transformJump(loopJump, data)
}
open fun transformBreakExpression(breakExpression: FirBreakExpression, data: D): CompositeTransformResult<FirStatement> { open fun transformBreakExpression(breakExpression: FirBreakExpression, data: D): CompositeTransformResult<FirStatement> {
return transformJump(breakExpression, data) return transformLoopJump(breakExpression, data)
} }
open fun transformContinueExpression(continueExpression: FirContinueExpression, data: D): CompositeTransformResult<FirStatement> { open fun transformContinueExpression(continueExpression: FirContinueExpression, data: D): CompositeTransformResult<FirStatement> {
return transformJump(continueExpression, data) return transformLoopJump(continueExpression, data)
} }
open fun transformReturnExpression(returnExpression: FirReturnExpression, data: D): CompositeTransformResult<FirStatement> { open fun transformReturnExpression(returnExpression: FirReturnExpression, data: D): CompositeTransformResult<FirStatement> {
return transformJump(returnExpression, data) return transformJump(returnExpression, data)
} }
open fun transformResolvedQualifier(resolvedQualifier: FirResolvedQualifier, data: D): CompositeTransformResult<FirStatement> {
return transformExpression(resolvedQualifier, data)
}
open fun transformThrowExpression(throwExpression: FirThrowExpression, data: D): CompositeTransformResult<FirStatement> { open fun transformThrowExpression(throwExpression: FirThrowExpression, data: D): CompositeTransformResult<FirStatement> {
return transformExpression(throwExpression, data) return transformExpression(throwExpression, data)
} }
open fun transformUnknownTypeExpression(unknownTypeExpression: FirUnknownTypeExpression, data: D): CompositeTransformResult<FirStatement> {
return transformExpression(unknownTypeExpression, data)
}
open fun transformBlock(block: FirBlock, data: D): CompositeTransformResult<FirStatement> {
return transformUnknownTypeExpression(block, data)
}
open fun transformClassReferenceExpression(classReferenceExpression: FirClassReferenceExpression, data: D): CompositeTransformResult<FirStatement> {
return transformUnknownTypeExpression(classReferenceExpression, data)
}
open fun <T> transformConstExpression(constExpression: FirConstExpression<T>, data: D): CompositeTransformResult<FirStatement> {
return transformUnknownTypeExpression(constExpression, data)
}
open fun transformErrorExpression(errorExpression: FirErrorExpression, data: D): CompositeTransformResult<FirStatement> {
return transformUnknownTypeExpression(errorExpression, data)
}
open fun transformQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression, data: D): CompositeTransformResult<FirStatement> {
return transformUnknownTypeExpression(qualifiedAccessExpression, data)
}
open fun transformCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess, data: D): CompositeTransformResult<FirStatement> {
return transformQualifiedAccessExpression(callableReferenceAccess, data)
}
open fun transformResolvedQualifier(resolvedQualifier: FirResolvedQualifier, data: D): CompositeTransformResult<FirStatement> {
return transformUnknownTypeExpression(resolvedQualifier, data)
}
open fun transformTryExpression(tryExpression: FirTryExpression, data: D): CompositeTransformResult<FirStatement> { open fun transformTryExpression(tryExpression: FirTryExpression, data: D): CompositeTransformResult<FirStatement> {
return transformExpression(tryExpression, data) return transformUnknownTypeExpression(tryExpression, data)
} }
open fun transformWhenExpression(whenExpression: FirWhenExpression, data: D): CompositeTransformResult<FirStatement> { open fun transformWhenExpression(whenExpression: FirWhenExpression, data: D): CompositeTransformResult<FirStatement> {
return transformExpression(whenExpression, data) return transformUnknownTypeExpression(whenExpression, data)
} }
open fun transformWhenSubjectExpression(whenSubjectExpression: FirWhenSubjectExpression, data: D): CompositeTransformResult<FirStatement> { open fun transformWhenSubjectExpression(whenSubjectExpression: FirWhenSubjectExpression, data: D): CompositeTransformResult<FirStatement> {
return transformExpression(whenSubjectExpression, data) return transformUnknownTypeExpression(whenSubjectExpression, data)
} }
open fun transformWrappedArgumentExpression(wrappedArgumentExpression: FirWrappedArgumentExpression, data: D): CompositeTransformResult<FirStatement> { open fun transformWrappedArgumentExpression(wrappedArgumentExpression: FirWrappedArgumentExpression, data: D): CompositeTransformResult<FirStatement> {
@@ -308,6 +324,22 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformWrappedArgumentExpression(spreadArgumentExpression, data) return transformWrappedArgumentExpression(spreadArgumentExpression, data)
} }
open fun transformClass(klass: FirClass, data: D): CompositeTransformResult<FirStatement> {
return transformStatement(klass, data)
}
open fun transformAnonymousObject(anonymousObject: FirAnonymousObject, data: D): CompositeTransformResult<FirStatement> {
return transformClass(anonymousObject, data)
}
open fun transformModifiableClass(modifiableClass: FirModifiableClass, data: D): CompositeTransformResult<FirStatement> {
return transformClass(modifiableClass, data)
}
open fun transformErrorStatement(errorStatement: FirErrorStatement, data: D): CompositeTransformResult<FirStatement> {
return transformStatement(errorStatement, data)
}
open fun transformLoop(loop: FirLoop, data: D): CompositeTransformResult<FirStatement> { open fun transformLoop(loop: FirLoop, data: D): CompositeTransformResult<FirStatement> {
return transformStatement(loop, data) return transformStatement(loop, data)
} }
@@ -332,18 +364,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformAssignment(variableAssignment, data) return transformAssignment(variableAssignment, data)
} }
open fun transformModifiableQualifiedAccess(modifiableQualifiedAccess: FirModifiableQualifiedAccess, data: D): CompositeTransformResult<FirStatement> { open fun <C : FirReference> transformModifiableQualifiedAccess(modifiableQualifiedAccess: FirModifiableQualifiedAccess<C>, data: D): CompositeTransformResult<FirStatement> {
return transformQualifiedAccess(modifiableQualifiedAccess, data) return transformQualifiedAccess(modifiableQualifiedAccess, data)
} }
open fun transformQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression, data: D): CompositeTransformResult<FirStatement> {
return transformQualifiedAccess(qualifiedAccessExpression, data)
}
open fun transformCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess, data: D): CompositeTransformResult<FirStatement> {
return transformQualifiedAccessExpression(callableReferenceAccess, data)
}
open fun <E : FirElement> transformTargetElement(targetElement: E, data: D): CompositeTransformResult<E> { open fun <E : FirElement> transformTargetElement(targetElement: E, data: D): CompositeTransformResult<E> {
return transformElement(targetElement, data) return transformElement(targetElement, data)
} }
@@ -408,6 +432,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformElement(whenBranch, data) return transformElement(whenBranch, data)
} }
final override fun visitAnnotatedStatement(annotatedStatement: FirAnnotatedStatement, data: D): CompositeTransformResult<FirElement> {
return transformAnnotatedStatement(annotatedStatement, data)
}
final override fun visitAnnotationCall(annotationCall: FirAnnotationCall, data: D): CompositeTransformResult<FirElement> { final override fun visitAnnotationCall(annotationCall: FirAnnotationCall, data: D): CompositeTransformResult<FirElement> {
return transformAnnotationCall(annotationCall, data) return transformAnnotationCall(annotationCall, data)
} }
@@ -448,6 +476,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformCall(call, data) return transformCall(call, data)
} }
final override fun visitCallWithArgumentList(callWithArgumentList: FirCallWithArgumentList, data: D): CompositeTransformResult<FirElement> {
return transformCallWithArgumentList(callWithArgumentList, data)
}
final override fun visitCallableDeclaration(callableDeclaration: FirCallableDeclaration, data: D): CompositeTransformResult<FirElement> { final override fun visitCallableDeclaration(callableDeclaration: FirCallableDeclaration, data: D): CompositeTransformResult<FirElement> {
return transformCallableDeclaration(callableDeclaration, data) return transformCallableDeclaration(callableDeclaration, data)
} }
@@ -600,6 +632,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformLoop(loop, data) return transformLoop(loop, data)
} }
final override fun visitLoopJump(loopJump: FirLoopJump, data: D): CompositeTransformResult<FirElement> {
return transformLoopJump(loopJump, data)
}
final override fun visitMemberDeclaration(memberDeclaration: FirMemberDeclaration, data: D): CompositeTransformResult<FirElement> { final override fun visitMemberDeclaration(memberDeclaration: FirMemberDeclaration, data: D): CompositeTransformResult<FirElement> {
return transformMemberDeclaration(memberDeclaration, data) return transformMemberDeclaration(memberDeclaration, data)
} }
@@ -612,7 +648,7 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformModifiableFunction(modifiableFunction, data) return transformModifiableFunction(modifiableFunction, data)
} }
final override fun visitModifiableQualifiedAccess(modifiableQualifiedAccess: FirModifiableQualifiedAccess, data: D): CompositeTransformResult<FirElement> { final override fun <C : FirReference> visitModifiableQualifiedAccess(modifiableQualifiedAccess: FirModifiableQualifiedAccess<C>, data: D): CompositeTransformResult<FirElement> {
return transformModifiableQualifiedAccess(modifiableQualifiedAccess, data) return transformModifiableQualifiedAccess(modifiableQualifiedAccess, data)
} }
@@ -632,6 +668,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformNamedReference(namedReference, data) return transformNamedReference(namedReference, data)
} }
final override fun visitOperationBasedCall(operationBasedCall: FirOperationBasedCall, data: D): CompositeTransformResult<FirElement> {
return transformOperationBasedCall(operationBasedCall, data)
}
final override fun visitOperatorCall(operatorCall: FirOperatorCall, data: D): CompositeTransformResult<FirElement> { final override fun visitOperatorCall(operatorCall: FirOperatorCall, data: D): CompositeTransformResult<FirElement> {
return transformOperatorCall(operatorCall, data) return transformOperatorCall(operatorCall, data)
} }
@@ -764,6 +804,14 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformUncheckedNotNullCast(uncheckedNotNullCast, data) return transformUncheckedNotNullCast(uncheckedNotNullCast, data)
} }
final override fun visitUnknownTypeCallWithArgumentList(unknownTypeCallWithArgumentList: FirUnknownTypeCallWithArgumentList, data: D): CompositeTransformResult<FirElement> {
return transformUnknownTypeCallWithArgumentList(unknownTypeCallWithArgumentList, data)
}
final override fun visitUnknownTypeExpression(unknownTypeExpression: FirUnknownTypeExpression, data: D): CompositeTransformResult<FirElement> {
return transformUnknownTypeExpression(unknownTypeExpression, data)
}
final override fun visitUserTypeRef(userTypeRef: FirUserTypeRef, data: D): CompositeTransformResult<FirElement> { final override fun visitUserTypeRef(userTypeRef: FirUserTypeRef, data: D): CompositeTransformResult<FirElement> {
return transformUserTypeRef(userTypeRef, data) return transformUserTypeRef(userTypeRef, data)
} }
@@ -172,52 +172,60 @@ abstract class FirVisitor<out R, in D> {
return visitElement(statement, data) return visitElement(statement, data)
} }
open fun visitClass(klass: FirClass, data: D): R { open fun visitAnnotatedStatement(annotatedStatement: FirAnnotatedStatement, data: D): R {
return visitStatement(klass, data) return visitStatement(annotatedStatement, data)
}
open fun visitAnonymousObject(anonymousObject: FirAnonymousObject, data: D): R {
return visitClass(anonymousObject, data)
}
open fun visitModifiableClass(modifiableClass: FirModifiableClass, data: D): R {
return visitClass(modifiableClass, data)
}
open fun visitErrorStatement(errorStatement: FirErrorStatement, data: D): R {
return visitStatement(errorStatement, data)
} }
open fun visitExpression(expression: FirExpression, data: D): R { open fun visitExpression(expression: FirExpression, data: D): R {
return visitStatement(expression, data) return visitAnnotatedStatement(expression, data)
}
open fun visitBlock(block: FirBlock, data: D): R {
return visitExpression(block, data)
} }
open fun visitCall(call: FirCall, data: D): R { open fun visitCall(call: FirCall, data: D): R {
return visitExpression(call, data) return visitExpression(call, data)
} }
open fun visitAnnotationCall(annotationCall: FirAnnotationCall, data: D): R {
return visitCall(annotationCall, data)
}
open fun visitArrayOfCall(arrayOfCall: FirArrayOfCall, data: D): R {
return visitCall(arrayOfCall, data)
}
open fun visitArraySetCall(arraySetCall: FirArraySetCall, data: D): R { open fun visitArraySetCall(arraySetCall: FirArraySetCall, data: D): R {
return visitCall(arraySetCall, data) return visitCall(arraySetCall, data)
} }
open fun visitCallWithArgumentList(callWithArgumentList: FirCallWithArgumentList, data: D): R {
return visitCall(callWithArgumentList, data)
}
open fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: D): R { open fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: D): R {
return visitCall(delegatedConstructorCall, data) return visitCallWithArgumentList(delegatedConstructorCall, data)
}
open fun visitOperatorCall(operatorCall: FirOperatorCall, data: D): R {
return visitCallWithArgumentList(operatorCall, data)
}
open fun visitOperationBasedCall(operationBasedCall: FirOperationBasedCall, data: D): R {
return visitOperatorCall(operationBasedCall, data)
}
open fun visitTypeOperatorCall(typeOperatorCall: FirTypeOperatorCall, data: D): R {
return visitOperationBasedCall(typeOperatorCall, data)
}
open fun visitStringConcatenationCall(stringConcatenationCall: FirStringConcatenationCall, data: D): R {
return visitCallWithArgumentList(stringConcatenationCall, data)
}
open fun visitUnknownTypeCallWithArgumentList(unknownTypeCallWithArgumentList: FirUnknownTypeCallWithArgumentList, data: D): R {
return visitCallWithArgumentList(unknownTypeCallWithArgumentList, data)
}
open fun visitAnnotationCall(annotationCall: FirAnnotationCall, data: D): R {
return visitUnknownTypeCallWithArgumentList(annotationCall, data)
}
open fun visitArrayOfCall(arrayOfCall: FirArrayOfCall, data: D): R {
return visitUnknownTypeCallWithArgumentList(arrayOfCall, data)
} }
open fun visitFunctionCall(functionCall: FirFunctionCall, data: D): R { open fun visitFunctionCall(functionCall: FirFunctionCall, data: D): R {
return visitCall(functionCall, data) return visitUnknownTypeCallWithArgumentList(functionCall, data)
} }
open fun visitComponentCall(componentCall: FirComponentCall, data: D): R { open fun visitComponentCall(componentCall: FirComponentCall, data: D): R {
@@ -225,71 +233,79 @@ abstract class FirVisitor<out R, in D> {
} }
open fun visitGetClassCall(getClassCall: FirGetClassCall, data: D): R { open fun visitGetClassCall(getClassCall: FirGetClassCall, data: D): R {
return visitCall(getClassCall, data) return visitUnknownTypeCallWithArgumentList(getClassCall, data)
}
open fun visitOperatorCall(operatorCall: FirOperatorCall, data: D): R {
return visitCall(operatorCall, data)
}
open fun visitTypeOperatorCall(typeOperatorCall: FirTypeOperatorCall, data: D): R {
return visitOperatorCall(typeOperatorCall, data)
}
open fun visitStringConcatenationCall(stringConcatenationCall: FirStringConcatenationCall, data: D): R {
return visitCall(stringConcatenationCall, data)
} }
open fun visitUncheckedNotNullCast(uncheckedNotNullCast: FirUncheckedNotNullCast, data: D): R { open fun visitUncheckedNotNullCast(uncheckedNotNullCast: FirUncheckedNotNullCast, data: D): R {
return visitCall(uncheckedNotNullCast, data) return visitUnknownTypeCallWithArgumentList(uncheckedNotNullCast, data)
}
open fun visitClassReferenceExpression(classReferenceExpression: FirClassReferenceExpression, data: D): R {
return visitExpression(classReferenceExpression, data)
}
open fun <T> visitConstExpression(constExpression: FirConstExpression<T>, data: D): R {
return visitExpression(constExpression, data)
}
open fun visitErrorExpression(errorExpression: FirErrorExpression, data: D): R {
return visitExpression(errorExpression, data)
} }
open fun <E : FirTargetElement> visitJump(jump: FirJump<E>, data: D): R { open fun <E : FirTargetElement> visitJump(jump: FirJump<E>, data: D): R {
return visitExpression(jump, data) return visitExpression(jump, data)
} }
open fun visitLoopJump(loopJump: FirLoopJump, data: D): R {
return visitJump(loopJump, data)
}
open fun visitBreakExpression(breakExpression: FirBreakExpression, data: D): R { open fun visitBreakExpression(breakExpression: FirBreakExpression, data: D): R {
return visitJump(breakExpression, data) return visitLoopJump(breakExpression, data)
} }
open fun visitContinueExpression(continueExpression: FirContinueExpression, data: D): R { open fun visitContinueExpression(continueExpression: FirContinueExpression, data: D): R {
return visitJump(continueExpression, data) return visitLoopJump(continueExpression, data)
} }
open fun visitReturnExpression(returnExpression: FirReturnExpression, data: D): R { open fun visitReturnExpression(returnExpression: FirReturnExpression, data: D): R {
return visitJump(returnExpression, data) return visitJump(returnExpression, data)
} }
open fun visitResolvedQualifier(resolvedQualifier: FirResolvedQualifier, data: D): R {
return visitExpression(resolvedQualifier, data)
}
open fun visitThrowExpression(throwExpression: FirThrowExpression, data: D): R { open fun visitThrowExpression(throwExpression: FirThrowExpression, data: D): R {
return visitExpression(throwExpression, data) return visitExpression(throwExpression, data)
} }
open fun visitUnknownTypeExpression(unknownTypeExpression: FirUnknownTypeExpression, data: D): R {
return visitExpression(unknownTypeExpression, data)
}
open fun visitBlock(block: FirBlock, data: D): R {
return visitUnknownTypeExpression(block, data)
}
open fun visitClassReferenceExpression(classReferenceExpression: FirClassReferenceExpression, data: D): R {
return visitUnknownTypeExpression(classReferenceExpression, data)
}
open fun <T> visitConstExpression(constExpression: FirConstExpression<T>, data: D): R {
return visitUnknownTypeExpression(constExpression, data)
}
open fun visitErrorExpression(errorExpression: FirErrorExpression, data: D): R {
return visitUnknownTypeExpression(errorExpression, data)
}
open fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression, data: D): R {
return visitUnknownTypeExpression(qualifiedAccessExpression, data)
}
open fun visitCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess, data: D): R {
return visitQualifiedAccessExpression(callableReferenceAccess, data)
}
open fun visitResolvedQualifier(resolvedQualifier: FirResolvedQualifier, data: D): R {
return visitUnknownTypeExpression(resolvedQualifier, data)
}
open fun visitTryExpression(tryExpression: FirTryExpression, data: D): R { open fun visitTryExpression(tryExpression: FirTryExpression, data: D): R {
return visitExpression(tryExpression, data) return visitUnknownTypeExpression(tryExpression, data)
} }
open fun visitWhenExpression(whenExpression: FirWhenExpression, data: D): R { open fun visitWhenExpression(whenExpression: FirWhenExpression, data: D): R {
return visitExpression(whenExpression, data) return visitUnknownTypeExpression(whenExpression, data)
} }
open fun visitWhenSubjectExpression(whenSubjectExpression: FirWhenSubjectExpression, data: D): R { open fun visitWhenSubjectExpression(whenSubjectExpression: FirWhenSubjectExpression, data: D): R {
return visitExpression(whenSubjectExpression, data) return visitUnknownTypeExpression(whenSubjectExpression, data)
} }
open fun visitWrappedArgumentExpression(wrappedArgumentExpression: FirWrappedArgumentExpression, data: D): R { open fun visitWrappedArgumentExpression(wrappedArgumentExpression: FirWrappedArgumentExpression, data: D): R {
@@ -308,6 +324,22 @@ abstract class FirVisitor<out R, in D> {
return visitWrappedArgumentExpression(spreadArgumentExpression, data) return visitWrappedArgumentExpression(spreadArgumentExpression, data)
} }
open fun visitClass(klass: FirClass, data: D): R {
return visitStatement(klass, data)
}
open fun visitAnonymousObject(anonymousObject: FirAnonymousObject, data: D): R {
return visitClass(anonymousObject, data)
}
open fun visitModifiableClass(modifiableClass: FirModifiableClass, data: D): R {
return visitClass(modifiableClass, data)
}
open fun visitErrorStatement(errorStatement: FirErrorStatement, data: D): R {
return visitStatement(errorStatement, data)
}
open fun visitLoop(loop: FirLoop, data: D): R { open fun visitLoop(loop: FirLoop, data: D): R {
return visitStatement(loop, data) return visitStatement(loop, data)
} }
@@ -332,18 +364,10 @@ abstract class FirVisitor<out R, in D> {
return visitAssignment(variableAssignment, data) return visitAssignment(variableAssignment, data)
} }
open fun visitModifiableQualifiedAccess(modifiableQualifiedAccess: FirModifiableQualifiedAccess, data: D): R { open fun <C : FirReference> visitModifiableQualifiedAccess(modifiableQualifiedAccess: FirModifiableQualifiedAccess<C>, data: D): R {
return visitQualifiedAccess(modifiableQualifiedAccess, data) return visitQualifiedAccess(modifiableQualifiedAccess, data)
} }
open fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression, data: D): R {
return visitQualifiedAccess(qualifiedAccessExpression, data)
}
open fun visitCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess, data: D): R {
return visitQualifiedAccessExpression(callableReferenceAccess, data)
}
open fun visitTargetElement(targetElement: FirTargetElement, data: D): R { open fun visitTargetElement(targetElement: FirTargetElement, data: D): R {
return visitElement(targetElement, data) return visitElement(targetElement, data)
} }
@@ -172,52 +172,60 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(statement, null) visitElement(statement, null)
} }
open fun visitClass(klass: FirClass) { open fun visitAnnotatedStatement(annotatedStatement: FirAnnotatedStatement) {
visitStatement(klass, null) visitStatement(annotatedStatement, null)
}
open fun visitAnonymousObject(anonymousObject: FirAnonymousObject) {
visitClass(anonymousObject, null)
}
open fun visitModifiableClass(modifiableClass: FirModifiableClass) {
visitClass(modifiableClass, null)
}
open fun visitErrorStatement(errorStatement: FirErrorStatement) {
visitStatement(errorStatement, null)
} }
open fun visitExpression(expression: FirExpression) { open fun visitExpression(expression: FirExpression) {
visitStatement(expression, null) visitAnnotatedStatement(expression, null)
}
open fun visitBlock(block: FirBlock) {
visitExpression(block, null)
} }
open fun visitCall(call: FirCall) { open fun visitCall(call: FirCall) {
visitExpression(call, null) visitExpression(call, null)
} }
open fun visitAnnotationCall(annotationCall: FirAnnotationCall) {
visitCall(annotationCall, null)
}
open fun visitArrayOfCall(arrayOfCall: FirArrayOfCall) {
visitCall(arrayOfCall, null)
}
open fun visitArraySetCall(arraySetCall: FirArraySetCall) { open fun visitArraySetCall(arraySetCall: FirArraySetCall) {
visitCall(arraySetCall, null) visitCall(arraySetCall, null)
} }
open fun visitCallWithArgumentList(callWithArgumentList: FirCallWithArgumentList) {
visitCall(callWithArgumentList, null)
}
open fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall) { open fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall) {
visitCall(delegatedConstructorCall, null) visitCallWithArgumentList(delegatedConstructorCall, null)
}
open fun visitOperatorCall(operatorCall: FirOperatorCall) {
visitCallWithArgumentList(operatorCall, null)
}
open fun visitOperationBasedCall(operationBasedCall: FirOperationBasedCall) {
visitOperatorCall(operationBasedCall, null)
}
open fun visitTypeOperatorCall(typeOperatorCall: FirTypeOperatorCall) {
visitOperationBasedCall(typeOperatorCall, null)
}
open fun visitStringConcatenationCall(stringConcatenationCall: FirStringConcatenationCall) {
visitCallWithArgumentList(stringConcatenationCall, null)
}
open fun visitUnknownTypeCallWithArgumentList(unknownTypeCallWithArgumentList: FirUnknownTypeCallWithArgumentList) {
visitCallWithArgumentList(unknownTypeCallWithArgumentList, null)
}
open fun visitAnnotationCall(annotationCall: FirAnnotationCall) {
visitUnknownTypeCallWithArgumentList(annotationCall, null)
}
open fun visitArrayOfCall(arrayOfCall: FirArrayOfCall) {
visitUnknownTypeCallWithArgumentList(arrayOfCall, null)
} }
open fun visitFunctionCall(functionCall: FirFunctionCall) { open fun visitFunctionCall(functionCall: FirFunctionCall) {
visitCall(functionCall, null) visitUnknownTypeCallWithArgumentList(functionCall, null)
} }
open fun visitComponentCall(componentCall: FirComponentCall) { open fun visitComponentCall(componentCall: FirComponentCall) {
@@ -225,71 +233,79 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
} }
open fun visitGetClassCall(getClassCall: FirGetClassCall) { open fun visitGetClassCall(getClassCall: FirGetClassCall) {
visitCall(getClassCall, null) visitUnknownTypeCallWithArgumentList(getClassCall, null)
}
open fun visitOperatorCall(operatorCall: FirOperatorCall) {
visitCall(operatorCall, null)
}
open fun visitTypeOperatorCall(typeOperatorCall: FirTypeOperatorCall) {
visitOperatorCall(typeOperatorCall, null)
}
open fun visitStringConcatenationCall(stringConcatenationCall: FirStringConcatenationCall) {
visitCall(stringConcatenationCall, null)
} }
open fun visitUncheckedNotNullCast(uncheckedNotNullCast: FirUncheckedNotNullCast) { open fun visitUncheckedNotNullCast(uncheckedNotNullCast: FirUncheckedNotNullCast) {
visitCall(uncheckedNotNullCast, null) visitUnknownTypeCallWithArgumentList(uncheckedNotNullCast, null)
}
open fun visitClassReferenceExpression(classReferenceExpression: FirClassReferenceExpression) {
visitExpression(classReferenceExpression, null)
}
open fun <T> visitConstExpression(constExpression: FirConstExpression<T>) {
visitExpression(constExpression, null)
}
open fun visitErrorExpression(errorExpression: FirErrorExpression) {
visitExpression(errorExpression, null)
} }
open fun <E : FirTargetElement> visitJump(jump: FirJump<E>) { open fun <E : FirTargetElement> visitJump(jump: FirJump<E>) {
visitExpression(jump, null) visitExpression(jump, null)
} }
open fun visitLoopJump(loopJump: FirLoopJump) {
visitJump(loopJump, null)
}
open fun visitBreakExpression(breakExpression: FirBreakExpression) { open fun visitBreakExpression(breakExpression: FirBreakExpression) {
visitJump(breakExpression, null) visitLoopJump(breakExpression, null)
} }
open fun visitContinueExpression(continueExpression: FirContinueExpression) { open fun visitContinueExpression(continueExpression: FirContinueExpression) {
visitJump(continueExpression, null) visitLoopJump(continueExpression, null)
} }
open fun visitReturnExpression(returnExpression: FirReturnExpression) { open fun visitReturnExpression(returnExpression: FirReturnExpression) {
visitJump(returnExpression, null) visitJump(returnExpression, null)
} }
open fun visitResolvedQualifier(resolvedQualifier: FirResolvedQualifier) {
visitExpression(resolvedQualifier, null)
}
open fun visitThrowExpression(throwExpression: FirThrowExpression) { open fun visitThrowExpression(throwExpression: FirThrowExpression) {
visitExpression(throwExpression, null) visitExpression(throwExpression, null)
} }
open fun visitUnknownTypeExpression(unknownTypeExpression: FirUnknownTypeExpression) {
visitExpression(unknownTypeExpression, null)
}
open fun visitBlock(block: FirBlock) {
visitUnknownTypeExpression(block, null)
}
open fun visitClassReferenceExpression(classReferenceExpression: FirClassReferenceExpression) {
visitUnknownTypeExpression(classReferenceExpression, null)
}
open fun <T> visitConstExpression(constExpression: FirConstExpression<T>) {
visitUnknownTypeExpression(constExpression, null)
}
open fun visitErrorExpression(errorExpression: FirErrorExpression) {
visitUnknownTypeExpression(errorExpression, null)
}
open fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression) {
visitUnknownTypeExpression(qualifiedAccessExpression, null)
}
open fun visitCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess) {
visitQualifiedAccessExpression(callableReferenceAccess, null)
}
open fun visitResolvedQualifier(resolvedQualifier: FirResolvedQualifier) {
visitUnknownTypeExpression(resolvedQualifier, null)
}
open fun visitTryExpression(tryExpression: FirTryExpression) { open fun visitTryExpression(tryExpression: FirTryExpression) {
visitExpression(tryExpression, null) visitUnknownTypeExpression(tryExpression, null)
} }
open fun visitWhenExpression(whenExpression: FirWhenExpression) { open fun visitWhenExpression(whenExpression: FirWhenExpression) {
visitExpression(whenExpression, null) visitUnknownTypeExpression(whenExpression, null)
} }
open fun visitWhenSubjectExpression(whenSubjectExpression: FirWhenSubjectExpression) { open fun visitWhenSubjectExpression(whenSubjectExpression: FirWhenSubjectExpression) {
visitExpression(whenSubjectExpression, null) visitUnknownTypeExpression(whenSubjectExpression, null)
} }
open fun visitWrappedArgumentExpression(wrappedArgumentExpression: FirWrappedArgumentExpression) { open fun visitWrappedArgumentExpression(wrappedArgumentExpression: FirWrappedArgumentExpression) {
@@ -308,6 +324,22 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitWrappedArgumentExpression(spreadArgumentExpression, null) visitWrappedArgumentExpression(spreadArgumentExpression, null)
} }
open fun visitClass(klass: FirClass) {
visitStatement(klass, null)
}
open fun visitAnonymousObject(anonymousObject: FirAnonymousObject) {
visitClass(anonymousObject, null)
}
open fun visitModifiableClass(modifiableClass: FirModifiableClass) {
visitClass(modifiableClass, null)
}
open fun visitErrorStatement(errorStatement: FirErrorStatement) {
visitStatement(errorStatement, null)
}
open fun visitLoop(loop: FirLoop) { open fun visitLoop(loop: FirLoop) {
visitStatement(loop, null) visitStatement(loop, null)
} }
@@ -332,18 +364,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitAssignment(variableAssignment, null) visitAssignment(variableAssignment, null)
} }
open fun visitModifiableQualifiedAccess(modifiableQualifiedAccess: FirModifiableQualifiedAccess) { open fun <C : FirReference> visitModifiableQualifiedAccess(modifiableQualifiedAccess: FirModifiableQualifiedAccess<C>) {
visitQualifiedAccess(modifiableQualifiedAccess, null) visitQualifiedAccess(modifiableQualifiedAccess, null)
} }
open fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression) {
visitQualifiedAccess(qualifiedAccessExpression, null)
}
open fun visitCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess) {
visitQualifiedAccessExpression(callableReferenceAccess, null)
}
open fun visitTargetElement(targetElement: FirTargetElement) { open fun visitTargetElement(targetElement: FirTargetElement) {
visitElement(targetElement, null) visitElement(targetElement, null)
} }
@@ -408,6 +432,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(whenBranch, null) visitElement(whenBranch, null)
} }
final override fun visitAnnotatedStatement(annotatedStatement: FirAnnotatedStatement, data: Nothing?) {
visitAnnotatedStatement(annotatedStatement)
}
final override fun visitAnnotationCall(annotationCall: FirAnnotationCall, data: Nothing?) { final override fun visitAnnotationCall(annotationCall: FirAnnotationCall, data: Nothing?) {
visitAnnotationCall(annotationCall) visitAnnotationCall(annotationCall)
} }
@@ -448,6 +476,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitCall(call) visitCall(call)
} }
final override fun visitCallWithArgumentList(callWithArgumentList: FirCallWithArgumentList, data: Nothing?) {
visitCallWithArgumentList(callWithArgumentList)
}
final override fun visitCallableDeclaration(callableDeclaration: FirCallableDeclaration, data: Nothing?) { final override fun visitCallableDeclaration(callableDeclaration: FirCallableDeclaration, data: Nothing?) {
visitCallableDeclaration(callableDeclaration) visitCallableDeclaration(callableDeclaration)
} }
@@ -600,6 +632,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitLoop(loop) visitLoop(loop)
} }
final override fun visitLoopJump(loopJump: FirLoopJump, data: Nothing?) {
visitLoopJump(loopJump)
}
final override fun visitMemberDeclaration(memberDeclaration: FirMemberDeclaration, data: Nothing?) { final override fun visitMemberDeclaration(memberDeclaration: FirMemberDeclaration, data: Nothing?) {
visitMemberDeclaration(memberDeclaration) visitMemberDeclaration(memberDeclaration)
} }
@@ -612,7 +648,7 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitModifiableFunction(modifiableFunction) visitModifiableFunction(modifiableFunction)
} }
final override fun visitModifiableQualifiedAccess(modifiableQualifiedAccess: FirModifiableQualifiedAccess, data: Nothing?) { final override fun <C : FirReference> visitModifiableQualifiedAccess(modifiableQualifiedAccess: FirModifiableQualifiedAccess<C>, data: Nothing?) {
visitModifiableQualifiedAccess(modifiableQualifiedAccess) visitModifiableQualifiedAccess(modifiableQualifiedAccess)
} }
@@ -632,6 +668,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitNamedReference(namedReference) visitNamedReference(namedReference)
} }
final override fun visitOperationBasedCall(operationBasedCall: FirOperationBasedCall, data: Nothing?) {
visitOperationBasedCall(operationBasedCall)
}
final override fun visitOperatorCall(operatorCall: FirOperatorCall, data: Nothing?) { final override fun visitOperatorCall(operatorCall: FirOperatorCall, data: Nothing?) {
visitOperatorCall(operatorCall) visitOperatorCall(operatorCall)
} }
@@ -764,6 +804,14 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitUncheckedNotNullCast(uncheckedNotNullCast) visitUncheckedNotNullCast(uncheckedNotNullCast)
} }
final override fun visitUnknownTypeCallWithArgumentList(unknownTypeCallWithArgumentList: FirUnknownTypeCallWithArgumentList, data: Nothing?) {
visitUnknownTypeCallWithArgumentList(unknownTypeCallWithArgumentList)
}
final override fun visitUnknownTypeExpression(unknownTypeExpression: FirUnknownTypeExpression, data: Nothing?) {
visitUnknownTypeExpression(unknownTypeExpression)
}
final override fun visitUserTypeRef(userTypeRef: FirUserTypeRef, data: Nothing?) { final override fun visitUserTypeRef(userTypeRef: FirUserTypeRef, data: Nothing?) {
visitUserTypeRef(userTypeRef) visitUserTypeRef(userTypeRef)
} }