FIR: introduce synthetic property symbol hierarchy
This commit is contained in:
committed by
TeamCityServer
parent
c673c4cc91
commit
79b98f9173
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAccessor
|
||||
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.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||
@@ -45,7 +45,7 @@ object FirJavaVisibilityChecker : FirVisibilityChecker() {
|
||||
) return true
|
||||
|
||||
// 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
|
||||
}
|
||||
}
|
||||
|
||||
+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.declarations.*
|
||||
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.scopes.jvm.computeJvmDescriptor
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
||||
@@ -154,7 +155,7 @@ class FirSignatureEnhancement(
|
||||
return buildSyntheticProperty {
|
||||
moduleData = this@FirSignatureEnhancement.moduleData
|
||||
this.name = name
|
||||
symbol = FirAccessorSymbol(accessorSymbol.callableId, accessorSymbol.getterId)
|
||||
symbol = FirJavaOverriddenSyntheticPropertySymbol(accessorSymbol.callableId, accessorSymbol.getterId)
|
||||
delegateGetter = enhancedGetterSymbol.fir as FirSimpleFunction
|
||||
delegateSetter = enhancedSetterSymbol?.fir as FirSimpleFunction?
|
||||
status = firElement.status
|
||||
@@ -162,7 +163,7 @@ class FirSignatureEnhancement(
|
||||
}.symbol
|
||||
}
|
||||
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()}`")
|
||||
}
|
||||
}
|
||||
|
||||
+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.synthetic.FirSyntheticProperty
|
||||
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.resolve.substitution.ConeSubstitutor
|
||||
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
|
||||
@@ -45,7 +45,7 @@ class JavaAnnotationSyntheticPropertiesScope(
|
||||
val function = functionSymbol.fir
|
||||
val symbol = syntheticPropertiesCache.getOrPut(functionSymbol) {
|
||||
val callableId = CallableId(classId, name)
|
||||
FirAccessorSymbol(callableId, callableId).also {
|
||||
FirJavaOverriddenSyntheticPropertySymbol(callableId, callableId).also {
|
||||
val accessor = FirSyntheticPropertyAccessor(function, isGetter = true)
|
||||
FirSyntheticProperty(
|
||||
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.buildJavaMethodCopy
|
||||
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.resolve.toSymbol
|
||||
import org.jetbrains.kotlin.fir.scopes.*
|
||||
@@ -50,7 +51,7 @@ class JavaClassUseSiteMemberScope(
|
||||
) {
|
||||
private val typeParameterStack = klass.javaTypeParameterStack
|
||||
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) }
|
||||
|
||||
@@ -69,12 +70,12 @@ class JavaClassUseSiteMemberScope(
|
||||
setterSymbol: FirNamedFunctionSymbol?,
|
||||
property: FirProperty,
|
||||
takeModalityFromGetter: Boolean,
|
||||
): FirAccessorSymbol {
|
||||
): FirSyntheticPropertySymbol {
|
||||
return accessorByNameMap.getOrPut(property.name) {
|
||||
buildSyntheticProperty {
|
||||
moduleData = session.moduleData
|
||||
name = property.name
|
||||
symbol = FirAccessorSymbol(
|
||||
symbol = FirJavaOverriddenSyntheticPropertySymbol(
|
||||
getterId = getterSymbol.callableId,
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user