From aa6ba1cd4ad3d469a95559b97c12b8fa619ec74e Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 21 Mar 2019 11:29:08 +0300 Subject: [PATCH] Introduce typeRef for FirExpression This helps both body resolve & conversion to IR --- .../transformers/FirBodyResolveTransformer.kt | 6 ++-- .../org/jetbrains/kotlin/fir/FirRenderer.kt | 6 ++-- .../fir/declarations/FirAnonymousFunction.kt | 3 +- .../kotlin/fir/declarations/FirEnumEntry.kt | 1 + .../impl/FirAnonymousFunctionImpl.kt | 8 +++++ .../impl/FirAnonymousObjectImpl.kt | 9 ++++++ .../fir/declarations/impl/FirEnumEntryImpl.kt | 19 +++++++++++ .../fir/declarations/impl/FirErrorLoop.kt | 4 +-- .../kotlin/fir/expressions/FirArraySetCall.kt | 1 + .../kotlin/fir/expressions/FirBlock.kt | 1 + .../FirClassReferenceExpression.kt | 2 +- .../fir/expressions/FirErrorStatement.kt | 15 +++++++++ .../kotlin/fir/expressions/FirExpression.kt | 10 ++++++ .../kotlin/fir/expressions/FirFunctionCall.kt | 1 + .../FirQualifiedAccessExpression.kt | 1 + .../fir/expressions/FirTypeOperatorCall.kt | 4 +-- .../fir/expressions/impl/FirAbstractBlock.kt | 32 +++++++++++++++++++ .../expressions/impl/FirAbstractExpression.kt | 20 +++++++++++- .../expressions/impl/FirArraySetCallImpl.kt | 10 ++++++ .../fir/expressions/impl/FirBlockImpl.kt | 4 +-- .../impl/FirCallableReferenceAccessImpl.kt | 19 ++++++++++- .../impl/FirClassReferenceExpressionImpl.kt | 4 +-- .../impl/FirEmptyExpressionBlock.kt | 2 +- .../impl/FirQualifiedAccessExpressionImpl.kt | 19 ++++++++++- .../impl/FirSingleExpressionBlock.kt | 4 +-- .../impl/FirTypeOperatorCallImpl.kt | 4 +-- .../fir/visitors/FirTransformerGenerated.kt | 8 +++++ .../fir/visitors/FirVisitorGenerated.kt | 4 +++ .../fir/visitors/FirVisitorVoidGenerated.kt | 8 +++++ 29 files changed, 205 insertions(+), 24 deletions(-) create mode 100644 compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirErrorStatement.kt create mode 100644 compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractBlock.kt diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt index d22ee7247b6..a048add7b42 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt @@ -100,13 +100,13 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn ) } FirOperation.AS -> { - bindingContext[resolved] = resolved.typeRef + bindingContext[resolved] = resolved.conversionTypeRef } FirOperation.SAFE_AS -> { bindingContext[resolved] = - resolved.typeRef.withReplacedConeType( + resolved.conversionTypeRef.withReplacedConeType( session, - resolved.typeRef.coneTypeUnsafe().withNullability(ConeNullability.NULLABLE) + resolved.conversionTypeRef.coneTypeUnsafe().withNullability(ConeNullability.NULLABLE) ) } else -> error("Unknown type operator") diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt index 32fed1e5e7b..14551c70aa4 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -618,7 +618,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() { print(" ") print(typeOperatorCall.operation.operator) print(" ") - typeOperatorCall.typeRef.accept(this) + typeOperatorCall.conversionTypeRef.accept(this) print(")") } @@ -853,7 +853,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() { print(operatorCall.operation.operator) if (operatorCall is FirTypeOperatorCall) { print("/") - operatorCall.typeRef.accept(this) + operatorCall.conversionTypeRef.accept(this) } visitCall(operatorCall) } @@ -882,7 +882,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() { classReferenceExpression.annotations.renderAnnotations() print("") print("(") - classReferenceExpression.typeRef.accept(this) + classReferenceExpression.classTypeRef.accept(this) print(")") } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirAnonymousFunction.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirAnonymousFunction.kt index c03abb50d68..cff60a58034 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirAnonymousFunction.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirAnonymousFunction.kt @@ -25,6 +25,7 @@ interface FirAnonymousFunction : @VisitedSupertype FirFunction, FirExpression, F parameter.accept(visitor, data) } body?.accept(visitor, data) - // Don't call super.acceptChildren (annotations are already processed) + typeRef.accept(visitor, data) + // Don't call super.acceptChildren (annotations & typeRef are already processed) } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirEnumEntry.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirEnumEntry.kt index 298be249bca..63316d4c8c2 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirEnumEntry.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirEnumEntry.kt @@ -19,6 +19,7 @@ interface FirEnumEntry : @VisitedSupertype FirRegularClass, FirCall { for (argument in arguments) { argument.accept(visitor, data) } + typeRef.accept(visitor, data) super.acceptChildren(visitor, data) } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousFunctionImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousFunctionImpl.kt index 1681fe91064..0fcf34296a8 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousFunctionImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousFunctionImpl.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction 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 FirAnonymousFunctionImpl( @@ -20,9 +21,16 @@ class FirAnonymousFunctionImpl( override var returnTypeRef: FirTypeRef, override var receiverTypeRef: FirTypeRef? ) : FirAbstractFunction(session, psi), FirAnonymousFunction, FirModifiableFunction { + override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(session, null) + override var label: FirLabel? = null + override fun replaceTypeRef(newTypeRef: FirTypeRef) { + typeRef = newTypeRef + } + override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + typeRef = typeRef.transformSingle(transformer, data) returnTypeRef = returnTypeRef.transformSingle(transformer, data) receiverTypeRef = receiverTypeRef?.transformSingle(transformer, data) label = label?.transformSingle(transformer, data) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousObjectImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousObjectImpl.kt index 82d3407afb9..07a32005b97 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousObjectImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousObjectImpl.kt @@ -11,7 +11,9 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject import org.jetbrains.kotlin.fir.declarations.FirDeclaration 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.FirVisitor @@ -19,15 +21,22 @@ class FirAnonymousObjectImpl( session: FirSession, psi: PsiElement? ) : FirAbstractAnnotatedDeclaration(session, psi), FirAnonymousObject, FirModifiableClass { + override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(session, null) + override val superTypeRefs = mutableListOf() override val declarations = mutableListOf() + override fun replaceTypeRef(newTypeRef: FirTypeRef) { + typeRef = newTypeRef + } + override fun accept(visitor: FirVisitor, data: D): R { return super.accept(visitor, data) } override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + typeRef = typeRef.transformSingle(transformer, data) superTypeRefs.transformInplace(transformer, data) declarations.transformInplace(transformer, data) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirEnumEntryImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirEnumEntryImpl.kt index 302cc4b1866..b75a4fc762e 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirEnumEntryImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirEnumEntryImpl.kt @@ -11,8 +11,14 @@ import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.FirSession 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.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 class FirEnumEntryImpl( @@ -35,5 +41,18 @@ class FirEnumEntryImpl( isData = false, isInline = false ), FirEnumEntry { + override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(session, null) + override val arguments = mutableListOf() + + override fun replaceTypeRef(newTypeRef: FirTypeRef) { + typeRef = newTypeRef + } + + override fun transformChildren(transformer: FirTransformer, data: D): FirRegularClass { + typeRef = typeRef.transformSingle(transformer, data) + arguments.transformInplace(transformer, data) + + return super.transformChildren(transformer, data) + } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirErrorLoop.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirErrorLoop.kt index 41472f24008..7af0695485c 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirErrorLoop.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirErrorLoop.kt @@ -17,7 +17,7 @@ class FirErrorLoop( session: FirSession, psi: PsiElement?, override val reason: String -) : FirAbstractElement(session, psi), FirErrorExpression, FirLoop { +) : FirAbstractElement(session, psi), FirErrorStatement, FirLoop { override val annotations: List = listOf() override val condition: FirExpression = FirErrorExpressionImpl(session, psi, reason) @@ -25,7 +25,7 @@ class FirErrorLoop( override val block: FirBlock = FirEmptyExpressionBlock(session) override fun accept(visitor: FirVisitor, data: D): R { - return super.accept(visitor, data) + return super.accept(visitor, data) } override fun acceptChildren(visitor: FirVisitor, data: D) { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirArraySetCall.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirArraySetCall.kt index 68c9b17ce83..2f97eac2bd5 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirArraySetCall.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirArraySetCall.kt @@ -22,6 +22,7 @@ interface FirArraySetCall : @VisitedSupertype FirCall, FirAssignment { index.accept(visitor, data) } acceptAnnotations(visitor, data) + typeRef.accept(visitor, data) super.acceptChildren(visitor, data) } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirBlock.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirBlock.kt index 576d00572d9..214fb934942 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirBlock.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirBlock.kt @@ -17,6 +17,7 @@ interface FirBlock : FirExpression { for (statement in statements) { statement.accept(visitor, data) } + typeRef.accept(visitor, data) super.acceptChildren(visitor, data) } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirClassReferenceExpression.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirClassReferenceExpression.kt index 5178475dd49..1edab00cacf 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirClassReferenceExpression.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirClassReferenceExpression.kt @@ -9,7 +9,7 @@ import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.visitors.FirVisitor interface FirClassReferenceExpression : FirExpression { - val typeRef: FirTypeRef + val classTypeRef: FirTypeRef override fun accept(visitor: FirVisitor, data: D): R = visitor.visitClassReferenceExpression(this, data) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirErrorStatement.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirErrorStatement.kt new file mode 100644 index 00000000000..feb8e52b0d9 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirErrorStatement.kt @@ -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 accept(visitor: FirVisitor, data: D): R = + visitor.visitErrorStatement(this, data) +} \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpression.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpression.kt index 007a5a73b36..81ad4a6d225 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpression.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpression.kt @@ -7,11 +7,21 @@ package org.jetbrains.kotlin.fir.expressions import org.jetbrains.kotlin.fir.FirResolvedCallableReference import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol +import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.visitors.FirVisitor interface FirExpression : FirStatement { + val typeRef: FirTypeRef + + fun replaceTypeRef(newTypeRef: FirTypeRef) + override fun accept(visitor: FirVisitor, data: D): R = visitor.visitExpression(this, data) + + override fun acceptChildren(visitor: FirVisitor, data: D) { + super.acceptChildren(visitor, data) + typeRef.accept(visitor, data) + } } fun FirExpression.toResolvedCallableReference(): FirResolvedCallableReference? { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirFunctionCall.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirFunctionCall.kt index f234b4f9590..9f9c7262f55 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirFunctionCall.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirFunctionCall.kt @@ -23,6 +23,7 @@ interface FirFunctionCall : @VisitedSupertype FirCall, FirQualifiedAccess, FirTy for (typeArgument in typeArguments) { typeArgument.accept(visitor, data) } + typeRef.accept(visitor, data) super.acceptChildren(visitor, data) } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccessExpression.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccessExpression.kt index 13c6b2bb107..e64afdbdf8a 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccessExpression.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccessExpression.kt @@ -14,5 +14,6 @@ interface FirQualifiedAccessExpression : @VisitedSupertype FirQualifiedAccess, F override fun acceptChildren(visitor: FirVisitor, data: D) { super.acceptChildren(visitor, data) + typeRef.accept(visitor, data) } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirTypeOperatorCall.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirTypeOperatorCall.kt index ad11a09a234..8630e28a3ba 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirTypeOperatorCall.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirTypeOperatorCall.kt @@ -12,13 +12,13 @@ import org.jetbrains.kotlin.fir.visitors.FirVisitor interface FirTypeOperatorCall : FirOperatorCall { val argument: FirExpression get() = arguments.first() - val typeRef: FirTypeRef + val conversionTypeRef: FirTypeRef override fun accept(visitor: FirVisitor, data: D): R = visitor.visitTypeOperatorCall(this, data) override fun acceptChildren(visitor: FirVisitor, data: D) { - typeRef.accept(visitor, data) + conversionTypeRef.accept(visitor, data) super.acceptChildren(visitor, data) } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractBlock.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractBlock.kt new file mode 100644 index 00000000000..97b0122cfd6 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractBlock.kt @@ -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 transformChildren(transformer: FirTransformer, data: D): FirElement { + typeRef = typeRef.transformSingle(transformer, data) + + return super.transformChildren(transformer, data) + } +} \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractExpression.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractExpression.kt index bfe6140007c..8fe1c82403f 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractExpression.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractExpression.kt @@ -6,10 +6,28 @@ 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.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( session: FirSession, psi: PsiElement? -) : FirAbstractStatement(session, psi), FirExpression \ No newline at end of file +) : FirAbstractStatement(session, psi), FirExpression { + override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(session, null) + + override fun replaceTypeRef(newTypeRef: FirTypeRef) { + typeRef = newTypeRef + } + + override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + typeRef = typeRef.transformSingle(transformer, data) + + return super.transformChildren(transformer, data) + } +} \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirArraySetCallImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirArraySetCallImpl.kt index 0436706e29e..4c324746cf9 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirArraySetCallImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirArraySetCallImpl.kt @@ -13,6 +13,9 @@ import org.jetbrains.kotlin.fir.expressions.FirArraySetCall import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirOperation 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.FirVisitor @@ -22,12 +25,19 @@ class FirArraySetCallImpl( value: FirExpression, operation: FirOperation ) : 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() override fun accept(visitor: FirVisitor, data: D): R = super.accept(visitor, data) override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + typeRef = typeRef.transformSingle(transformer, data) indexes.transformInplace(transformer, data) return super.transformChildren(transformer, data) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirBlockImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirBlockImpl.kt index 284a22a8c05..254f30aa66a 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirBlockImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirBlockImpl.kt @@ -16,11 +16,11 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer class FirBlockImpl( session: FirSession, psi: PsiElement? -) : FirAbstractAnnotatedElement(session, psi), FirBlock { +) : FirAbstractBlock(session, psi), FirBlock { override val statements = mutableListOf() override fun transformChildren(transformer: FirTransformer, data: D): FirElement { statements.transformInplace(transformer, data) - return super.transformChildren(transformer, data) + return super.transformChildren(transformer, data) } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirCallableReferenceAccessImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirCallableReferenceAccessImpl.kt index 2cc470649b8..b210029b66b 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirCallableReferenceAccessImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirCallableReferenceAccessImpl.kt @@ -6,10 +6,27 @@ 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.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( session: FirSession, psi: PsiElement? -) : FirAbstractQualifiedAccess(session, psi), FirCallableReferenceAccess \ No newline at end of file +) : FirAbstractQualifiedAccess(session, psi), FirCallableReferenceAccess { + override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(session, null) + + override fun replaceTypeRef(newTypeRef: FirTypeRef) { + typeRef = newTypeRef + } + + override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + typeRef = typeRef.transformSingle(transformer, data) + + return super.transformChildren(transformer, data) + } +} \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirClassReferenceExpressionImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirClassReferenceExpressionImpl.kt index cbf70281097..3a6b618a617 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirClassReferenceExpressionImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirClassReferenceExpressionImpl.kt @@ -16,10 +16,10 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer class FirClassReferenceExpressionImpl( session: FirSession, psi: PsiElement?, - override var typeRef: FirTypeRef + override var classTypeRef: FirTypeRef ) : FirAbstractExpression(session, psi), FirClassReferenceExpression { override fun transformChildren(transformer: FirTransformer, data: D): FirElement { - typeRef = typeRef.transformSingle(transformer, data) + classTypeRef = classTypeRef.transformSingle(transformer, data) return super.transformChildren(transformer, data) } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirEmptyExpressionBlock.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirEmptyExpressionBlock.kt index ae89b855736..fc931f0ed9e 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirEmptyExpressionBlock.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirEmptyExpressionBlock.kt @@ -10,6 +10,6 @@ import org.jetbrains.kotlin.fir.expressions.FirBlock class FirEmptyExpressionBlock( session: FirSession -) : FirAbstractAnnotatedElement(session, null), FirBlock { +) : FirAbstractBlock(session, null), FirBlock { override val statements = listOf() } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirQualifiedAccessExpressionImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirQualifiedAccessExpressionImpl.kt index 774209ff10e..f5b2cb26195 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirQualifiedAccessExpressionImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirQualifiedAccessExpressionImpl.kt @@ -6,11 +6,28 @@ 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.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( session: FirSession, psi: PsiElement?, safe: Boolean = false -) : FirAbstractQualifiedAccess(session, psi, safe), FirQualifiedAccessExpression \ No newline at end of file +) : FirAbstractQualifiedAccess(session, psi, safe), FirQualifiedAccessExpression { + override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(session, null) + + override fun replaceTypeRef(newTypeRef: FirTypeRef) { + typeRef = newTypeRef + } + + override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + typeRef = typeRef.transformSingle(transformer, data) + + return super.transformChildren(transformer, data) + } +} \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirSingleExpressionBlock.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirSingleExpressionBlock.kt index 276a2a106eb..32778ae532b 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirSingleExpressionBlock.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirSingleExpressionBlock.kt @@ -15,12 +15,12 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer class FirSingleExpressionBlock( session: FirSession, private var statement: FirStatement -) : FirAbstractAnnotatedElement(session, statement.psi), FirBlock { +) : FirAbstractBlock(session, statement.psi), FirBlock { override val statements get() = listOf(statement) override fun transformChildren(transformer: FirTransformer, data: D): FirElement { statement = statement.transformSingle(transformer, data) - return super.transformChildren(transformer, data) + return super.transformChildren(transformer, data) } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirTypeOperatorCallImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirTypeOperatorCallImpl.kt index bbf3d69bdfa..be9c421c976 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirTypeOperatorCallImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirTypeOperatorCallImpl.kt @@ -18,10 +18,10 @@ class FirTypeOperatorCallImpl( session: FirSession, psi: PsiElement?, override val operation: FirOperation, - override var typeRef: FirTypeRef + override var conversionTypeRef: FirTypeRef ) : FirAbstractCall(session, psi), FirTypeOperatorCall { override fun transformChildren(transformer: FirTransformer, data: D): FirElement { - typeRef = typeRef.transformSingle(transformer, data) + conversionTypeRef = conversionTypeRef.transformSingle(transformer, data) return super.transformChildren(transformer, data) } } \ No newline at end of file diff --git a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirTransformerGenerated.kt b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirTransformerGenerated.kt index b7b316cdaf3..2c4f5692aa0 100644 --- a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirTransformerGenerated.kt +++ b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirTransformerGenerated.kt @@ -180,6 +180,10 @@ abstract class FirTransformer : FirVisitor { + return transformStatement(errorStatement, data) + } + open fun transformExpression(expression: FirExpression, data: D): CompositeTransformResult { return transformStatement(expression, data) } @@ -504,6 +508,10 @@ abstract class FirTransformer : FirVisitor { + return transformErrorStatement(errorStatement, data) + } + final override fun visitErrorTypeRef(errorTypeRef: FirErrorTypeRef, data: D): CompositeTransformResult { return transformErrorTypeRef(errorTypeRef, data) } diff --git a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorGenerated.kt b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorGenerated.kt index 34c13b873c9..9d4002222b5 100644 --- a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorGenerated.kt +++ b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorGenerated.kt @@ -180,6 +180,10 @@ abstract class FirVisitor { return visitClass(modifiableClass, data) } + open fun visitErrorStatement(errorStatement: FirErrorStatement, data: D): R { + return visitStatement(errorStatement, data) + } + open fun visitExpression(expression: FirExpression, data: D): R { return visitStatement(expression, data) } diff --git a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorVoidGenerated.kt b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorVoidGenerated.kt index 025da6fb78c..069f85bfdd3 100644 --- a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorVoidGenerated.kt +++ b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorVoidGenerated.kt @@ -180,6 +180,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitClass(modifiableClass, null) } + open fun visitErrorStatement(errorStatement: FirErrorStatement) { + visitStatement(errorStatement, null) + } + open fun visitExpression(expression: FirExpression) { visitStatement(expression, null) } @@ -504,6 +508,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitErrorExpression(errorExpression) } + final override fun visitErrorStatement(errorStatement: FirErrorStatement, data: Nothing?) { + visitErrorStatement(errorStatement) + } + final override fun visitErrorTypeRef(errorTypeRef: FirErrorTypeRef, data: Nothing?) { visitErrorTypeRef(errorTypeRef) }