FIR resolve: make receiver completion run independent from outer call
This commit is contained in:
committed by
Mikhail Glukhikh
parent
adb135d036
commit
dc4ccf8d23
+5
-1
@@ -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
|
||||
}
|
||||
}
|
||||
+5
@@ -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
|
||||
}
|
||||
}
|
||||
+7
-4
@@ -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
|
||||
}
|
||||
}
|
||||
+5
@@ -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"))
|
||||
|
||||
|
||||
+4
@@ -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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user