From 8d4cbd84e303dcd977af5f5f9eff396e511ca38b Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Mon, 15 Apr 2019 16:00:10 +0300 Subject: [PATCH] FIR resolve: support synthetics discrimination --- .../kotlin/fir/resolve/calls/ResolverParts.kt | 10 +++++++++- .../jetbrains/kotlin/fir/resolve/calls/Synthetics.kt | 11 ++++++----- .../resolve/transformers/FirBodyResolveTransformer.kt | 2 +- .../kotlin/fir/symbols/impl/FirPropertySymbol.kt | 2 +- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolverParts.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolverParts.kt index b7f62438bbb..90101bfb5d5 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolverParts.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolverParts.kt @@ -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 ) \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Synthetics.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Synthetics.kt index b78a2ae219d..1cc9d0ef6fa 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Synthetics.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Synthetics.kt @@ -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 = 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( 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 6d27085c496..dd8fa7a0f98 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 @@ -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, diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirPropertySymbol.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirPropertySymbol.kt index 9ca7a16e475..f2a7c5c4cc9 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirPropertySymbol.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirPropertySymbol.kt @@ -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() {