Introduce typeRef for FirExpression

This helps both body resolve & conversion to IR
This commit is contained in:
Mikhail Glukhikh
2019-03-21 11:29:08 +03:00
parent adeeeeee48
commit aa6ba1cd4a
29 changed files with 205 additions and 24 deletions
@@ -100,13 +100,13 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn
) )
} }
FirOperation.AS -> { FirOperation.AS -> {
bindingContext[resolved] = resolved.typeRef bindingContext[resolved] = resolved.conversionTypeRef
} }
FirOperation.SAFE_AS -> { FirOperation.SAFE_AS -> {
bindingContext[resolved] = bindingContext[resolved] =
resolved.typeRef.withReplacedConeType( resolved.conversionTypeRef.withReplacedConeType(
session, session,
resolved.typeRef.coneTypeUnsafe().withNullability(ConeNullability.NULLABLE) resolved.conversionTypeRef.coneTypeUnsafe().withNullability(ConeNullability.NULLABLE)
) )
} }
else -> error("Unknown type operator") else -> error("Unknown type operator")
@@ -618,7 +618,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
print(" ") print(" ")
print(typeOperatorCall.operation.operator) print(typeOperatorCall.operation.operator)
print(" ") print(" ")
typeOperatorCall.typeRef.accept(this) typeOperatorCall.conversionTypeRef.accept(this)
print(")") print(")")
} }
@@ -853,7 +853,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
print(operatorCall.operation.operator) print(operatorCall.operation.operator)
if (operatorCall is FirTypeOperatorCall) { if (operatorCall is FirTypeOperatorCall) {
print("/") print("/")
operatorCall.typeRef.accept(this) operatorCall.conversionTypeRef.accept(this)
} }
visitCall(operatorCall) visitCall(operatorCall)
} }
@@ -882,7 +882,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
classReferenceExpression.annotations.renderAnnotations() classReferenceExpression.annotations.renderAnnotations()
print("<getClass>") print("<getClass>")
print("(") print("(")
classReferenceExpression.typeRef.accept(this) classReferenceExpression.classTypeRef.accept(this)
print(")") print(")")
} }
@@ -25,6 +25,7 @@ interface FirAnonymousFunction : @VisitedSupertype FirFunction, FirExpression, F
parameter.accept(visitor, data) parameter.accept(visitor, data)
} }
body?.accept(visitor, data) body?.accept(visitor, data)
// Don't call super<FirExpression>.acceptChildren (annotations are already processed) typeRef.accept(visitor, data)
// Don't call super<FirExpression>.acceptChildren (annotations & typeRef are already processed)
} }
} }
@@ -19,6 +19,7 @@ interface FirEnumEntry : @VisitedSupertype FirRegularClass, FirCall {
for (argument in arguments) { for (argument in arguments) {
argument.accept(visitor, data) argument.accept(visitor, data)
} }
typeRef.accept(visitor, data)
super<FirRegularClass>.acceptChildren(visitor, data) super<FirRegularClass>.acceptChildren(visitor, data)
} }
} }
@@ -12,6 +12,7 @@ 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.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
class FirAnonymousFunctionImpl( class FirAnonymousFunctionImpl(
@@ -20,9 +21,16 @@ class FirAnonymousFunctionImpl(
override var returnTypeRef: FirTypeRef, override var returnTypeRef: FirTypeRef,
override var receiverTypeRef: FirTypeRef? override var receiverTypeRef: FirTypeRef?
) : FirAbstractFunction(session, psi), FirAnonymousFunction, FirModifiableFunction { ) : FirAbstractFunction(session, psi), FirAnonymousFunction, FirModifiableFunction {
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(session, null)
override var label: FirLabel? = null override var label: FirLabel? = null
override fun replaceTypeRef(newTypeRef: FirTypeRef) {
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)
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)
@@ -11,7 +11,9 @@ 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
@@ -19,15 +21,22 @@ class FirAnonymousObjectImpl(
session: FirSession, session: FirSession,
psi: PsiElement? psi: PsiElement?
) : FirAbstractAnnotatedDeclaration(session, psi), FirAnonymousObject, FirModifiableClass { ) : FirAbstractAnnotatedDeclaration(session, psi), FirAnonymousObject, 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)
@@ -11,8 +11,14 @@ 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.FirEnumEntry
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
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
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.impl.FirImplicitTypeRefImpl
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
class FirEnumEntryImpl( class FirEnumEntryImpl(
@@ -35,5 +41,18 @@ class FirEnumEntryImpl(
isData = false, isData = false,
isInline = false isInline = false
), FirEnumEntry { ), FirEnumEntry {
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(session, null)
override val arguments = mutableListOf<FirExpression>() override val arguments = mutableListOf<FirExpression>()
override fun replaceTypeRef(newTypeRef: FirTypeRef) {
typeRef = newTypeRef
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirRegularClass {
typeRef = typeRef.transformSingle(transformer, data)
arguments.transformInplace(transformer, data)
return super<FirClassImpl>.transformChildren(transformer, data)
}
} }
@@ -17,7 +17,7 @@ class FirErrorLoop(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
override val reason: String override val reason: String
) : FirAbstractElement(session, psi), FirErrorExpression, FirLoop { ) : FirAbstractElement(session, psi), FirErrorStatement, FirLoop {
override val annotations: List<FirAnnotationCall> = listOf() override val annotations: List<FirAnnotationCall> = listOf()
override val condition: FirExpression = FirErrorExpressionImpl(session, psi, reason) override val condition: FirExpression = FirErrorExpressionImpl(session, psi, reason)
@@ -25,7 +25,7 @@ class FirErrorLoop(
override val block: FirBlock = FirEmptyExpressionBlock(session) override val block: FirBlock = FirEmptyExpressionBlock(session)
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<FirErrorExpression>.accept(visitor, data) return super<FirErrorStatement>.accept(visitor, data)
} }
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) { override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
@@ -22,6 +22,7 @@ interface FirArraySetCall : @VisitedSupertype FirCall, FirAssignment {
index.accept(visitor, data) index.accept(visitor, data)
} }
acceptAnnotations(visitor, data) acceptAnnotations(visitor, data)
typeRef.accept(visitor, data)
super<FirAssignment>.acceptChildren(visitor, data) super<FirAssignment>.acceptChildren(visitor, data)
} }
} }
@@ -17,6 +17,7 @@ interface FirBlock : FirExpression {
for (statement in statements) { for (statement in statements) {
statement.accept(visitor, data) statement.accept(visitor, data)
} }
typeRef.accept(visitor, data)
super.acceptChildren(visitor, data) super.acceptChildren(visitor, data)
} }
} }
@@ -9,7 +9,7 @@ import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirClassReferenceExpression : FirExpression { interface FirClassReferenceExpression : FirExpression {
val typeRef: FirTypeRef 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)
@@ -0,0 +1,15 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirErrorStatement : FirStatement {
val reason: String
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitErrorStatement(this, data)
}
@@ -7,11 +7,21 @@ package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.fir.FirResolvedCallableReference import org.jetbrains.kotlin.fir.FirResolvedCallableReference
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.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirExpression : FirStatement { interface FirExpression : FirStatement {
val typeRef: FirTypeRef
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)
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
super.acceptChildren(visitor, data)
typeRef.accept(visitor, data)
}
} }
fun FirExpression.toResolvedCallableReference(): FirResolvedCallableReference? { fun FirExpression.toResolvedCallableReference(): FirResolvedCallableReference? {
@@ -23,6 +23,7 @@ interface FirFunctionCall : @VisitedSupertype FirCall, FirQualifiedAccess, FirTy
for (typeArgument in typeArguments) { for (typeArgument in typeArguments) {
typeArgument.accept(visitor, data) typeArgument.accept(visitor, data)
} }
typeRef.accept(visitor, data)
super<FirQualifiedAccess>.acceptChildren(visitor, data) super<FirQualifiedAccess>.acceptChildren(visitor, data)
} }
} }
@@ -14,5 +14,6 @@ interface FirQualifiedAccessExpression : @VisitedSupertype FirQualifiedAccess, F
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) super<FirQualifiedAccess>.acceptChildren(visitor, data)
typeRef.accept(visitor, data)
} }
} }
@@ -12,13 +12,13 @@ import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirTypeOperatorCall : FirOperatorCall { interface FirTypeOperatorCall : FirOperatorCall {
val argument: FirExpression get() = arguments.first() val argument: FirExpression get() = arguments.first()
val typeRef: FirTypeRef 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)
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) { override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
typeRef.accept(visitor, data) conversionTypeRef.accept(visitor, data)
super.acceptChildren(visitor, data) super.acceptChildren(visitor, data)
} }
} }
@@ -0,0 +1,32 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.expressions.impl
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirBlock
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
abstract class FirAbstractBlock(
session: FirSession,
psi: PsiElement?
) : FirAbstractAnnotatedElement(session, psi), FirBlock {
override var typeRef: FirTypeRef = 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<FirAbstractAnnotatedElement>.transformChildren(transformer, data)
}
}
@@ -6,10 +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.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
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.impl.FirImplicitTypeRefImpl
import org.jetbrains.kotlin.fir.visitors.FirTransformer
abstract class FirAbstractExpression( abstract class FirAbstractExpression(
session: FirSession, session: FirSession,
psi: PsiElement? psi: PsiElement?
) : FirAbstractStatement(session, psi), FirExpression ) : FirAbstractStatement(session, psi), FirExpression {
override var typeRef: FirTypeRef = 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<FirAbstractStatement>.transformChildren(transformer, data)
}
}
@@ -13,6 +13,9 @@ import org.jetbrains.kotlin.fir.expressions.FirArraySetCall
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.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.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
@@ -22,12 +25,19 @@ 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 var typeRef: FirTypeRef = FirImplicitTypeRefImpl(session, null)
override fun replaceTypeRef(newTypeRef: FirTypeRef) {
typeRef = newTypeRef
}
override val indexes = 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 {
typeRef = typeRef.transformSingle(transformer, data)
indexes.transformInplace(transformer, data) indexes.transformInplace(transformer, data)
return super<FirAbstractAssignment>.transformChildren(transformer, data) return super<FirAbstractAssignment>.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?
) : FirAbstractAnnotatedElement(session, psi), FirBlock { ) : FirAbstractBlock(session, psi), FirBlock {
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<FirAbstractAnnotatedElement>.transformChildren(transformer, data) return super<FirAbstractBlock>.transformChildren(transformer, data)
} }
} }
@@ -6,10 +6,27 @@
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.FirCallableReferenceAccess import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
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
class FirCallableReferenceAccessImpl( class FirCallableReferenceAccessImpl(
session: FirSession, session: FirSession,
psi: PsiElement? psi: PsiElement?
) : FirAbstractQualifiedAccess(session, psi), FirCallableReferenceAccess ) : FirAbstractQualifiedAccess(session, psi), FirCallableReferenceAccess {
override var typeRef: FirTypeRef = 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<FirAbstractQualifiedAccess>.transformChildren(transformer, data)
}
}
@@ -16,10 +16,10 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirClassReferenceExpressionImpl( class FirClassReferenceExpressionImpl(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
override var typeRef: FirTypeRef override var classTypeRef: FirTypeRef
) : FirAbstractExpression(session, psi), FirClassReferenceExpression { ) : FirAbstractExpression(session, psi), FirClassReferenceExpression {
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) classTypeRef = classTypeRef.transformSingle(transformer, data)
return super<FirAbstractExpression>.transformChildren(transformer, data) return super<FirAbstractExpression>.transformChildren(transformer, data)
} }
} }
@@ -10,6 +10,6 @@ import org.jetbrains.kotlin.fir.expressions.FirBlock
class FirEmptyExpressionBlock( class FirEmptyExpressionBlock(
session: FirSession session: FirSession
) : FirAbstractAnnotatedElement(session, null), FirBlock { ) : FirAbstractBlock(session, null), FirBlock {
override val statements = listOf() override val statements = listOf()
} }
@@ -6,11 +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.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
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
class FirQualifiedAccessExpressionImpl( class FirQualifiedAccessExpressionImpl(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
safe: Boolean = false safe: Boolean = false
) : FirAbstractQualifiedAccess(session, psi, safe), FirQualifiedAccessExpression ) : FirAbstractQualifiedAccess(session, psi, safe), FirQualifiedAccessExpression {
override var typeRef: FirTypeRef = 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<FirAbstractQualifiedAccess>.transformChildren(transformer, data)
}
}
@@ -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
) : FirAbstractAnnotatedElement(session, statement.psi), FirBlock { ) : FirAbstractBlock(session, statement.psi), FirBlock {
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<FirAbstractAnnotatedElement>.transformChildren(transformer, data) return super<FirAbstractBlock>.transformChildren(transformer, data)
} }
} }
@@ -18,10 +18,10 @@ class FirTypeOperatorCallImpl(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
override val operation: FirOperation, override val operation: FirOperation,
override var typeRef: FirTypeRef override var conversionTypeRef: FirTypeRef
) : FirAbstractCall(session, psi), FirTypeOperatorCall { ) : FirAbstractCall(session, psi), FirTypeOperatorCall {
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) conversionTypeRef = conversionTypeRef.transformSingle(transformer, data)
return super<FirAbstractCall>.transformChildren(transformer, data) return super<FirAbstractCall>.transformChildren(transformer, data)
} }
} }
@@ -180,6 +180,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformClass(modifiableClass, data) 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 transformStatement(expression, data)
} }
@@ -504,6 +508,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformErrorExpression(errorExpression, data) return transformErrorExpression(errorExpression, data)
} }
final override fun visitErrorStatement(errorStatement: FirErrorStatement, data: D): CompositeTransformResult<FirElement> {
return transformErrorStatement(errorStatement, data)
}
final override fun visitErrorTypeRef(errorTypeRef: FirErrorTypeRef, data: D): CompositeTransformResult<FirElement> { final override fun visitErrorTypeRef(errorTypeRef: FirErrorTypeRef, data: D): CompositeTransformResult<FirElement> {
return transformErrorTypeRef(errorTypeRef, data) return transformErrorTypeRef(errorTypeRef, data)
} }
@@ -180,6 +180,10 @@ abstract class FirVisitor<out R, in D> {
return visitClass(modifiableClass, data) 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 visitStatement(expression, data)
} }
@@ -180,6 +180,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitClass(modifiableClass, null) visitClass(modifiableClass, null)
} }
open fun visitErrorStatement(errorStatement: FirErrorStatement) {
visitStatement(errorStatement, null)
}
open fun visitExpression(expression: FirExpression) { open fun visitExpression(expression: FirExpression) {
visitStatement(expression, null) visitStatement(expression, null)
} }
@@ -504,6 +508,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitErrorExpression(errorExpression) visitErrorExpression(errorExpression)
} }
final override fun visitErrorStatement(errorStatement: FirErrorStatement, data: Nothing?) {
visitErrorStatement(errorStatement)
}
final override fun visitErrorTypeRef(errorTypeRef: FirErrorTypeRef, data: Nothing?) { final override fun visitErrorTypeRef(errorTypeRef: FirErrorTypeRef, data: Nothing?) {
visitErrorTypeRef(errorTypeRef) visitErrorTypeRef(errorTypeRef)
} }