FIR resolve: make receiver completion run independent from outer call

This commit is contained in:
Simon Ogorodnik
2019-04-23 04:15:01 +03:00
committed by Mikhail Glukhikh
parent adb135d036
commit dc4ccf8d23
10 changed files with 50 additions and 9 deletions
@@ -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
@@ -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<FirClassImpl>.transformChildren(transformer, data)
}
override fun <D> transformArguments(transformer: FirTransformer<D>, data: D): FirCall {
arguments.transformInplace(transformer, data)
return this
}
}
@@ -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 <D> transformArguments(transformer: FirTransformer<D>, data: D): FirCall
}
@@ -26,4 +26,6 @@ interface FirQualifiedAccess : FirStatement {
explicitReceiver?.accept(visitor, data)
super.acceptChildren(visitor, data)
}
fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccess
}
@@ -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<FirAbstractExpression>.transformChildren(transformer, data)
}
override fun <D> transformArguments(transformer: FirTransformer<D>, data: D): FirCall {
arguments.transformInplace(transformer, data)
return this
}
}
@@ -30,4 +30,9 @@ abstract class FirAbstractQualifiedAccess(
calleeReference = calleeReference.transformSingle(transformer, data)
return this
}
override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccess {
explicitReceiver = explicitReceiver?.transformSingle(transformer, data)
return this
}
}
@@ -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<FirAbstractAssignment>.transformChildren(transformer, data)
}
override fun <D> transformArguments(transformer: FirTransformer<D>, data: D): FirCall {
rValue = rValue.transformSingle(transformer, data)
indexes.transformInplace(transformer, data)
return this
}
}
@@ -24,6 +24,11 @@ class FirComponentCallImpl(
override val componentIndex: Int,
override var explicitReceiver: FirExpression
) : FirAbstractCall(session, psi), FirComponentCall {
override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccess {
explicitReceiver = explicitReceiver.transformSingle(transformer, data)
return this
}
override var calleeReference: FirNamedReference =
FirSimpleNamedReference(session, psi, Name.identifier("component$componentIndex"))
@@ -39,5 +39,9 @@ class FirDelegatedConstructorCallImpl(
return super<FirAbstractCall>.transformChildren(transformer, data)
}
override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccess {
return this
}
override var typeRef: FirTypeRef = FirImplicitUnitTypeRef(session, psi)
}
@@ -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 <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirQualifiedAccess {
explicitReceiver = explicitReceiver?.transformSingle(transformer, data)
return this
}
}