mirror of
https://github.com/jlengrand/kotlin.git
synced 2026-03-10 08:31:29 +00:00
FIR IDE: hoist up API to get Java getter/setter name of a property...
and expose API to get the getter and setter symbols for synthetic Java properties.
This commit is contained in:
@@ -8,11 +8,15 @@ package org.jetbrains.kotlin.idea.frontend.api.components
|
||||
import org.jetbrains.kotlin.descriptors.Deprecation
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPropertySymbol
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
public abstract class KtSymbolInfoProvider : KtAnalysisSessionComponent() {
|
||||
public abstract fun getDeprecation(symbol: KtSymbol): Deprecation?
|
||||
public abstract fun getGetterDeprecation(symbol: KtPropertySymbol): Deprecation?
|
||||
public abstract fun getSetterDeprecation(symbol: KtPropertySymbol): Deprecation?
|
||||
|
||||
public abstract fun getJavaGetterName(symbol: KtPropertySymbol): Name
|
||||
public abstract fun getJavaSetterName(symbol: KtPropertySymbol): Name?
|
||||
}
|
||||
|
||||
public interface KtSymbolInfoProviderMixIn : KtAnalysisSessionMixIn {
|
||||
@@ -33,4 +37,7 @@ public interface KtSymbolInfoProviderMixIn : KtAnalysisSessionMixIn {
|
||||
*/
|
||||
public val KtPropertySymbol.setterDeprecationStatus: Deprecation?
|
||||
get() = analysisSession.symbolInfoProvider.getSetterDeprecation(this)
|
||||
|
||||
public val KtPropertySymbol.javaGetterName: Name get() = analysisSession.symbolInfoProvider.getJavaGetterName(this)
|
||||
public val KtPropertySymbol.javaSetterName: Name? get() = analysisSession.symbolInfoProvider.getJavaSetterName(this)
|
||||
}
|
||||
@@ -115,8 +115,8 @@ public abstract class KtSyntheticJavaPropertySymbol : KtPropertySymbol() {
|
||||
|
||||
abstract override val getter: KtPropertyGetterSymbol
|
||||
|
||||
public abstract val javaGetterName: Name
|
||||
public abstract val javaSetterName: Name?
|
||||
public abstract val javaGetterSymbol: KtFunctionSymbol
|
||||
public abstract val javaSetterSymbol: KtFunctionSymbol?
|
||||
|
||||
abstract override fun createPointer(): KtSymbolPointer<KtSyntheticJavaPropertySymbol>
|
||||
}
|
||||
|
||||
@@ -9,13 +9,19 @@ import org.jetbrains.kotlin.descriptors.Deprecation
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||
import org.jetbrains.kotlin.fir.declarations.getDeprecationForCallSite
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||
import org.jetbrains.kotlin.idea.asJava.getJvmNameFromAnnotation
|
||||
import org.jetbrains.kotlin.idea.frontend.api.components.KtSymbolInfoProvider
|
||||
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
|
||||
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirBackingFieldSymbol
|
||||
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirSymbol
|
||||
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirSyntheticJavaPropertySymbol
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFunctionSymbol
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPropertySymbol
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSyntheticJavaPropertySymbol
|
||||
import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.load.java.JvmAbi
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
internal class KtFirSymbolInfoProvider(
|
||||
override val analysisSession: KtFirAnalysisSession,
|
||||
@@ -47,4 +53,25 @@ internal class KtFirSymbolInfoProvider(
|
||||
it.symbol.getDeprecationForCallSite(AnnotationUseSiteTarget.PROPERTY_SETTER, AnnotationUseSiteTarget.PROPERTY)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getJavaGetterName(symbol: KtPropertySymbol): Name {
|
||||
require(symbol is KtFirSymbol<*>)
|
||||
if (symbol is KtFirSyntheticJavaPropertySymbol) {
|
||||
return symbol.firRef.withFir { it.getter.delegate.name }
|
||||
}
|
||||
val jvmName = symbol.getJvmNameFromAnnotation(AnnotationUseSiteTarget.PROPERTY_GETTER)
|
||||
return Name.identifier(jvmName ?: JvmAbi.getterName(symbol.name.identifier))
|
||||
}
|
||||
|
||||
override fun getJavaSetterName(symbol: KtPropertySymbol): Name? {
|
||||
require(symbol is KtFirSymbol<*>)
|
||||
if (symbol is KtFirSyntheticJavaPropertySymbol) {
|
||||
symbol.firRef.withFir { it.setter?.delegate?.name }
|
||||
}
|
||||
return if (symbol.isVal) null
|
||||
else {
|
||||
val jvmName = symbol.getJvmNameFromAnnotation(AnnotationUseSiteTarget.PROPERTY_SETTER)
|
||||
Name.identifier(jvmName ?: JvmAbi.setterName(symbol.name.identifier))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -10,7 +10,8 @@ import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.FirFakeSourceElementKind
|
||||
import org.jetbrains.kotlin.fir.containingClass
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.*
|
||||
import org.jetbrains.kotlin.idea.fir.findPsi
|
||||
|
||||
@@ -9,9 +9,9 @@ import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isOverride
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isStatic
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||
import org.jetbrains.kotlin.idea.fir.findPsi
|
||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
|
||||
@@ -22,10 +22,7 @@ import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached
|
||||
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertConstantExpression
|
||||
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef
|
||||
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPropertyGetterSymbol
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPropertySetterSymbol
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbolOrigin
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSyntheticJavaPropertySymbol
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.*
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotationCall
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtConstantValue
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtTypeAndAnnotations
|
||||
@@ -74,14 +71,21 @@ internal class KtFirSyntheticJavaPropertySymbol(
|
||||
override val getter: KtPropertyGetterSymbol by firRef.withFirAndCache(FirResolvePhase.RAW_FIR) { property ->
|
||||
property.getter.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as KtPropertyGetterSymbol
|
||||
}
|
||||
override val javaGetterSymbol: KtFunctionSymbol
|
||||
get() {
|
||||
return firRef.withFir { builder.functionLikeBuilder.buildFunctionSymbol(it.getter.delegate) }
|
||||
}
|
||||
override val javaSetterSymbol: KtFunctionSymbol?
|
||||
get() {
|
||||
return firRef.withFir { fir ->
|
||||
fir.setter?.delegate?.let { setter -> builder.functionLikeBuilder.buildFunctionSymbol(setter) }
|
||||
}
|
||||
}
|
||||
|
||||
override val setter: KtPropertySetterSymbol? by firRef.withFirAndCache(FirResolvePhase.RAW_FIR) { property ->
|
||||
property.setter?.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as? KtPropertySetterSymbol
|
||||
}
|
||||
|
||||
override val javaGetterName: Name get() = firRef.withFir { it.getter.delegate.name }
|
||||
override val javaSetterName: Name? get() = firRef.withFir { it.setter?.delegate?.name }
|
||||
|
||||
override val isFromPrimaryConstructor: Boolean get() = false
|
||||
override val isOverride: Boolean get() = firRef.withFir { it.isOverride }
|
||||
override val isStatic: Boolean get() = firRef.withFir { it.isStatic }
|
||||
|
||||
@@ -61,6 +61,8 @@ KtFirKotlinPropertySymbol:
|
||||
visibility: Public
|
||||
deprecationStatus: null
|
||||
getterDeprecationStatus: null
|
||||
javaGetterName: getTestVal
|
||||
javaSetterName: null
|
||||
setterDeprecationStatus: null
|
||||
|
||||
CLASSIFIER NAMES:
|
||||
|
||||
@@ -561,6 +561,8 @@ KtFirKotlinPropertySymbol:
|
||||
visibility: Public
|
||||
deprecationStatus: null
|
||||
getterDeprecationStatus: null
|
||||
javaGetterName: getSize
|
||||
javaSetterName: null
|
||||
setterDeprecationStatus: null
|
||||
|
||||
KtFirFunctionSymbol:
|
||||
|
||||
@@ -81,8 +81,8 @@ KtFirSyntheticJavaPropertySymbol:
|
||||
isOverride: false
|
||||
isStatic: false
|
||||
isVal: true
|
||||
javaGetterName: length
|
||||
javaSetterName: null
|
||||
javaGetterSymbol: KtFirFunctionSymbol(java/lang/String.length)
|
||||
javaSetterSymbol: null
|
||||
modality: OPEN
|
||||
name: length
|
||||
origin: JAVA_SYNTHETIC_PROPERTY
|
||||
@@ -92,6 +92,8 @@ KtFirSyntheticJavaPropertySymbol:
|
||||
visibility: Public
|
||||
deprecationStatus: null
|
||||
getterDeprecationStatus: null
|
||||
javaGetterName: length
|
||||
javaSetterName: null
|
||||
setterDeprecationStatus: null
|
||||
|
||||
KtFirFunctionSymbol:
|
||||
|
||||
@@ -50,6 +50,8 @@ KtFirKotlinPropertySymbol:
|
||||
visibility: Public
|
||||
deprecationStatus: null
|
||||
getterDeprecationStatus: null
|
||||
javaGetterName: getData
|
||||
javaSetterName: null
|
||||
setterDeprecationStatus: null
|
||||
|
||||
KtFirAnonymousObjectSymbol:
|
||||
@@ -92,6 +94,8 @@ KtFirKotlinPropertySymbol:
|
||||
visibility: Public
|
||||
deprecationStatus: null
|
||||
getterDeprecationStatus: null
|
||||
javaGetterName: getAnonymousObject
|
||||
javaSetterName: null
|
||||
setterDeprecationStatus: null
|
||||
|
||||
KtFirNamedClassOrObjectSymbol:
|
||||
|
||||
@@ -25,6 +25,8 @@ KtFirKotlinPropertySymbol:
|
||||
visibility: Public
|
||||
deprecationStatus: null
|
||||
getterDeprecationStatus: null
|
||||
javaGetterName: getA
|
||||
javaSetterName: null
|
||||
setterDeprecationStatus: null
|
||||
|
||||
KtFirFunctionSymbol:
|
||||
|
||||
@@ -30,6 +30,8 @@ KtFirKotlinPropertySymbol:
|
||||
visibility: Public
|
||||
deprecationStatus: Deprecation(level=WARNING, inheritable=true, message=don't use i)
|
||||
getterDeprecationStatus: Deprecation(level=WARNING, inheritable=true, message=don't use i)
|
||||
javaGetterName: getI
|
||||
javaSetterName: null
|
||||
setterDeprecationStatus: Deprecation(level=WARNING, inheritable=true, message=don't use i)
|
||||
|
||||
KtFirKotlinPropertySymbol:
|
||||
@@ -64,6 +66,8 @@ KtFirKotlinPropertySymbol:
|
||||
visibility: Public
|
||||
deprecationStatus: null
|
||||
getterDeprecationStatus: Deprecation(level=WARNING, inheritable=true, message=don't use getter of i2)
|
||||
javaGetterName: getI2
|
||||
javaSetterName: null
|
||||
setterDeprecationStatus: null
|
||||
|
||||
KtFirKotlinPropertySymbol:
|
||||
@@ -98,6 +102,8 @@ KtFirKotlinPropertySymbol:
|
||||
visibility: Public
|
||||
deprecationStatus: null
|
||||
getterDeprecationStatus: null
|
||||
javaGetterName: getI3
|
||||
javaSetterName: setI3
|
||||
setterDeprecationStatus: Deprecation(level=WARNING, inheritable=true, message=don't use getter of i3)
|
||||
|
||||
KtFirKotlinPropertySymbol:
|
||||
@@ -135,6 +141,8 @@ KtFirKotlinPropertySymbol:
|
||||
visibility: Public
|
||||
deprecationStatus: null
|
||||
getterDeprecationStatus: Deprecation(level=WARNING, inheritable=true, message=don't use getter of i4)
|
||||
javaGetterName: getI4
|
||||
javaSetterName: setI4
|
||||
setterDeprecationStatus: Deprecation(level=WARNING, inheritable=true, message=don't use getter of i4)
|
||||
|
||||
KtFirFunctionSymbol:
|
||||
@@ -226,6 +234,8 @@ KtFirKotlinPropertySymbol:
|
||||
visibility: Public
|
||||
deprecationStatus: Deprecation(level=WARNING, inheritable=true, message=don't use i2)
|
||||
getterDeprecationStatus: Deprecation(level=WARNING, inheritable=true, message=don't use i2)
|
||||
javaGetterName: getI2
|
||||
javaSetterName: null
|
||||
setterDeprecationStatus: Deprecation(level=WARNING, inheritable=true, message=don't use i2)
|
||||
|
||||
KtFirFunctionSymbol:
|
||||
@@ -312,6 +322,8 @@ KtFirKotlinPropertySymbol:
|
||||
visibility: Public
|
||||
deprecationStatus: Deprecation(level=ERROR, inheritable=true, message=null)
|
||||
getterDeprecationStatus: Deprecation(level=ERROR, inheritable=true, message=null)
|
||||
javaGetterName: getJ
|
||||
javaSetterName: null
|
||||
setterDeprecationStatus: Deprecation(level=ERROR, inheritable=true, message=null)
|
||||
|
||||
KtFirKotlinPropertySymbol:
|
||||
@@ -346,6 +358,8 @@ KtFirKotlinPropertySymbol:
|
||||
visibility: Public
|
||||
deprecationStatus: Deprecation(level=HIDDEN, inheritable=true, message=null)
|
||||
getterDeprecationStatus: Deprecation(level=HIDDEN, inheritable=true, message=null)
|
||||
javaGetterName: getJ2
|
||||
javaSetterName: null
|
||||
setterDeprecationStatus: Deprecation(level=HIDDEN, inheritable=true, message=null)
|
||||
|
||||
KtFirKotlinPropertySymbol:
|
||||
@@ -380,4 +394,6 @@ KtFirKotlinPropertySymbol:
|
||||
visibility: Public
|
||||
deprecationStatus: Deprecation(level=WARNING, inheritable=false, message=null)
|
||||
getterDeprecationStatus: Deprecation(level=WARNING, inheritable=false, message=null)
|
||||
javaGetterName: getJ2
|
||||
javaSetterName: null
|
||||
setterDeprecationStatus: Deprecation(level=WARNING, inheritable=false, message=null)
|
||||
|
||||
@@ -77,6 +77,8 @@ KtFirKotlinPropertySymbol:
|
||||
visibility: Public
|
||||
deprecationStatus: null
|
||||
getterDeprecationStatus: null
|
||||
javaGetterName: getExitAnimation
|
||||
javaSetterName: null
|
||||
setterDeprecationStatus: null
|
||||
|
||||
KtFirEnumEntrySymbol:
|
||||
@@ -117,6 +119,8 @@ KtFirKotlinPropertySymbol:
|
||||
visibility: Public
|
||||
deprecationStatus: null
|
||||
getterDeprecationStatus: null
|
||||
javaGetterName: getExitAnimation
|
||||
javaSetterName: null
|
||||
setterDeprecationStatus: null
|
||||
|
||||
KtFirNamedClassOrObjectSymbol:
|
||||
|
||||
7
idea/idea-frontend-fir/testData/symbols/symbolByPsi/jvmName.kt
vendored
Normal file
7
idea/idea-frontend-fir/testData/symbols/symbolByPsi/jvmName.kt
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
// WITH_STDLIB
|
||||
|
||||
class Foo {
|
||||
@get:JvmName("getMyI")
|
||||
@set:JvmName("setMyI")
|
||||
var i: Int
|
||||
}
|
||||
60
idea/idea-frontend-fir/testData/symbols/symbolByPsi/jvmName.txt
vendored
Normal file
60
idea/idea-frontend-fir/testData/symbols/symbolByPsi/jvmName.txt
vendored
Normal file
@@ -0,0 +1,60 @@
|
||||
KtFirKotlinPropertySymbol:
|
||||
annotatedType: [] kotlin/Int
|
||||
annotationClassIds: [
|
||||
kotlin/jvm/JvmName
|
||||
kotlin/jvm/JvmName
|
||||
]
|
||||
annotations: [
|
||||
kotlin/jvm/JvmName(name = getMyI)
|
||||
psi: KtAnnotationEntry
|
||||
kotlin/jvm/JvmName(name = setMyI)
|
||||
psi: KtAnnotationEntry
|
||||
]
|
||||
callableIdIfNonLocal: /Foo.i
|
||||
dispatchType: Foo
|
||||
getter: KtFirPropertyGetterSymbol(<getter>)
|
||||
hasBackingField: true
|
||||
hasGetter: true
|
||||
hasSetter: true
|
||||
initializer: null
|
||||
isConst: false
|
||||
isExtension: false
|
||||
isFromPrimaryConstructor: false
|
||||
isLateInit: false
|
||||
isOverride: false
|
||||
isStatic: false
|
||||
isVal: false
|
||||
modality: FINAL
|
||||
name: i
|
||||
origin: SOURCE
|
||||
receiverType: null
|
||||
setter: KtFirPropertySetterSymbol(<setter>)
|
||||
symbolKind: MEMBER
|
||||
visibility: Public
|
||||
deprecationStatus: null
|
||||
getterDeprecationStatus: null
|
||||
javaGetterName: getMyI
|
||||
javaSetterName: setMyI
|
||||
setterDeprecationStatus: null
|
||||
|
||||
KtFirNamedClassOrObjectSymbol:
|
||||
annotationClassIds: []
|
||||
annotations: []
|
||||
classIdIfNonLocal: Foo
|
||||
classKind: CLASS
|
||||
companionObject: null
|
||||
isData: false
|
||||
isExternal: false
|
||||
isFun: false
|
||||
isInline: false
|
||||
isInner: false
|
||||
modality: FINAL
|
||||
name: Foo
|
||||
origin: SOURCE
|
||||
superTypes: [
|
||||
[] kotlin/Any
|
||||
]
|
||||
symbolKind: TOP_LEVEL
|
||||
typeParameters: []
|
||||
visibility: Public
|
||||
deprecationStatus: null
|
||||
@@ -25,6 +25,8 @@ KtFirKotlinPropertySymbol:
|
||||
visibility: Public
|
||||
deprecationStatus: null
|
||||
getterDeprecationStatus: null
|
||||
javaGetterName: getX
|
||||
javaSetterName: null
|
||||
setterDeprecationStatus: null
|
||||
|
||||
KtFirPropertyGetterSymbol:
|
||||
@@ -72,6 +74,8 @@ KtFirKotlinPropertySymbol:
|
||||
visibility: Public
|
||||
deprecationStatus: null
|
||||
getterDeprecationStatus: null
|
||||
javaGetterName: getY
|
||||
javaSetterName: null
|
||||
setterDeprecationStatus: null
|
||||
|
||||
KtFirNamedClassOrObjectSymbol:
|
||||
|
||||
@@ -25,6 +25,8 @@ KtFirKotlinPropertySymbol:
|
||||
visibility: Public
|
||||
deprecationStatus: null
|
||||
getterDeprecationStatus: null
|
||||
javaGetterName: getX
|
||||
javaSetterName: null
|
||||
setterDeprecationStatus: null
|
||||
|
||||
KtFirPropertyGetterSymbol:
|
||||
@@ -72,4 +74,6 @@ KtFirKotlinPropertySymbol:
|
||||
visibility: Public
|
||||
deprecationStatus: null
|
||||
getterDeprecationStatus: null
|
||||
javaGetterName: getY
|
||||
javaSetterName: null
|
||||
setterDeprecationStatus: null
|
||||
|
||||
@@ -205,6 +205,8 @@ KtFirKotlinPropertySymbol:
|
||||
visibility: Public
|
||||
deprecationStatus: null
|
||||
getterDeprecationStatus: null
|
||||
javaGetterName: getX
|
||||
javaSetterName: null
|
||||
setterDeprecationStatus: null
|
||||
|
||||
KtFirNamedClassOrObjectSymbol:
|
||||
|
||||
@@ -120,6 +120,12 @@ public class SymbolByPsiTestGenerated extends AbstractSymbolByPsiTest {
|
||||
runTest("idea/idea-frontend-fir/testData/symbols/symbolByPsi/implicitReturnInLambda.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("jvmName.kt")
|
||||
public void testJvmName() throws Exception {
|
||||
runTest("idea/idea-frontend-fir/testData/symbols/symbolByPsi/jvmName.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("localDeclarations.kt")
|
||||
public void testLocalDeclarations() throws Exception {
|
||||
|
||||
Reference in New Issue
Block a user