From dc4ccf8d2314df4b4a7e34662322309cba40d427 Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Tue, 23 Apr 2019 04:15:01 +0300 Subject: [PATCH] FIR resolve: make receiver completion run independent from outer call --- .../resolve/transformers/FirBodyResolveTransformer.kt | 6 +++++- .../kotlin/fir/declarations/impl/FirEnumEntryImpl.kt | 7 +++++++ .../org/jetbrains/kotlin/fir/expressions/FirCall.kt | 3 +++ .../kotlin/fir/expressions/FirQualifiedAccess.kt | 2 ++ .../kotlin/fir/expressions/impl/FirAbstractCall.kt | 10 ++++++---- .../expressions/impl/FirAbstractQualifiedAccess.kt | 5 +++++ .../fir/expressions/impl/FirArraySetCallImpl.kt | 11 +++++++---- .../fir/expressions/impl/FirComponentCallImpl.kt | 5 +++++ .../impl/FirDelegatedConstructorCallImpl.kt | 4 ++++ .../fir/expressions/impl/FirFunctionCallImpl.kt | 6 ++++++ 10 files changed, 50 insertions(+), 9 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 1b9debea6b1..15eb387baac 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 @@ -295,9 +295,13 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn } } + private val noExpectedType = FirImplicitTypeRefImpl(session, null) + private fun resolveCallAndSelectCandidate(functionCall: FirFunctionCall, expectedTypeRef: FirTypeRef?): FirFunctionCall { - val functionCall = functionCall.transformChildren(this, null) as FirFunctionCall + val functionCall = + (functionCall.transformExplicitReceiver(this, noExpectedType) as FirFunctionCall) + .transformArguments(this, null) as FirFunctionCall val name = functionCall.calleeReference.name 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 34bc2b2d82b..9ad6c9daea4 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 @@ -12,6 +12,7 @@ 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.FirCall import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.transformInplace @@ -55,4 +56,10 @@ class FirEnumEntryImpl( return super.transformChildren(transformer, data) } + + override fun transformArguments(transformer: FirTransformer, data: D): FirCall { + arguments.transformInplace(transformer, data) + + return this + } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirCall.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirCall.kt index 5b16cfdbc21..2dea4989307 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirCall.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirCall.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.expressions import org.jetbrains.kotlin.fir.BaseTransformedType +import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirVisitor @BaseTransformedType @@ -21,4 +22,6 @@ interface FirCall : FirExpression { } super.acceptChildren(visitor, data) } + + fun transformArguments(transformer: FirTransformer, data: D): FirCall } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccess.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccess.kt index 87dcc3d664e..d5163dcacae 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccess.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccess.kt @@ -26,4 +26,6 @@ interface FirQualifiedAccess : FirStatement { explicitReceiver?.accept(visitor, data) super.acceptChildren(visitor, data) } + + fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirQualifiedAccess } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractCall.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractCall.kt index 7acd2336ee2..b6285d217fc 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractCall.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractCall.kt @@ -6,12 +6,9 @@ package org.jetbrains.kotlin.fir.expressions.impl import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.fir.FirAbstractElement -import org.jetbrains.kotlin.fir.FirElement -import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.expressions.FirCall import org.jetbrains.kotlin.fir.expressions.FirExpression -import org.jetbrains.kotlin.fir.transformInplace import org.jetbrains.kotlin.fir.visitors.FirTransformer abstract class FirAbstractCall( @@ -24,4 +21,9 @@ abstract class FirAbstractCall( arguments.transformInplace(transformer, data) return super.transformChildren(transformer, data) } + + override fun transformArguments(transformer: FirTransformer, data: D): FirCall { + arguments.transformInplace(transformer, data) + return this + } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractQualifiedAccess.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractQualifiedAccess.kt index ac5ba06b6c5..454f332a49b 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractQualifiedAccess.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractQualifiedAccess.kt @@ -30,4 +30,9 @@ abstract class FirAbstractQualifiedAccess( calleeReference = calleeReference.transformSingle(transformer, data) return this } + + override fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirQualifiedAccess { + explicitReceiver = explicitReceiver?.transformSingle(transformer, data) + return this + } } \ 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 6f4afb69157..12994e66484 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 @@ -8,10 +8,7 @@ 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.FirAnnotationCall -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.expressions.* import org.jetbrains.kotlin.fir.transformInplace import org.jetbrains.kotlin.fir.transformSingle import org.jetbrains.kotlin.fir.types.FirTypeRef @@ -42,4 +39,10 @@ class FirArraySetCallImpl( return super.transformChildren(transformer, data) } + + override fun transformArguments(transformer: FirTransformer, data: D): FirCall { + rValue = rValue.transformSingle(transformer, data) + indexes.transformInplace(transformer, data) + return this + } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirComponentCallImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirComponentCallImpl.kt index d8d9e4557d8..194056b6c9d 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirComponentCallImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirComponentCallImpl.kt @@ -24,6 +24,11 @@ class FirComponentCallImpl( override val componentIndex: Int, override var explicitReceiver: FirExpression ) : FirAbstractCall(session, psi), FirComponentCall { + override fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirQualifiedAccess { + explicitReceiver = explicitReceiver.transformSingle(transformer, data) + return this + } + override var calleeReference: FirNamedReference = FirSimpleNamedReference(session, psi, Name.identifier("component$componentIndex")) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirDelegatedConstructorCallImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirDelegatedConstructorCallImpl.kt index a7f242b7900..d377756beeb 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirDelegatedConstructorCallImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirDelegatedConstructorCallImpl.kt @@ -39,5 +39,9 @@ class FirDelegatedConstructorCallImpl( return super.transformChildren(transformer, data) } + override fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirQualifiedAccess { + return this + } + override var typeRef: FirTypeRef = FirImplicitUnitTypeRef(session, psi) } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirFunctionCallImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirFunctionCallImpl.kt index 0cb67ade37f..418bbfebc74 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirFunctionCallImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirFunctionCallImpl.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.expressions.impl import com.intellij.psi.PsiElement import org.jetbrains.kotlin.fir.* +import org.jetbrains.kotlin.fir.expressions.FirCall import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess @@ -35,4 +36,9 @@ class FirFunctionCallImpl( calleeReference = calleeReference.transformSingle(transformer, data) return this } + + override fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirQualifiedAccess { + explicitReceiver = explicitReceiver?.transformSingle(transformer, data) + return this + } } \ No newline at end of file