[FIR] Introduce extension unwrapFakeOverridesOrDelegated()
This commit is contained in:
committed by
Space Team
parent
35dfcb61bb
commit
d20ad67aa9
+1
-1
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
|
||||
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
|
||||
import org.jetbrains.kotlin.fir.scopes.getDirectOverriddenMembers
|
||||
import org.jetbrains.kotlin.fir.scopes.getDirectOverriddenProperties
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.delegatedWrapperData
|
||||
import org.jetbrains.kotlin.fir.delegatedWrapperData
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.toConeType
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.ConeErrorType
|
||||
|
||||
+1
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.fir.containingClassLookupTag
|
||||
import org.jetbrains.kotlin.fir.declarations.FirClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.*
|
||||
import org.jetbrains.kotlin.fir.delegatedWrapperData
|
||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||
import org.jetbrains.kotlin.fir.scopes.MemberWithBaseScope
|
||||
import org.jetbrains.kotlin.fir.scopes.getDirectOverriddenMembersWithBaseScope
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.modality
|
||||
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
||||
import org.jetbrains.kotlin.fir.scopes.*
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.delegatedWrapperData
|
||||
import org.jetbrains.kotlin.fir.delegatedWrapperData
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
||||
|
||||
+2
-13
@@ -7,16 +7,17 @@ package org.jetbrains.kotlin.fir.scopes.impl
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.fir.DelegatedWrapperData
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.modality
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.visibility
|
||||
import org.jetbrains.kotlin.fir.delegatedWrapperData
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.resolve.defaultType
|
||||
import org.jetbrains.kotlin.fir.resolve.scope
|
||||
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
||||
import org.jetbrains.kotlin.fir.scopes.*
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
||||
import org.jetbrains.kotlin.fir.types.ConeFlexibleType
|
||||
@@ -206,18 +207,6 @@ var FirCallableDeclaration.multipleDelegatesWithTheSameSignature: Boolean? by Fi
|
||||
val FirCallableSymbol<*>.multipleDelegatesWithTheSameSignature: Boolean?
|
||||
get() = fir.multipleDelegatesWithTheSameSignature
|
||||
|
||||
private object DelegatedWrapperDataKey : FirDeclarationDataKey()
|
||||
class DelegatedWrapperData<D : FirCallableDeclaration>(
|
||||
val wrapped: D,
|
||||
val containingClass: ConeClassLikeLookupTag,
|
||||
val delegateField: FirField,
|
||||
)
|
||||
var <D : FirCallableDeclaration>
|
||||
D.delegatedWrapperData: DelegatedWrapperData<D>? by FirDeclarationDataRegistry.data(DelegatedWrapperDataKey)
|
||||
|
||||
val <D : FirCallableDeclaration> FirCallableSymbol<out D>.delegatedWrapperData: DelegatedWrapperData<D>?
|
||||
get() = fir.delegatedWrapperData
|
||||
|
||||
|
||||
// From the definition of function interfaces in the Java specification (pt. 9.8):
|
||||
// "methods that are members of I that do not have the same signature as any public instance method of the class Object"
|
||||
|
||||
@@ -29,7 +29,6 @@ import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.resultType
|
||||
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.delegatedWrapperData
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.importedFromObjectOrStaticData
|
||||
import org.jetbrains.kotlin.fir.scopes.processOverriddenFunctions
|
||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
@@ -556,14 +555,12 @@ fun FirFunction.getAsForbiddenNamedArgumentsTarget(
|
||||
if (hasStableParameterNames) return null
|
||||
|
||||
return when (origin) {
|
||||
FirDeclarationOrigin.Delegated -> delegatedWrapperData?.wrapped?.getAsForbiddenNamedArgumentsTarget(session)
|
||||
|
||||
FirDeclarationOrigin.ImportedFromObjectOrStatic ->
|
||||
importedFromObjectOrStaticData?.original?.getAsForbiddenNamedArgumentsTarget(session)
|
||||
|
||||
FirDeclarationOrigin.IntersectionOverride, FirDeclarationOrigin.SubstitutionOverride -> {
|
||||
FirDeclarationOrigin.IntersectionOverride, FirDeclarationOrigin.SubstitutionOverride, FirDeclarationOrigin.Delegated -> {
|
||||
var result: ForbiddenNamedArgumentsTarget? =
|
||||
originalIfFakeOverride()?.getAsForbiddenNamedArgumentsTarget(session) ?: return null
|
||||
unwrapFakeOverridesOrDelegated().getAsForbiddenNamedArgumentsTarget(session) ?: return null
|
||||
originScope?.processOverriddenFunctions(symbol as FirNamedFunctionSymbol) {
|
||||
if (it.fir.getAsForbiddenNamedArgumentsTarget(session) == null) {
|
||||
result = null
|
||||
|
||||
+1
-1
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculatorForFull
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.contracts.runContractResolveForLocalClass
|
||||
import org.jetbrains.kotlin.fir.scopes.FakeOverrideTypeCalculator
|
||||
import org.jetbrains.kotlin.fir.scopes.fakeOverrideSubstitution
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.delegatedWrapperData
|
||||
import org.jetbrains.kotlin.fir.delegatedWrapperData
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
|
||||
|
||||
@@ -78,6 +78,9 @@ inline val <reified S : FirCallableSymbol<*>> S.baseForIntersectionOverride: S?
|
||||
inline fun <reified D : FirCallableDeclaration> D.originalIfFakeOverride(): D? =
|
||||
originalForSubstitutionOverride ?: baseForIntersectionOverride
|
||||
|
||||
inline fun <reified D : FirCallableDeclaration> D.originalIfFakeOverrideOrDelegated(): D? =
|
||||
originalForSubstitutionOverride ?: baseForIntersectionOverride ?: delegatedWrapperData?.wrapped
|
||||
|
||||
inline fun <reified S : FirCallableSymbol<*>> S.originalIfFakeOverride(): S? =
|
||||
fir.originalIfFakeOverride()?.symbol as S?
|
||||
|
||||
@@ -100,6 +103,15 @@ inline fun <reified D : FirCallableDeclaration> D.unwrapFakeOverrides(): D {
|
||||
} while (true)
|
||||
}
|
||||
|
||||
inline fun <reified D : FirCallableDeclaration> D.unwrapFakeOverridesOrDelegated(): D {
|
||||
var current = this
|
||||
|
||||
do {
|
||||
val next = current.originalIfFakeOverrideOrDelegated() ?: return current
|
||||
current = next
|
||||
} while (true)
|
||||
}
|
||||
|
||||
inline fun <reified D : FirCallableDeclaration> D.unwrapSubstitutionOverrides(): D {
|
||||
var current = this
|
||||
|
||||
@@ -168,3 +180,16 @@ private object IsCatchParameterProperty : FirDeclarationDataKey()
|
||||
|
||||
var FirProperty.isCatchParameter: Boolean? by FirDeclarationDataRegistry.data(IsCatchParameterProperty)
|
||||
|
||||
private object DelegatedWrapperDataKey : FirDeclarationDataKey()
|
||||
|
||||
class DelegatedWrapperData<D : FirCallableDeclaration>(
|
||||
val wrapped: D,
|
||||
val containingClass: ConeClassLikeLookupTag,
|
||||
val delegateField: FirField,
|
||||
)
|
||||
|
||||
var <D : FirCallableDeclaration>
|
||||
D.delegatedWrapperData: DelegatedWrapperData<D>? by FirDeclarationDataRegistry.data(DelegatedWrapperDataKey)
|
||||
|
||||
val <D : FirCallableDeclaration> FirCallableSymbol<out D>.delegatedWrapperData: DelegatedWrapperData<D>?
|
||||
get() = fir.delegatedWrapperData
|
||||
|
||||
Reference in New Issue
Block a user