FIR expressions: perform some names refactoring

FirAccess -> FirQualifiedAccess
FirAccessExpression -> FirQualifiedExpression
FirPropertyAssignment -> FirVariableAssignment
Introduce lValue & rValue in FirAssignment
Introduce separate indexes in FirArraySetCall
This commit is contained in:
Mikhail Glukhikh
2019-02-05 19:24:35 +03:00
parent 8ea4500ab4
commit f040eaff27
22 changed files with 188 additions and 176 deletions
@@ -253,8 +253,8 @@ internal fun generateIncrementOrDecrementBlock(
} }
} }
internal fun generateAccessExpression(session: FirSession, psi: PsiElement?, name: Name): FirAccessExpression = internal fun generateAccessExpression(session: FirSession, psi: PsiElement?, name: Name): FirQualifiedAccessExpression =
FirAccessExpressionImpl(session, psi).apply { FirQualifiedAccessExpressionImpl(session, psi).apply {
calleeReference = FirSimpleNamedReference(session, psi, name) calleeReference = FirSimpleNamedReference(session, psi, name)
} }
@@ -292,10 +292,10 @@ 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 FirModifiableAccess.initializeLValue( private fun FirModifiableQualifiedAccess.initializeLValue(
session: FirSession, session: FirSession,
left: KtExpression?, left: KtExpression?,
convertQualified: KtQualifiedExpression.() -> FirAccess? convertQualified: KtQualifiedExpression.() -> FirQualifiedAccess?
): FirReference { ): FirReference {
return when (left) { return when (left) {
is KtSimpleNameExpression -> { is KtSimpleNameExpression -> {
@@ -337,12 +337,12 @@ internal fun KtExpression?.generateAssignment(
val arrayExpression = this.arrayExpression val arrayExpression = this.arrayExpression
val arraySet = FirArraySetCallImpl(session, psi, value, operation).apply { val arraySet = FirArraySetCallImpl(session, psi, value, operation).apply {
for (indexExpression in indexExpressions) { for (indexExpression in indexExpressions) {
arguments += indexExpression.convert() indexes += indexExpression.convert()
} }
} }
if (arrayExpression is KtSimpleNameExpression) { if (arrayExpression is KtSimpleNameExpression) {
return arraySet.apply { return arraySet.apply {
calleeReference = initializeLValue(session, arrayExpression) { convert() as? FirAccess } lValue = initializeLValue(session, arrayExpression) { convert() as? FirQualifiedAccess }
} }
} }
return FirBlockImpl(session, arrayExpression).apply { return FirBlockImpl(session, arrayExpression).apply {
@@ -351,7 +351,7 @@ internal fun KtExpression?.generateAssignment(
session, this@generateAssignment, name, session, this@generateAssignment, name,
arrayExpression?.convert() ?: FirErrorExpressionImpl(session, arrayExpression, "No array expression") arrayExpression?.convert() ?: FirErrorExpressionImpl(session, arrayExpression, "No array expression")
) )
statements += arraySet.apply { calleeReference = FirSimpleNamedReference(session, arrayExpression, name) } statements += arraySet.apply { lValue = FirSimpleNamedReference(session, arrayExpression, name) }
} }
} }
if (operation != FirOperation.ASSIGN && if (operation != FirOperation.ASSIGN &&
@@ -364,12 +364,12 @@ internal fun KtExpression?.generateAssignment(
session, this@generateAssignment, name, session, this@generateAssignment, name,
this@generateAssignment?.convert() ?: FirErrorExpressionImpl(session, this@generateAssignment, "No LValue in assignment") this@generateAssignment?.convert() ?: FirErrorExpressionImpl(session, this@generateAssignment, "No LValue in assignment")
) )
statements += FirPropertyAssignmentImpl(session, psi, value, operation).apply { statements += FirVariableAssignmentImpl(session, psi, value, operation).apply {
calleeReference = FirSimpleNamedReference(session, this@generateAssignment, name) lValue = FirSimpleNamedReference(session, this@generateAssignment, name)
} }
} }
} }
return FirPropertyAssignmentImpl(session, psi, value, operation).apply { return FirVariableAssignmentImpl(session, psi, value, operation).apply {
calleeReference = initializeLValue(session, this@generateAssignment) { convert() as? FirAccess } lValue = initializeLValue(session, this@generateAssignment) { convert() as? FirQualifiedAccess }
} }
} }
@@ -1247,7 +1247,7 @@ class RawFirBuilder(val session: FirSession, val stubMode: Boolean) {
override fun visitQualifiedExpression(expression: KtQualifiedExpression, data: Unit): FirElement { override fun visitQualifiedExpression(expression: KtQualifiedExpression, data: Unit): FirElement {
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() as FirModifiableAccess val firSelector = selector.toFirExpression() as FirModifiableQualifiedAccess
firSelector.safe = expression is KtSafeQualifiedExpression firSelector.safe = expression is KtSafeQualifiedExpression
firSelector.explicitReceiver = expression.receiverExpression.toFirExpression() firSelector.explicitReceiver = expression.receiverExpression.toFirExpression()
return firSelector return firSelector
@@ -1255,14 +1255,14 @@ class RawFirBuilder(val session: FirSession, val stubMode: Boolean) {
override fun visitThisExpression(expression: KtThisExpression, data: Unit): FirElement { override fun visitThisExpression(expression: KtThisExpression, data: Unit): FirElement {
val labelName = expression.getLabelName() val labelName = expression.getLabelName()
return FirAccessExpressionImpl(session, expression).apply { return FirQualifiedAccessExpressionImpl(session, expression).apply {
calleeReference = FirExplicitThisReference(session, expression, labelName) calleeReference = FirExplicitThisReference(session, expression, labelName)
} }
} }
override fun visitSuperExpression(expression: KtSuperExpression, data: Unit): FirElement { override fun visitSuperExpression(expression: KtSuperExpression, data: Unit): FirElement {
val superType = expression.superTypeQualifier val superType = expression.superTypeQualifier
return FirAccessExpressionImpl(session, expression).apply { return FirQualifiedAccessExpressionImpl(session, expression).apply {
calleeReference = FirExplicitSuperReference(session, expression, superType.toFirOrImplicitType()) calleeReference = FirExplicitSuperReference(session, expression, superType.toFirOrImplicitType())
} }
} }
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.fir.declarations.FirErrorDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.expressions.FirErrorExpression import org.jetbrains.kotlin.fir.expressions.FirErrorExpression
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirAccess import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess
import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionStub import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionStub
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
@@ -72,15 +72,15 @@ class RawFirBuilderTotalKotlinTestCase : AbstractRawFirBuilderTestCase() {
errorExpression.psi?.let { println(it) } errorExpression.psi?.let { println(it) }
} }
override fun visitAccess(access: FirAccess) { override fun visitQualifiedAccess(qualifiedAccess: FirQualifiedAccess) {
val calleeReference = access.calleeReference val calleeReference = qualifiedAccess.calleeReference
if (calleeReference is FirErrorNamedReference) { if (calleeReference is FirErrorNamedReference) {
errorReferences++ errorReferences++
println(calleeReference.errorReason) println(calleeReference.errorReason)
} else { } else {
normalReferences++ normalReferences++
} }
super.visitAccess(access) super.visitQualifiedAccess(qualifiedAccess)
} }
override fun visitExpression(expression: FirExpression) { override fun visitExpression(expression: FirExpression) {
@@ -711,11 +711,11 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
print(">") print(">")
} }
override fun visitAccess(access: FirAccess) { override fun visitQualifiedAccess(qualifiedAccess: FirQualifiedAccess) {
val explicitReceiver = access.explicitReceiver val explicitReceiver = qualifiedAccess.explicitReceiver
if (explicitReceiver != null) { if (explicitReceiver != null) {
explicitReceiver.accept(this) explicitReceiver.accept(this)
if (access.safe) { if (qualifiedAccess.safe) {
print("?.") print("?.")
} else { } else {
print(".") print(".")
@@ -730,39 +730,39 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
callableReferenceAccess.calleeReference.accept(this) callableReferenceAccess.calleeReference.accept(this)
} }
override fun visitAccessExpression(accessExpression: FirAccessExpression) { override fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression) {
accessExpression.annotations.renderAnnotations() qualifiedAccessExpression.annotations.renderAnnotations()
visitAccess(accessExpression) visitQualifiedAccess(qualifiedAccessExpression)
accessExpression.calleeReference.accept(this) qualifiedAccessExpression.calleeReference.accept(this)
} }
override fun visitAssignment(assignment: FirAssignment) { override fun visitAssignment(assignment: FirAssignment) {
print(assignment.operation.operator) print(assignment.operation.operator)
print(" ") print(" ")
assignment.value.accept(this) assignment.rValue.accept(this)
} }
override fun visitPropertyAssignment(propertyAssignment: FirPropertyAssignment) { override fun visitVariableAssignment(variableAssignment: FirVariableAssignment) {
propertyAssignment.annotations.renderAnnotations() variableAssignment.annotations.renderAnnotations()
visitAccess(propertyAssignment) visitQualifiedAccess(variableAssignment)
propertyAssignment.calleeReference.accept(this) variableAssignment.lValue.accept(this)
print(" ") print(" ")
visitAssignment(propertyAssignment) visitAssignment(variableAssignment)
} }
override fun visitArraySetCall(arraySetCall: FirArraySetCall) { override fun visitArraySetCall(arraySetCall: FirArraySetCall) {
arraySetCall.annotations.renderAnnotations() arraySetCall.annotations.renderAnnotations()
visitAccess(arraySetCall) visitQualifiedAccess(arraySetCall)
arraySetCall.calleeReference.accept(this) arraySetCall.lValue.accept(this)
print("[") print("[")
arraySetCall.arguments.renderSeparated() arraySetCall.indexes.renderSeparated()
print("] ") print("] ")
visitAssignment(arraySetCall) visitAssignment(arraySetCall)
} }
override fun visitFunctionCall(functionCall: FirFunctionCall) { override fun visitFunctionCall(functionCall: FirFunctionCall) {
functionCall.annotations.renderAnnotations() functionCall.annotations.renderAnnotations()
visitAccess(functionCall) visitQualifiedAccess(functionCall)
functionCall.calleeReference.accept(this) functionCall.calleeReference.accept(this)
if (functionCall.typeArguments.isNotEmpty()) { if (functionCall.typeArguments.isNotEmpty()) {
print("<") print("<")
@@ -9,11 +9,19 @@ 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 { interface FirArraySetCall : @VisitedSupertype FirCall, FirAssignment {
// NB: arguments of this thing are indexes AND rvalue
val indexes: List<FirExpression>
override val arguments get() = indexes + rValue
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.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) {
super<FirCall>.acceptChildren(visitor, data) for (index in indexes) {
index.accept(visitor, data)
}
acceptAnnotations(visitor, data)
super<FirAssignment>.acceptChildren(visitor, data) super<FirAssignment>.acceptChildren(visitor, data)
} }
} }
@@ -5,10 +5,13 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.fir.FirReference
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirAssignment : FirAccess { interface FirAssignment : FirQualifiedAccess {
val value: FirExpression val lValue: FirReference get() = calleeReference
val rValue: FirExpression
val operation: FirOperation val operation: FirOperation
@@ -16,7 +19,7 @@ interface FirAssignment : FirAccess {
visitor.visitAssignment(this, data) visitor.visitAssignment(this, data)
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) { override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
value.accept(visitor, data) rValue.accept(visitor, data)
super.acceptChildren(visitor, data) super.acceptChildren(visitor, data)
} }
} }
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirCallableReferenceAccess : FirAccessExpression { interface FirCallableReferenceAccess : FirQualifiedAccessExpression {
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)
} }
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.fir.VisitedSupertype
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
interface FirFunctionCall : @VisitedSupertype FirCall, FirAccess, FirTypeProjectionContainer { interface FirFunctionCall : @VisitedSupertype FirCall, FirQualifiedAccess, FirTypeProjectionContainer {
override val calleeReference: FirNamedReference 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 =
@@ -23,6 +23,6 @@ interface FirFunctionCall : @VisitedSupertype FirCall, FirAccess, FirTypeProject
for (typeArgument in typeArguments) { for (typeArgument in typeArguments) {
typeArgument.accept(visitor, data) typeArgument.accept(visitor, data)
} }
super<FirAccess>.acceptChildren(visitor, data) super<FirQualifiedAccess>.acceptChildren(visitor, data)
} }
} }
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.fir.FirReference import org.jetbrains.kotlin.fir.FirReference
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirAccess : FirStatement { interface FirQualifiedAccess : FirStatement {
val calleeReference: FirReference val calleeReference: FirReference
val safe: Boolean get() = false val safe: Boolean get() = false
@@ -16,7 +16,7 @@ interface FirAccess : FirStatement {
val explicitReceiver: FirExpression? get() = null val explicitReceiver: FirExpression? get() = null
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.visitAccess(this, data) visitor.visitQualifiedAccess(this, data)
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) { override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
calleeReference.accept(visitor, data) calleeReference.accept(visitor, data)
@@ -8,11 +8,11 @@ package org.jetbrains.kotlin.fir.expressions
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 FirAccessExpression : @VisitedSupertype FirAccess, FirExpression { interface FirQualifiedAccessExpression : @VisitedSupertype FirQualifiedAccess, 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.visitAccessExpression(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<FirAccess>.acceptChildren(visitor, data) super<FirQualifiedAccess>.acceptChildren(visitor, data)
} }
} }
@@ -7,7 +7,8 @@ package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirPropertyAssignment : FirAssignment { interface FirVariableAssignment : FirAssignment {
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.visitPropertyAssignment(this, data) visitor.visitVariableAssignment(this, data)
} }
@@ -7,22 +7,30 @@ 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.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirOperation import org.jetbrains.kotlin.fir.expressions.FirOperation
import org.jetbrains.kotlin.fir.expressions.FirPropertyAssignment import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment
import org.jetbrains.kotlin.fir.transformSingle import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
abstract class FirAbstractAssignment( abstract class FirAbstractAssignment(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
final override var value: FirExpression, final override var rValue: FirExpression,
final override val operation: FirOperation, final override val operation: FirOperation,
safe: Boolean = false safe: Boolean = false
) : FirAbstractAccess(session, psi, safe), FirPropertyAssignment { ) : FirAbstractQualifiedAccess(session, psi, safe), FirVariableAssignment {
override var lValue: FirReference
get() = calleeReference
set(value) {
calleeReference = value
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
value = value.transformSingle(transformer, data) rValue = rValue.transformSingle(transformer, data)
return super<FirAbstractAccess>.transformChildren(transformer, data) return super<FirAbstractQualifiedAccess>.transformChildren(transformer, data)
} }
} }
@@ -10,11 +10,11 @@ import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
abstract class FirAbstractAccess( 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), FirModifiableAccess { ) : FirAbstractStatement(session, psi), FirModifiableQualifiedAccess {
final override lateinit var calleeReference: FirReference final override lateinit var calleeReference: FirReference
final override var explicitReceiver: FirExpression? = null final override var explicitReceiver: FirExpression? = null
@@ -22,13 +22,13 @@ class FirArraySetCallImpl(
value: FirExpression, value: FirExpression,
operation: FirOperation operation: FirOperation
) : FirAbstractAssignment(session, psi, value, operation, false), FirArraySetCall { ) : FirAbstractAssignment(session, psi, value, operation, false), FirArraySetCall {
override val arguments = mutableListOf<FirExpression>() override val indexes = mutableListOf<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 =
super<FirArraySetCall>.accept(visitor, data) super<FirArraySetCall>.accept(visitor, data)
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
arguments.transformInplace(transformer, data) indexes.transformInplace(transformer, data)
return super<FirAbstractAssignment>.transformChildren(transformer, data) return super<FirAbstractAssignment>.transformChildren(transformer, data)
} }
@@ -6,14 +6,10 @@
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.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
import org.jetbrains.kotlin.fir.transformInplace
import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirCallableReferenceAccessImpl( class FirCallableReferenceAccessImpl(
session: FirSession, session: FirSession,
psi: PsiElement? psi: PsiElement?
) : FirAbstractAccess(session, psi), FirCallableReferenceAccess ) : FirAbstractQualifiedAccess(session, psi), FirCallableReferenceAccess
@@ -16,7 +16,7 @@ class FirFunctionCallImpl(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
override var safe: Boolean = false override var safe: Boolean = false
) : FirAbstractCall(session, psi), FirFunctionCall, FirModifiableAccess { ) : FirAbstractCall(session, psi), FirFunctionCall, FirModifiableQualifiedAccess {
override val typeArguments = mutableListOf<FirTypeProjection>() override val typeArguments = mutableListOf<FirTypeProjection>()
override lateinit var calleeReference: FirNamedReference override lateinit var calleeReference: FirNamedReference
@@ -6,9 +6,9 @@
package org.jetbrains.kotlin.fir.expressions.impl package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirAccess import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess
interface FirModifiableAccess : FirAccess { interface FirModifiableQualifiedAccess : FirQualifiedAccess {
override var safe: Boolean override var safe: Boolean
get() = super.safe get() = super.safe
set(_) {} set(_) {}
@@ -6,15 +6,11 @@
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.FirAccessExpression import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.transformInplace
import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirAccessExpressionImpl( class FirQualifiedAccessExpressionImpl(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
safe: Boolean = false safe: Boolean = false
) : FirAbstractAccess(session, psi, safe), FirAccessExpression ) : FirAbstractQualifiedAccess(session, psi, safe), FirQualifiedAccessExpression
@@ -9,12 +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.FirOperation import org.jetbrains.kotlin.fir.expressions.FirOperation
import org.jetbrains.kotlin.fir.expressions.FirPropertyAssignment import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment
class FirPropertyAssignmentImpl( class FirVariableAssignmentImpl(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
value: FirExpression, value: FirExpression,
operation: FirOperation, operation: FirOperation,
safe: Boolean = false safe: Boolean = false
) : FirAbstractAssignment(session, psi, value, operation, safe), FirPropertyAssignment ) : FirAbstractAssignment(session, psi, value, operation, safe), FirVariableAssignment
@@ -152,30 +152,6 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformElement(statement, data) return transformElement(statement, data)
} }
open fun transformAccess(access: FirAccess, data: D): CompositeTransformResult<FirStatement> {
return transformStatement(access, data)
}
open fun transformAccessExpression(accessExpression: FirAccessExpression, data: D): CompositeTransformResult<FirStatement> {
return transformAccess(accessExpression, data)
}
open fun transformCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess, data: D): CompositeTransformResult<FirStatement> {
return transformAccessExpression(callableReferenceAccess, data)
}
open fun transformAssignment(assignment: FirAssignment, data: D): CompositeTransformResult<FirStatement> {
return transformAccess(assignment, data)
}
open fun transformPropertyAssignment(propertyAssignment: FirPropertyAssignment, data: D): CompositeTransformResult<FirStatement> {
return transformAssignment(propertyAssignment, data)
}
open fun transformModifiableAccess(modifiableAccess: FirModifiableAccess, data: D): CompositeTransformResult<FirStatement> {
return transformAccess(modifiableAccess, data)
}
open fun transformClass(klass: FirClass, data: D): CompositeTransformResult<FirStatement> { open fun transformClass(klass: FirClass, data: D): CompositeTransformResult<FirStatement> {
return transformStatement(klass, data) return transformStatement(klass, data)
} }
@@ -288,6 +264,30 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformLoop(whileLoop, data) return transformLoop(whileLoop, data)
} }
open fun transformQualifiedAccess(qualifiedAccess: FirQualifiedAccess, data: D): CompositeTransformResult<FirStatement> {
return transformStatement(qualifiedAccess, data)
}
open fun transformAssignment(assignment: FirAssignment, data: D): CompositeTransformResult<FirStatement> {
return transformQualifiedAccess(assignment, data)
}
open fun transformVariableAssignment(variableAssignment: FirVariableAssignment, data: D): CompositeTransformResult<FirStatement> {
return transformAssignment(variableAssignment, data)
}
open fun transformModifiableQualifiedAccess(modifiableQualifiedAccess: FirModifiableQualifiedAccess, data: D): CompositeTransformResult<FirStatement> {
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)
} }
@@ -352,14 +352,6 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformElement(whenBranch, data) return transformElement(whenBranch, data)
} }
final override fun visitAccess(access: FirAccess, data: D): CompositeTransformResult<FirElement> {
return transformAccess(access, data)
}
final override fun visitAccessExpression(accessExpression: FirAccessExpression, data: D): CompositeTransformResult<FirElement> {
return transformAccessExpression(accessExpression, 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)
} }
@@ -532,10 +524,6 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformMemberDeclaration(memberDeclaration, data) return transformMemberDeclaration(memberDeclaration, data)
} }
final override fun visitModifiableAccess(modifiableAccess: FirModifiableAccess, data: D): CompositeTransformResult<FirElement> {
return transformModifiableAccess(modifiableAccess, data)
}
final override fun visitModifiableClass(modifiableClass: FirModifiableClass, data: D): CompositeTransformResult<FirElement> { final override fun visitModifiableClass(modifiableClass: FirModifiableClass, data: D): CompositeTransformResult<FirElement> {
return transformModifiableClass(modifiableClass, data) return transformModifiableClass(modifiableClass, data)
} }
@@ -544,6 +532,10 @@ 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> {
return transformModifiableQualifiedAccess(modifiableQualifiedAccess, data)
}
final override fun visitNamedDeclaration(namedDeclaration: FirNamedDeclaration, data: D): CompositeTransformResult<FirElement> { final override fun visitNamedDeclaration(namedDeclaration: FirNamedDeclaration, data: D): CompositeTransformResult<FirElement> {
return transformNamedDeclaration(namedDeclaration, data) return transformNamedDeclaration(namedDeclaration, data)
} }
@@ -572,8 +564,12 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformPropertyAccessor(propertyAccessor, data) return transformPropertyAccessor(propertyAccessor, data)
} }
final override fun visitPropertyAssignment(propertyAssignment: FirPropertyAssignment, data: D): CompositeTransformResult<FirElement> { final override fun visitQualifiedAccess(qualifiedAccess: FirQualifiedAccess, data: D): CompositeTransformResult<FirElement> {
return transformPropertyAssignment(propertyAssignment, data) return transformQualifiedAccess(qualifiedAccess, data)
}
final override fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression, data: D): CompositeTransformResult<FirElement> {
return transformQualifiedAccessExpression(qualifiedAccessExpression, data)
} }
final override fun visitReference(reference: FirReference, data: D): CompositeTransformResult<FirElement> { final override fun visitReference(reference: FirReference, data: D): CompositeTransformResult<FirElement> {
@@ -676,6 +672,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformVariable(variable, data) return transformVariable(variable, data)
} }
final override fun visitVariableAssignment(variableAssignment: FirVariableAssignment, data: D): CompositeTransformResult<FirElement> {
return transformVariableAssignment(variableAssignment, data)
}
final override fun visitWhenBranch(whenBranch: FirWhenBranch, data: D): CompositeTransformResult<FirElement> { final override fun visitWhenBranch(whenBranch: FirWhenBranch, data: D): CompositeTransformResult<FirElement> {
return transformWhenBranch(whenBranch, data) return transformWhenBranch(whenBranch, data)
} }
@@ -152,30 +152,6 @@ abstract class FirVisitor<out R, in D> {
return visitElement(statement, data) return visitElement(statement, data)
} }
open fun visitAccess(access: FirAccess, data: D): R {
return visitStatement(access, data)
}
open fun visitAccessExpression(accessExpression: FirAccessExpression, data: D): R {
return visitAccess(accessExpression, data)
}
open fun visitCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess, data: D): R {
return visitAccessExpression(callableReferenceAccess, data)
}
open fun visitAssignment(assignment: FirAssignment, data: D): R {
return visitAccess(assignment, data)
}
open fun visitPropertyAssignment(propertyAssignment: FirPropertyAssignment, data: D): R {
return visitAssignment(propertyAssignment, data)
}
open fun visitModifiableAccess(modifiableAccess: FirModifiableAccess, data: D): R {
return visitAccess(modifiableAccess, data)
}
open fun visitClass(klass: FirClass, data: D): R { open fun visitClass(klass: FirClass, data: D): R {
return visitStatement(klass, data) return visitStatement(klass, data)
} }
@@ -288,6 +264,30 @@ abstract class FirVisitor<out R, in D> {
return visitLoop(whileLoop, data) return visitLoop(whileLoop, data)
} }
open fun visitQualifiedAccess(qualifiedAccess: FirQualifiedAccess, data: D): R {
return visitStatement(qualifiedAccess, data)
}
open fun visitAssignment(assignment: FirAssignment, data: D): R {
return visitQualifiedAccess(assignment, data)
}
open fun visitVariableAssignment(variableAssignment: FirVariableAssignment, data: D): R {
return visitAssignment(variableAssignment, data)
}
open fun visitModifiableQualifiedAccess(modifiableQualifiedAccess: FirModifiableQualifiedAccess, data: D): R {
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)
} }
@@ -152,30 +152,6 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(statement, null) visitElement(statement, null)
} }
open fun visitAccess(access: FirAccess) {
visitStatement(access, null)
}
open fun visitAccessExpression(accessExpression: FirAccessExpression) {
visitAccess(accessExpression, null)
}
open fun visitCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess) {
visitAccessExpression(callableReferenceAccess, null)
}
open fun visitAssignment(assignment: FirAssignment) {
visitAccess(assignment, null)
}
open fun visitPropertyAssignment(propertyAssignment: FirPropertyAssignment) {
visitAssignment(propertyAssignment, null)
}
open fun visitModifiableAccess(modifiableAccess: FirModifiableAccess) {
visitAccess(modifiableAccess, null)
}
open fun visitClass(klass: FirClass) { open fun visitClass(klass: FirClass) {
visitStatement(klass, null) visitStatement(klass, null)
} }
@@ -288,6 +264,30 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitLoop(whileLoop, null) visitLoop(whileLoop, null)
} }
open fun visitQualifiedAccess(qualifiedAccess: FirQualifiedAccess) {
visitStatement(qualifiedAccess, null)
}
open fun visitAssignment(assignment: FirAssignment) {
visitQualifiedAccess(assignment, null)
}
open fun visitVariableAssignment(variableAssignment: FirVariableAssignment) {
visitAssignment(variableAssignment, null)
}
open fun visitModifiableQualifiedAccess(modifiableQualifiedAccess: FirModifiableQualifiedAccess) {
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)
} }
@@ -352,14 +352,6 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(whenBranch, null) visitElement(whenBranch, null)
} }
final override fun visitAccess(access: FirAccess, data: Nothing?) {
visitAccess(access)
}
final override fun visitAccessExpression(accessExpression: FirAccessExpression, data: Nothing?) {
visitAccessExpression(accessExpression)
}
final override fun visitAnnotationCall(annotationCall: FirAnnotationCall, data: Nothing?) { final override fun visitAnnotationCall(annotationCall: FirAnnotationCall, data: Nothing?) {
visitAnnotationCall(annotationCall) visitAnnotationCall(annotationCall)
} }
@@ -532,10 +524,6 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitMemberDeclaration(memberDeclaration) visitMemberDeclaration(memberDeclaration)
} }
final override fun visitModifiableAccess(modifiableAccess: FirModifiableAccess, data: Nothing?) {
visitModifiableAccess(modifiableAccess)
}
final override fun visitModifiableClass(modifiableClass: FirModifiableClass, data: Nothing?) { final override fun visitModifiableClass(modifiableClass: FirModifiableClass, data: Nothing?) {
visitModifiableClass(modifiableClass) visitModifiableClass(modifiableClass)
} }
@@ -544,6 +532,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitModifiableFunction(modifiableFunction) visitModifiableFunction(modifiableFunction)
} }
final override fun visitModifiableQualifiedAccess(modifiableQualifiedAccess: FirModifiableQualifiedAccess, data: Nothing?) {
visitModifiableQualifiedAccess(modifiableQualifiedAccess)
}
final override fun visitNamedDeclaration(namedDeclaration: FirNamedDeclaration, data: Nothing?) { final override fun visitNamedDeclaration(namedDeclaration: FirNamedDeclaration, data: Nothing?) {
visitNamedDeclaration(namedDeclaration) visitNamedDeclaration(namedDeclaration)
} }
@@ -572,8 +564,12 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitPropertyAccessor(propertyAccessor) visitPropertyAccessor(propertyAccessor)
} }
final override fun visitPropertyAssignment(propertyAssignment: FirPropertyAssignment, data: Nothing?) { final override fun visitQualifiedAccess(qualifiedAccess: FirQualifiedAccess, data: Nothing?) {
visitPropertyAssignment(propertyAssignment) visitQualifiedAccess(qualifiedAccess)
}
final override fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression, data: Nothing?) {
visitQualifiedAccessExpression(qualifiedAccessExpression)
} }
final override fun visitReference(reference: FirReference, data: Nothing?) { final override fun visitReference(reference: FirReference, data: Nothing?) {
@@ -676,6 +672,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitVariable(variable) visitVariable(variable)
} }
final override fun visitVariableAssignment(variableAssignment: FirVariableAssignment, data: Nothing?) {
visitVariableAssignment(variableAssignment)
}
final override fun visitWhenBranch(whenBranch: FirWhenBranch, data: Nothing?) { final override fun visitWhenBranch(whenBranch: FirWhenBranch, data: Nothing?) {
visitWhenBranch(whenBranch) visitWhenBranch(whenBranch)
} }