FIR: introduce synthetic property symbol hierarchy
This commit is contained in:
committed by
TeamCityServer
parent
c673c4cc91
commit
79b98f9173
+2
-2
@@ -33,7 +33,7 @@ import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
|
|||||||
import org.jetbrains.kotlin.analysis.api.fir.buildSymbol
|
import org.jetbrains.kotlin.analysis.api.fir.buildSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirPackageSymbol
|
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirPackageSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirAccessorSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
@@ -89,7 +89,7 @@ internal object FirReferenceResolveHelper {
|
|||||||
}
|
}
|
||||||
is FirResolvedNamedReference -> {
|
is FirResolvedNamedReference -> {
|
||||||
val fir = when (val symbol = resolvedSymbol) {
|
val fir = when (val symbol = resolvedSymbol) {
|
||||||
is FirAccessorSymbol -> {
|
is FirSyntheticPropertySymbol -> {
|
||||||
val syntheticProperty = symbol.fir as FirSyntheticProperty
|
val syntheticProperty = symbol.fir as FirSyntheticProperty
|
||||||
if (syntheticProperty.getter.delegate.symbol.callableId == symbol.getterId) {
|
if (syntheticProperty.getter.delegate.symbol.callableId == symbol.getterId) {
|
||||||
syntheticProperty.getter.delegate
|
syntheticProperty.getter.delegate
|
||||||
|
|||||||
+1
-1
@@ -75,7 +75,7 @@ internal class FirIdeProvider(
|
|||||||
symbol.fir.originalForSubstitutionOverride?.symbol?.let {
|
symbol.fir.originalForSubstitutionOverride?.symbol?.let {
|
||||||
return getFirCallableContainerFile(it)
|
return getFirCallableContainerFile(it)
|
||||||
}
|
}
|
||||||
if (symbol is FirAccessorSymbol) {
|
if (symbol is FirSyntheticPropertySymbol) {
|
||||||
val fir = symbol.fir
|
val fir = symbol.fir
|
||||||
if (fir is FirSyntheticProperty) {
|
if (fir is FirSyntheticProperty) {
|
||||||
return getFirCallableContainerFile(fir.getter.delegate.symbol)
|
return getFirCallableContainerFile(fir.getter.delegate.symbol)
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
|||||||
import org.jetbrains.kotlin.fir.references.FirThisReference
|
import org.jetbrains.kotlin.fir.references.FirThisReference
|
||||||
import org.jetbrains.kotlin.fir.references.impl.FirPropertyFromParameterResolvedNamedReference
|
import org.jetbrains.kotlin.fir.references.impl.FirPropertyFromParameterResolvedNamedReference
|
||||||
import org.jetbrains.kotlin.fir.resolve.*
|
import org.jetbrains.kotlin.fir.resolve.*
|
||||||
import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticPropertySymbol
|
import org.jetbrains.kotlin.fir.resolve.calls.FirSimpleSyntheticPropertySymbol
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
|
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
|
||||||
@@ -188,7 +188,7 @@ fun FirReference.toSymbolForCall(
|
|||||||
private fun FirCallableSymbol<*>.toSymbolForCall(declarationStorage: Fir2IrDeclarationStorage, preferGetter: Boolean): IrSymbol? =
|
private fun FirCallableSymbol<*>.toSymbolForCall(declarationStorage: Fir2IrDeclarationStorage, preferGetter: Boolean): IrSymbol? =
|
||||||
when (this) {
|
when (this) {
|
||||||
is FirFunctionSymbol<*> -> declarationStorage.getIrFunctionSymbol(this)
|
is FirFunctionSymbol<*> -> declarationStorage.getIrFunctionSymbol(this)
|
||||||
is FirSyntheticPropertySymbol -> {
|
is FirSimpleSyntheticPropertySymbol -> {
|
||||||
(fir as? FirSyntheticProperty)?.let { syntheticProperty ->
|
(fir as? FirSyntheticProperty)?.let { syntheticProperty ->
|
||||||
val delegateSymbol = if (preferGetter) {
|
val delegateSymbol = if (preferGetter) {
|
||||||
syntheticProperty.getter.delegate.symbol
|
syntheticProperty.getter.delegate.symbol
|
||||||
@@ -451,7 +451,7 @@ internal fun FirReference.statementOrigin(): IrStatementOrigin? {
|
|||||||
return when (this) {
|
return when (this) {
|
||||||
is FirPropertyFromParameterResolvedNamedReference -> IrStatementOrigin.INITIALIZE_PROPERTY_FROM_PARAMETER
|
is FirPropertyFromParameterResolvedNamedReference -> IrStatementOrigin.INITIALIZE_PROPERTY_FROM_PARAMETER
|
||||||
is FirResolvedNamedReference -> when (val symbol = resolvedSymbol) {
|
is FirResolvedNamedReference -> when (val symbol = resolvedSymbol) {
|
||||||
is FirAccessorSymbol -> IrStatementOrigin.GET_PROPERTY
|
is FirSyntheticPropertySymbol -> IrStatementOrigin.GET_PROPERTY
|
||||||
is FirNamedFunctionSymbol -> when {
|
is FirNamedFunctionSymbol -> when {
|
||||||
symbol.callableId.isInvoke() ->
|
symbol.callableId.isInvoke() ->
|
||||||
IrStatementOrigin.INVOKE
|
IrStatementOrigin.INVOKE
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
|||||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAccessor
|
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAccessor
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.visibility
|
import org.jetbrains.kotlin.fir.declarations.utils.visibility
|
||||||
import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticPropertySymbol
|
import org.jetbrains.kotlin.fir.resolve.calls.FirSimpleSyntheticPropertySymbol
|
||||||
import org.jetbrains.kotlin.fir.resolve.calls.ReceiverValue
|
import org.jetbrains.kotlin.fir.resolve.calls.ReceiverValue
|
||||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||||
@@ -45,7 +45,7 @@ object FirJavaVisibilityChecker : FirVisibilityChecker() {
|
|||||||
) return true
|
) return true
|
||||||
|
|
||||||
// FE1.0 allows calling public setters with property assignment syntax if the getter is protected.
|
// FE1.0 allows calling public setters with property assignment syntax if the getter is protected.
|
||||||
if (!isCallToPropertySetter || symbol !is FirSyntheticPropertySymbol) return false
|
if (!isCallToPropertySetter || symbol !is FirSimpleSyntheticPropertySymbol) return false
|
||||||
symbol.setterSymbol?.visibility == Visibilities.Public
|
symbol.setterSymbol?.visibility == Visibilities.Public
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-2
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.fir.java.FirJavaTypeConversionMode
|
|||||||
import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack
|
import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack
|
||||||
import org.jetbrains.kotlin.fir.java.declarations.*
|
import org.jetbrains.kotlin.fir.java.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.java.resolveIfJavaType
|
import org.jetbrains.kotlin.fir.java.resolveIfJavaType
|
||||||
|
import org.jetbrains.kotlin.fir.java.symbols.FirJavaOverriddenSyntheticPropertySymbol
|
||||||
import org.jetbrains.kotlin.fir.java.toConeKotlinTypeProbablyFlexible
|
import org.jetbrains.kotlin.fir.java.toConeKotlinTypeProbablyFlexible
|
||||||
import org.jetbrains.kotlin.fir.scopes.jvm.computeJvmDescriptor
|
import org.jetbrains.kotlin.fir.scopes.jvm.computeJvmDescriptor
|
||||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
||||||
@@ -154,7 +155,7 @@ class FirSignatureEnhancement(
|
|||||||
return buildSyntheticProperty {
|
return buildSyntheticProperty {
|
||||||
moduleData = this@FirSignatureEnhancement.moduleData
|
moduleData = this@FirSignatureEnhancement.moduleData
|
||||||
this.name = name
|
this.name = name
|
||||||
symbol = FirAccessorSymbol(accessorSymbol.callableId, accessorSymbol.getterId)
|
symbol = FirJavaOverriddenSyntheticPropertySymbol(accessorSymbol.callableId, accessorSymbol.getterId)
|
||||||
delegateGetter = enhancedGetterSymbol.fir as FirSimpleFunction
|
delegateGetter = enhancedGetterSymbol.fir as FirSimpleFunction
|
||||||
delegateSetter = enhancedSetterSymbol?.fir as FirSimpleFunction?
|
delegateSetter = enhancedSetterSymbol?.fir as FirSimpleFunction?
|
||||||
status = firElement.status
|
status = firElement.status
|
||||||
@@ -162,7 +163,7 @@ class FirSignatureEnhancement(
|
|||||||
}.symbol
|
}.symbol
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
if (original is FirPropertySymbol || original is FirAccessorSymbol) return original
|
if (original is FirPropertySymbol || original is FirSyntheticPropertySymbol) return original
|
||||||
error("Can't make enhancement for $original: `${firElement.render()}`")
|
error("Can't make enhancement for $original: `${firElement.render()}`")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.fir.copy
|
|||||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAccessor
|
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAccessor
|
||||||
import org.jetbrains.kotlin.fir.moduleData
|
import org.jetbrains.kotlin.fir.java.symbols.FirJavaOverriddenSyntheticPropertySymbol
|
||||||
import org.jetbrains.kotlin.fir.nullableModuleData
|
import org.jetbrains.kotlin.fir.nullableModuleData
|
||||||
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
|
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
|
||||||
@@ -45,7 +45,7 @@ class JavaAnnotationSyntheticPropertiesScope(
|
|||||||
val function = functionSymbol.fir
|
val function = functionSymbol.fir
|
||||||
val symbol = syntheticPropertiesCache.getOrPut(functionSymbol) {
|
val symbol = syntheticPropertiesCache.getOrPut(functionSymbol) {
|
||||||
val callableId = CallableId(classId, name)
|
val callableId = CallableId(classId, name)
|
||||||
FirAccessorSymbol(callableId, callableId).also {
|
FirJavaOverriddenSyntheticPropertySymbol(callableId, callableId).also {
|
||||||
val accessor = FirSyntheticPropertyAccessor(function, isGetter = true)
|
val accessor = FirSyntheticPropertyAccessor(function, isGetter = true)
|
||||||
FirSyntheticProperty(
|
FirSyntheticProperty(
|
||||||
session.nullableModuleData ?: function.moduleData,
|
session.nullableModuleData ?: function.moduleData,
|
||||||
|
|||||||
+4
-3
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.superConeTypes
|
|||||||
import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass
|
import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass
|
||||||
import org.jetbrains.kotlin.fir.java.declarations.buildJavaMethodCopy
|
import org.jetbrains.kotlin.fir.java.declarations.buildJavaMethodCopy
|
||||||
import org.jetbrains.kotlin.fir.java.declarations.buildJavaValueParameterCopy
|
import org.jetbrains.kotlin.fir.java.declarations.buildJavaValueParameterCopy
|
||||||
|
import org.jetbrains.kotlin.fir.java.symbols.FirJavaOverriddenSyntheticPropertySymbol
|
||||||
import org.jetbrains.kotlin.fir.java.toConeKotlinTypeProbablyFlexible
|
import org.jetbrains.kotlin.fir.java.toConeKotlinTypeProbablyFlexible
|
||||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||||
import org.jetbrains.kotlin.fir.scopes.*
|
import org.jetbrains.kotlin.fir.scopes.*
|
||||||
@@ -50,7 +51,7 @@ class JavaClassUseSiteMemberScope(
|
|||||||
) {
|
) {
|
||||||
private val typeParameterStack = klass.javaTypeParameterStack
|
private val typeParameterStack = klass.javaTypeParameterStack
|
||||||
private val specialFunctions = hashMapOf<Name, Collection<FirNamedFunctionSymbol>>()
|
private val specialFunctions = hashMapOf<Name, Collection<FirNamedFunctionSymbol>>()
|
||||||
private val accessorByNameMap = hashMapOf<Name, FirAccessorSymbol>()
|
private val accessorByNameMap = hashMapOf<Name, FirSyntheticPropertySymbol>()
|
||||||
|
|
||||||
private val canUseSpecialGetters: Boolean by lazy { !klass.hasKotlinSuper(session) }
|
private val canUseSpecialGetters: Boolean by lazy { !klass.hasKotlinSuper(session) }
|
||||||
|
|
||||||
@@ -69,12 +70,12 @@ class JavaClassUseSiteMemberScope(
|
|||||||
setterSymbol: FirNamedFunctionSymbol?,
|
setterSymbol: FirNamedFunctionSymbol?,
|
||||||
property: FirProperty,
|
property: FirProperty,
|
||||||
takeModalityFromGetter: Boolean,
|
takeModalityFromGetter: Boolean,
|
||||||
): FirAccessorSymbol {
|
): FirSyntheticPropertySymbol {
|
||||||
return accessorByNameMap.getOrPut(property.name) {
|
return accessorByNameMap.getOrPut(property.name) {
|
||||||
buildSyntheticProperty {
|
buildSyntheticProperty {
|
||||||
moduleData = session.moduleData
|
moduleData = session.moduleData
|
||||||
name = property.name
|
name = property.name
|
||||||
symbol = FirAccessorSymbol(
|
symbol = FirJavaOverriddenSyntheticPropertySymbol(
|
||||||
getterId = getterSymbol.callableId,
|
getterId = getterSymbol.callableId,
|
||||||
propertyId = CallableId(getterSymbol.callableId.packageName, getterSymbol.callableId.className, property.name)
|
propertyId = CallableId(getterSymbol.callableId.packageName, getterSymbol.callableId.className, property.name)
|
||||||
)
|
)
|
||||||
|
|||||||
+35
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.java.symbols
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol
|
||||||
|
import org.jetbrains.kotlin.name.CallableId
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a synthetic property symbol created for Java getter overriding Kotlin property.
|
||||||
|
*
|
||||||
|
* Frontend IR creates such kind a symbol when a Java class is asked for a property which
|
||||||
|
* exists in one of its base Kotlin classes, and the Java class itself contains the bound getter.
|
||||||
|
*
|
||||||
|
* The typical example:
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* abstract class SomeKotlinClass {
|
||||||
|
* abstract val foo: Int
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* public class SomeJavaClass extends SomeKotlinClass {
|
||||||
|
* @Override
|
||||||
|
* public int getFoo() { return 42; }
|
||||||
|
* }
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
|
class FirJavaOverriddenSyntheticPropertySymbol(
|
||||||
|
propertyId: CallableId,
|
||||||
|
getterId: CallableId
|
||||||
|
) : FirSyntheticPropertySymbol(propertyId, getterId) {
|
||||||
|
override fun copy(): FirSyntheticPropertySymbol = FirJavaOverriddenSyntheticPropertySymbol(callableId, getterId)
|
||||||
|
}
|
||||||
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty
|
|||||||
import org.jetbrains.kotlin.fir.declarations.utils.isStatic
|
import org.jetbrains.kotlin.fir.declarations.utils.isStatic
|
||||||
import org.jetbrains.kotlin.fir.scopes.*
|
import org.jetbrains.kotlin.fir.scopes.*
|
||||||
import org.jetbrains.kotlin.fir.symbols.SyntheticSymbol
|
import org.jetbrains.kotlin.fir.symbols.SyntheticSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirAccessorSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||||
@@ -27,10 +27,18 @@ import org.jetbrains.kotlin.name.Name
|
|||||||
import org.jetbrains.kotlin.name.StandardClassIds
|
import org.jetbrains.kotlin.name.StandardClassIds
|
||||||
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
||||||
|
|
||||||
class FirSyntheticPropertySymbol(
|
/**
|
||||||
|
* This symbol is bound to a synthetic property based on Java getter/setter call
|
||||||
|
*
|
||||||
|
* See details about such properties here: https://kotlinlang.org/docs/java-interop.html#getters-and-setters).
|
||||||
|
* Frontend IR creates this kind of symbol each time when x.foo should be resolved to x.getFoo() or x.setFoo().
|
||||||
|
*/
|
||||||
|
class FirSimpleSyntheticPropertySymbol(
|
||||||
propertyId: CallableId,
|
propertyId: CallableId,
|
||||||
getterId: CallableId
|
getterId: CallableId
|
||||||
) : FirAccessorSymbol(propertyId, getterId), SyntheticSymbol
|
) : FirSyntheticPropertySymbol(propertyId, getterId), SyntheticSymbol {
|
||||||
|
override fun copy(): FirSyntheticPropertySymbol = FirSimpleSyntheticPropertySymbol(callableId, getterId)
|
||||||
|
}
|
||||||
|
|
||||||
class FirSyntheticFunctionSymbol(
|
class FirSyntheticFunctionSymbol(
|
||||||
callableId: CallableId
|
callableId: CallableId
|
||||||
@@ -113,7 +121,7 @@ class FirSyntheticPropertiesScope(
|
|||||||
val property = buildSyntheticProperty {
|
val property = buildSyntheticProperty {
|
||||||
moduleData = session.moduleData
|
moduleData = session.moduleData
|
||||||
name = propertyName
|
name = propertyName
|
||||||
symbol = FirSyntheticPropertySymbol(
|
symbol = FirSimpleSyntheticPropertySymbol(
|
||||||
getterId = getterSymbol.callableId,
|
getterId = getterSymbol.callableId,
|
||||||
propertyId = CallableId(packageName, className, propertyName)
|
propertyId = CallableId(packageName, className, propertyName)
|
||||||
)
|
)
|
||||||
|
|||||||
+4
-4
@@ -43,7 +43,7 @@ class FirClassSubstitutionScope(
|
|||||||
get() = when (this) {
|
get() = when (this) {
|
||||||
is FirPropertySymbol,
|
is FirPropertySymbol,
|
||||||
is FirFieldSymbol,
|
is FirFieldSymbol,
|
||||||
is FirAccessorSymbol -> true
|
is FirSyntheticPropertySymbol -> true
|
||||||
else -> false
|
else -> false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -294,7 +294,7 @@ class FirClassSubstitutionScope(
|
|||||||
return FirFakeOverrideGenerator.createSubstitutionOverrideField(session, member, original, newReturnType, newOwnerClassId)
|
return FirFakeOverrideGenerator.createSubstitutionOverrideField(session, member, original, newReturnType, newOwnerClassId)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createSubstitutionOverrideAccessor(original: FirAccessorSymbol): FirAccessorSymbol {
|
fun createSubstitutionOverrideSyntheticProperty(original: FirSyntheticPropertySymbol): FirSyntheticPropertySymbol {
|
||||||
if (substitutor == ConeSubstitutor.Empty) return original
|
if (substitutor == ConeSubstitutor.Empty) return original
|
||||||
val member = original.fir as FirSyntheticProperty
|
val member = original.fir as FirSyntheticProperty
|
||||||
if (skipPrivateMembers && member.visibility == Visibilities.Private) return original
|
if (skipPrivateMembers && member.visibility == Visibilities.Private) return original
|
||||||
@@ -319,7 +319,7 @@ class FirClassSubstitutionScope(
|
|||||||
return original
|
return original
|
||||||
}
|
}
|
||||||
|
|
||||||
return FirFakeOverrideGenerator.createSubstitutionOverrideAccessor(
|
return FirFakeOverrideGenerator.createSubstitutionOverrideSyntheticProperty(
|
||||||
session,
|
session,
|
||||||
member,
|
member,
|
||||||
original,
|
original,
|
||||||
@@ -363,7 +363,7 @@ class FirSubstitutionOverrideStorage(val session: FirSession) : FirSessionCompon
|
|||||||
when (original) {
|
when (original) {
|
||||||
is FirPropertySymbol -> scope.createSubstitutionOverrideProperty(original)
|
is FirPropertySymbol -> scope.createSubstitutionOverrideProperty(original)
|
||||||
is FirFieldSymbol -> scope.createSubstitutionOverrideField(original)
|
is FirFieldSymbol -> scope.createSubstitutionOverrideField(original)
|
||||||
is FirAccessorSymbol -> scope.createSubstitutionOverrideAccessor(original)
|
is FirSyntheticPropertySymbol -> scope.createSubstitutionOverrideSyntheticProperty(original)
|
||||||
else -> error("symbol $original is not overridable")
|
else -> error("symbol $original is not overridable")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-4
@@ -425,16 +425,16 @@ object FirFakeOverrideGenerator {
|
|||||||
return symbol
|
return symbol
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createSubstitutionOverrideAccessor(
|
fun createSubstitutionOverrideSyntheticProperty(
|
||||||
session: FirSession,
|
session: FirSession,
|
||||||
baseProperty: FirSyntheticProperty,
|
baseProperty: FirSyntheticProperty,
|
||||||
baseSymbol: FirAccessorSymbol,
|
baseSymbol: FirSyntheticPropertySymbol,
|
||||||
newDispatchReceiverType: ConeKotlinType?,
|
newDispatchReceiverType: ConeKotlinType?,
|
||||||
newReturnType: ConeKotlinType?,
|
newReturnType: ConeKotlinType?,
|
||||||
newGetterParameterTypes: List<ConeKotlinType?>?,
|
newGetterParameterTypes: List<ConeKotlinType?>?,
|
||||||
newSetterParameterTypes: List<ConeKotlinType?>?,
|
newSetterParameterTypes: List<ConeKotlinType?>?,
|
||||||
fakeOverrideSubstitution: FakeOverrideSubstitution?
|
fakeOverrideSubstitution: FakeOverrideSubstitution?
|
||||||
): FirAccessorSymbol {
|
): FirSyntheticPropertySymbol {
|
||||||
val getterSymbol = FirNamedFunctionSymbol(baseSymbol.getterId)
|
val getterSymbol = FirNamedFunctionSymbol(baseSymbol.getterId)
|
||||||
val getter = createSubstitutionOverrideFunction(
|
val getter = createSubstitutionOverrideFunction(
|
||||||
getterSymbol,
|
getterSymbol,
|
||||||
@@ -463,7 +463,7 @@ object FirFakeOverrideGenerator {
|
|||||||
return buildSyntheticProperty {
|
return buildSyntheticProperty {
|
||||||
moduleData = session.moduleData
|
moduleData = session.moduleData
|
||||||
name = baseProperty.name
|
name = baseProperty.name
|
||||||
symbol = FirAccessorSymbol(baseSymbol.callableId, baseSymbol.getterId)
|
symbol = baseSymbol.copy()
|
||||||
delegateGetter = getter
|
delegateGetter = getter
|
||||||
delegateSetter = setter
|
delegateSetter = setter
|
||||||
status = baseProperty.status
|
status = baseProperty.status
|
||||||
|
|||||||
+1
-1
@@ -29,7 +29,7 @@ class FirProviderImpl(val session: FirSession, val kotlinScopeProvider: FirKotli
|
|||||||
if (symbol is FirBackingFieldSymbol) {
|
if (symbol is FirBackingFieldSymbol) {
|
||||||
return getFirCallableContainerFile(symbol.fir.propertySymbol)
|
return getFirCallableContainerFile(symbol.fir.propertySymbol)
|
||||||
}
|
}
|
||||||
if (symbol is FirAccessorSymbol) {
|
if (symbol is FirSyntheticPropertySymbol) {
|
||||||
val fir = symbol.fir
|
val fir = symbol.fir
|
||||||
if (fir is FirSyntheticProperty) {
|
if (fir is FirSyntheticProperty) {
|
||||||
return getFirCallableContainerFile(fir.getter.delegate.symbol)
|
return getFirCallableContainerFile(fir.getter.delegate.symbol)
|
||||||
|
|||||||
+2
-2
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator
|
|||||||
import org.jetbrains.kotlin.fir.resolve.transformers.TransformImplicitType
|
import org.jetbrains.kotlin.fir.resolve.transformers.TransformImplicitType
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.contracts.runContractResolveForLocalClass
|
import org.jetbrains.kotlin.fir.resolve.transformers.contracts.runContractResolveForLocalClass
|
||||||
import org.jetbrains.kotlin.fir.scopes.fakeOverrideSubstitution
|
import org.jetbrains.kotlin.fir.scopes.fakeOverrideSubstitution
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirAccessorSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||||
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
|
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
|
||||||
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
|
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
|
||||||
@@ -332,7 +332,7 @@ class ImplicitBodyResolveComputationSession {
|
|||||||
private val implicitBodyResolveStatusMap = hashMapOf<FirCallableSymbol<*>, ImplicitBodyResolveComputationStatus>()
|
private val implicitBodyResolveStatusMap = hashMapOf<FirCallableSymbol<*>, ImplicitBodyResolveComputationStatus>()
|
||||||
|
|
||||||
internal fun getStatus(symbol: FirCallableSymbol<*>): ImplicitBodyResolveComputationStatus {
|
internal fun getStatus(symbol: FirCallableSymbol<*>): ImplicitBodyResolveComputationStatus {
|
||||||
if (symbol is FirAccessorSymbol) {
|
if (symbol is FirSyntheticPropertySymbol) {
|
||||||
val fir = symbol.fir
|
val fir = symbol.fir
|
||||||
if (fir is FirSyntheticProperty) {
|
if (fir is FirSyntheticProperty) {
|
||||||
return getStatus(fir.getter.delegate.symbol)
|
return getStatus(fir.getter.delegate.symbol)
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
|||||||
import org.jetbrains.kotlin.fir.references.FirThisReference
|
import org.jetbrains.kotlin.fir.references.FirThisReference
|
||||||
import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference
|
import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference
|
||||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirAccessorSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||||
@@ -102,7 +102,7 @@ val FirElement.symbol: FirBasedSymbol<*>?
|
|||||||
else -> null
|
else -> null
|
||||||
}?.takeIf {
|
}?.takeIf {
|
||||||
(this as? FirExpression)?.unwrapSmartcastExpression() is FirThisReceiverExpression ||
|
(this as? FirExpression)?.unwrapSmartcastExpression() is FirThisReceiverExpression ||
|
||||||
(it !is FirFunctionSymbol<*> && it !is FirAccessorSymbol)
|
(it !is FirFunctionSymbol<*> && it !is FirSyntheticPropertySymbol)
|
||||||
}
|
}
|
||||||
|
|
||||||
@DfaInternals
|
@DfaInternals
|
||||||
|
|||||||
+2
-3
@@ -11,8 +11,7 @@ import org.jetbrains.kotlin.fir.declarations.*
|
|||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||||
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
|
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirAccessorSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirBackingFieldSymbol
|
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirDelegateFieldSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirDelegateFieldSymbol
|
||||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||||
@@ -25,7 +24,7 @@ class FirSyntheticProperty(
|
|||||||
override val moduleData: FirModuleData,
|
override val moduleData: FirModuleData,
|
||||||
override val name: Name,
|
override val name: Name,
|
||||||
override val isVar: Boolean,
|
override val isVar: Boolean,
|
||||||
override val symbol: FirAccessorSymbol,
|
override val symbol: FirSyntheticPropertySymbol,
|
||||||
override val status: FirDeclarationStatus,
|
override val status: FirDeclarationStatus,
|
||||||
override var resolvePhase: FirResolvePhase,
|
override var resolvePhase: FirResolvePhase,
|
||||||
override val getter: FirSyntheticPropertyAccessor,
|
override val getter: FirSyntheticPropertyAccessor,
|
||||||
|
|||||||
+2
-2
@@ -9,13 +9,13 @@ import org.jetbrains.kotlin.fir.FirModuleData
|
|||||||
import org.jetbrains.kotlin.fir.declarations.DeprecationsPerUseSite
|
import org.jetbrains.kotlin.fir.declarations.DeprecationsPerUseSite
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
|
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirAccessorSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
class FirSyntheticPropertyBuilder {
|
class FirSyntheticPropertyBuilder {
|
||||||
lateinit var moduleData: FirModuleData
|
lateinit var moduleData: FirModuleData
|
||||||
lateinit var name: Name
|
lateinit var name: Name
|
||||||
lateinit var symbol: FirAccessorSymbol
|
lateinit var symbol: FirSyntheticPropertySymbol
|
||||||
lateinit var delegateGetter: FirSimpleFunction
|
lateinit var delegateGetter: FirSimpleFunction
|
||||||
lateinit var deprecation: DeprecationsPerUseSite
|
lateinit var deprecation: DeprecationsPerUseSite
|
||||||
|
|
||||||
|
|||||||
@@ -80,10 +80,19 @@ class FirConstructorSymbol(
|
|||||||
get() = fir.delegatedConstructor?.isSuper ?: false
|
get() = fir.delegatedConstructor?.isSuper ?: false
|
||||||
}
|
}
|
||||||
|
|
||||||
open class FirAccessorSymbol(
|
/**
|
||||||
|
* This is a property symbol which is always bound to FirSyntheticProperty.
|
||||||
|
*
|
||||||
|
* Synthetic property symbol is effectively a combination of
|
||||||
|
* a property (which never exists in sources) and
|
||||||
|
* a getter which exists in sources and is either from Java or overrides another getter from Java.
|
||||||
|
*/
|
||||||
|
abstract class FirSyntheticPropertySymbol(
|
||||||
propertyId: CallableId,
|
propertyId: CallableId,
|
||||||
val getterId: CallableId
|
val getterId: CallableId
|
||||||
) : FirPropertySymbol(propertyId)
|
) : FirPropertySymbol(propertyId) {
|
||||||
|
abstract fun copy(): FirSyntheticPropertySymbol
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------------ unnamed ------------------------
|
// ------------------------ unnamed ------------------------
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user