FIR resolve: support synthetics discrimination
This commit is contained in:
committed by
Mikhail Glukhikh
parent
49883d1d87
commit
8d4cbd84e3
@@ -79,6 +79,14 @@ internal object CheckArguments : CheckerStage() {
|
|||||||
sink.reportApplicability(CandidateApplicability.INAPPLICABLE)
|
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(
|
internal fun qualifiedAccessResolutionSequence() = listOf(
|
||||||
CheckExplicitReceiverConsistency, CheckReceivers.Dispatch, CheckReceivers.Extension,
|
DiscriminateSynthetics, CheckExplicitReceiverConsistency, CheckReceivers.Dispatch, CheckReceivers.Extension,
|
||||||
CreateFreshTypeVariableSubstitutorStage
|
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.resolve.transformers.firSafeNullable
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||||
import org.jetbrains.kotlin.fir.symbols.CallableId
|
import org.jetbrains.kotlin.fir.symbols.*
|
||||||
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.impl.FirPropertySymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||||
import org.jetbrains.kotlin.name.Name
|
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 {
|
class FirSyntheticPropertiesScope(val session: FirSession, val baseScope: FirScope, val typeCalculator: ReturnTypeCalculator) : FirScope {
|
||||||
|
|
||||||
val synthetic: MutableMap<ConeCallableSymbol, ConeVariableSymbol> = mutableMapOf()
|
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.typeParameters.isNotEmpty()) return ProcessorAction.NEXT
|
||||||
if (fir.valueParameters.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)
|
val returnTypeRef = typeCalculator.tryCalculateReturnType(fir)
|
||||||
FirMemberPropertyImpl(
|
FirMemberPropertyImpl(
|
||||||
|
|||||||
+1
-1
@@ -373,7 +373,7 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn
|
|||||||
candidates.isEmpty() -> FirErrorNamedReference(
|
candidates.isEmpty() -> FirErrorNamedReference(
|
||||||
namedReference.session, namedReference.psi, "Unresolved name: $name"
|
namedReference.session, namedReference.psi, "Unresolved name: $name"
|
||||||
)
|
)
|
||||||
applicability < CandidateApplicability.RESOLVED -> {
|
applicability < CandidateApplicability.SYNTHETIC_RESOLVED -> {
|
||||||
FirErrorNamedReference(
|
FirErrorNamedReference(
|
||||||
namedReference.session,
|
namedReference.session,
|
||||||
namedReference.psi,
|
namedReference.psi,
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.fir.symbols.ConePropertySymbol
|
|||||||
import org.jetbrains.kotlin.fir.symbols.ConeVariableSymbol
|
import org.jetbrains.kotlin.fir.symbols.ConeVariableSymbol
|
||||||
import org.jetbrains.kotlin.name.Name
|
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() {
|
open class FirVariableSymbol(override val callableId: CallableId) : ConeVariableSymbol, FirCallableSymbol() {
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user