From c8003518a508722e2c281a5b0e0273bb0daf06fb Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 17 Jun 2019 14:24:41 +0300 Subject: [PATCH] FIR: set super type reference properly --- .../transformers/FirBodyResolveTransformer.kt | 14 +++++++++----- .../org/jetbrains/kotlin/fir/FirSuperReference.kt | 2 ++ .../fir/references/FirExplicitSuperReference.kt | 4 ++++ .../testData/ir/irText/classes/superCalls.fir.txt | 6 +++--- 4 files changed, 18 insertions(+), 8 deletions(-) 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 60d7315a72b..a73c98d6341 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 @@ -376,11 +376,15 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn qualifiedAccessExpression.resultType = FirResolvedTypeRefImpl(session, null, type, emptyList()) } is FirSuperReference -> { - qualifiedAccessExpression.resultType = - callee.superTypeRef as? FirResolvedTypeRef - ?: implicitReceiverStack.filterIsInstance().lastOrNull() - ?.boundSymbol?.fir?.superTypeRefs?.firstOrNull() - ?: FirErrorTypeRefImpl(session, qualifiedAccessExpression.psi, "No super type") + if (callee.superTypeRef is FirResolvedTypeRef) { + qualifiedAccessExpression.resultType = callee.superTypeRef + } else { + val superTypeRef = implicitReceiverStack.filterIsInstance().lastOrNull() + ?.boundSymbol?.fir?.superTypeRefs?.firstOrNull() + ?: FirErrorTypeRefImpl(session, qualifiedAccessExpression.psi, "No super type") + qualifiedAccessExpression.resultType = superTypeRef + callee.replaceSuperTypeRef(superTypeRef) + } } is FirResolvedCallableReference -> { if (qualifiedAccessExpression.typeRef !is FirResolvedTypeRef) { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSuperReference.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSuperReference.kt index 7c44dde4cdb..bdf8778b476 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSuperReference.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSuperReference.kt @@ -11,6 +11,8 @@ import org.jetbrains.kotlin.fir.visitors.FirVisitor interface FirSuperReference : FirReference { val superTypeRef: FirTypeRef + fun replaceSuperTypeRef(newSuperTypeRef: FirTypeRef) + override fun accept(visitor: FirVisitor, data: D): R = visitor.visitSuperReference(this, data) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/FirExplicitSuperReference.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/FirExplicitSuperReference.kt index abaf60cbf48..c4ba0296041 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/FirExplicitSuperReference.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/FirExplicitSuperReference.kt @@ -15,6 +15,10 @@ class FirExplicitSuperReference( psi: PsiElement?, override var superTypeRef: FirTypeRef ) : FirAbstractElement(session, psi), FirSuperReference { + override fun replaceSuperTypeRef(newSuperTypeRef: FirTypeRef) { + superTypeRef = newSuperTypeRef + } + override fun transformChildren(transformer: FirTransformer, data: D): FirElement { superTypeRef = superTypeRef.transformSingle(transformer, data) return this diff --git a/compiler/testData/ir/irText/classes/superCalls.fir.txt b/compiler/testData/ir/irText/classes/superCalls.fir.txt index 0a17c1f47cd..44ad247076f 100644 --- a/compiler/testData/ir/irText/classes/superCalls.fir.txt +++ b/compiler/testData/ir/irText/classes/superCalls.fir.txt @@ -24,7 +24,7 @@ FILE fqName: fileName:/superCalls.kt BLOCK_BODY RETURN type=kotlin.Nothing from='public open fun hashCode (): kotlin.Int declared in .Base' CALL 'public open fun hashCode (): kotlin.Int declared in kotlin.Any' type=kotlin.Int origin=null - $this: ERROR_CALL 'Unresolved reference: super<>' type=kotlin.Any + $this: ERROR_CALL 'Unresolved reference: super' type=kotlin.Any FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean overridden: public open fun equals (other: kotlin.Any?): kotlin.Boolean declared in kotlin.Any @@ -44,7 +44,7 @@ FILE fqName: fileName:/superCalls.kt $this: VALUE_PARAMETER name: type:.Derived BLOCK_BODY CALL 'public open fun foo (): kotlin.Unit declared in .Base' type=kotlin.Unit origin=null - $this: ERROR_CALL 'Unresolved reference: super<>' type=.Base + $this: ERROR_CALL 'Unresolved reference: super' type=.Base PROPERTY name:bar visibility:public modality:FINAL [val] FUN name: visibility:public modality:FINAL <> ($this:.Derived) returnType:kotlin.String correspondingProperty: PROPERTY name:bar visibility:public modality:FINAL [val] @@ -52,7 +52,7 @@ FILE fqName: fileName:/superCalls.kt BLOCK_BODY RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in .Derived' CALL 'public open fun (): kotlin.String declared in .Base' type=kotlin.String origin=null - $this: ERROR_CALL 'Unresolved reference: super<>' type=.Base + $this: ERROR_CALL 'Unresolved reference: super' type=.Base FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:.Base) returnType:kotlin.Int overridden: public open fun hashCode (): kotlin.Int declared in .Base