FIR resolve: support synthetics discrimination

This commit is contained in:
Simon Ogorodnik
2019-04-15 16:00:10 +03:00
committed by Mikhail Glukhikh
parent 49883d1d87
commit 8d4cbd84e3
4 changed files with 17 additions and 8 deletions
@@ -79,6 +79,14 @@ internal object CheckArguments : CheckerStage() {
sink.reportApplicability(CandidateApplicability.INAPPLICABLE)
}
}
}
internal object DiscriminateSynthetics : CheckerStage() {
override fun check(candidate: Candidate, sink: CheckerSink, callInfo: CallInfo) {
if (candidate.symbol is SyntheticSymbol) {
sink.reportApplicability(CandidateApplicability.SYNTHETIC_RESOLVED)
}
}
}
@@ -90,6 +98,6 @@ internal fun functionCallResolutionSequence() = listOf(
internal fun qualifiedAccessResolutionSequence() = listOf(
CheckExplicitReceiverConsistency, CheckReceivers.Dispatch, CheckReceivers.Extension,
DiscriminateSynthetics, CheckExplicitReceiverConsistency, CheckReceivers.Dispatch, CheckReceivers.Extension,
CreateFreshTypeVariableSubstitutorStage
)
@@ -14,13 +14,14 @@ import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator
import org.jetbrains.kotlin.fir.resolve.transformers.firSafeNullable
import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol
import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.ConeVariableSymbol
import org.jetbrains.kotlin.fir.symbols.*
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.name.Name
interface SyntheticSymbol : ConeSymbol
class SyntheticPropertySymbol(callableId: CallableId) : FirPropertySymbol(callableId), SyntheticSymbol
class FirSyntheticPropertiesScope(val session: FirSession, val baseScope: FirScope, val typeCalculator: ReturnTypeCalculator) : FirScope {
val synthetic: MutableMap<ConeCallableSymbol, ConeVariableSymbol> = mutableMapOf()
@@ -36,7 +37,7 @@ class FirSyntheticPropertiesScope(val session: FirSession, val baseScope: FirSco
if (fir.typeParameters.isNotEmpty()) return ProcessorAction.NEXT
if (fir.valueParameters.isNotEmpty()) return ProcessorAction.NEXT
val synthetic = FirPropertySymbol(CallableId(symbol.callableId.packageName, symbol.callableId.className, name))
val synthetic = SyntheticPropertySymbol(CallableId(symbol.callableId.packageName, symbol.callableId.className, name))
val returnTypeRef = typeCalculator.tryCalculateReturnType(fir)
FirMemberPropertyImpl(
@@ -373,7 +373,7 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn
candidates.isEmpty() -> FirErrorNamedReference(
namedReference.session, namedReference.psi, "Unresolved name: $name"
)
applicability < CandidateApplicability.RESOLVED -> {
applicability < CandidateApplicability.SYNTHETIC_RESOLVED -> {
FirErrorNamedReference(
namedReference.session,
namedReference.psi,
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.fir.symbols.ConePropertySymbol
import org.jetbrains.kotlin.fir.symbols.ConeVariableSymbol
import org.jetbrains.kotlin.name.Name
class FirPropertySymbol(callableId: CallableId) : FirVariableSymbol(callableId), ConePropertySymbol
open class FirPropertySymbol(callableId: CallableId) : FirVariableSymbol(callableId), ConePropertySymbol
open class FirVariableSymbol(override val callableId: CallableId) : ConeVariableSymbol, FirCallableSymbol() {