[SLC] drop KtAnalysisSession from SymbolLightAccessorMethod
^KT-54051
This commit is contained in:
committed by
Space Team
parent
5aa7634590
commit
0227bb14db
+6
-3
@@ -262,7 +262,7 @@ internal fun SymbolLightClassBase.createPropertyAccessors(
|
||||
return true
|
||||
}
|
||||
|
||||
val originalElement = declaration.psi as? KtDeclaration
|
||||
val originalElement = declaration.sourcePsiSafe<KtDeclaration>()
|
||||
|
||||
val getter = declaration.getter?.takeIf {
|
||||
it.needToCreateAccessor(AnnotationUseSiteTarget.PROPERTY_GETTER)
|
||||
@@ -273,7 +273,7 @@ internal fun SymbolLightClassBase.createPropertyAccessors(
|
||||
LightMemberOriginForDeclaration(
|
||||
originalElement = it,
|
||||
originKind = JvmDeclarationOriginKind.OTHER,
|
||||
auxiliaryOriginalElement = getter.psi as? KtDeclaration
|
||||
auxiliaryOriginalElement = getter.sourcePsiSafe<KtDeclaration>()
|
||||
)
|
||||
}
|
||||
|
||||
@@ -285,6 +285,7 @@ internal fun SymbolLightClassBase.createPropertyAccessors(
|
||||
containingClass = this@createPropertyAccessors,
|
||||
isTopLevel = isTopLevel,
|
||||
suppressStatic = suppressStatic,
|
||||
ktModule = ktModule,
|
||||
)
|
||||
)
|
||||
}
|
||||
@@ -298,9 +299,10 @@ internal fun SymbolLightClassBase.createPropertyAccessors(
|
||||
LightMemberOriginForDeclaration(
|
||||
originalElement = it,
|
||||
originKind = JvmDeclarationOriginKind.OTHER,
|
||||
auxiliaryOriginalElement = setter.psi as? KtDeclaration
|
||||
auxiliaryOriginalElement = setter.sourcePsiSafe<KtDeclaration>()
|
||||
)
|
||||
}
|
||||
|
||||
result.add(
|
||||
SymbolLightAccessorMethod(
|
||||
propertyAccessorSymbol = setter,
|
||||
@@ -309,6 +311,7 @@ internal fun SymbolLightClassBase.createPropertyAccessors(
|
||||
containingClass = this@createPropertyAccessors,
|
||||
isTopLevel = isTopLevel,
|
||||
suppressStatic = suppressStatic,
|
||||
ktModule = ktModule,
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
+130
-79
@@ -7,16 +7,15 @@ package org.jetbrains.kotlin.light.classes.symbol.methods
|
||||
|
||||
import com.intellij.openapi.util.TextRange
|
||||
import com.intellij.psi.*
|
||||
import com.intellij.psi.impl.light.LightParameterListBuilder
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.KtConstantInitializerValue
|
||||
import org.jetbrains.kotlin.analysis.api.KtConstantValueForAnnotation
|
||||
import org.jetbrains.kotlin.analysis.api.KtNonConstantInitializerValue
|
||||
import org.jetbrains.kotlin.analysis.api.lifetime.isValid
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyAccessorSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.*
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtTypeMappingMode
|
||||
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||
import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin
|
||||
import org.jetbrains.kotlin.asJava.classes.METHOD_INDEX_FOR_GETTER
|
||||
import org.jetbrains.kotlin.asJava.classes.METHOD_INDEX_FOR_SETTER
|
||||
@@ -28,40 +27,62 @@ import org.jetbrains.kotlin.light.classes.symbol.annotations.getJvmNameFromAnnot
|
||||
import org.jetbrains.kotlin.light.classes.symbol.annotations.hasDeprecatedAnnotation
|
||||
import org.jetbrains.kotlin.light.classes.symbol.annotations.hasJvmStaticAnnotation
|
||||
import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassBase
|
||||
import org.jetbrains.kotlin.light.classes.symbol.classes.analyzeForLightClasses
|
||||
import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightMemberModifierList
|
||||
import org.jetbrains.kotlin.light.classes.symbol.parameters.SymbolLightParameterList
|
||||
import org.jetbrains.kotlin.light.classes.symbol.parameters.SymbolLightSetterParameter
|
||||
import org.jetbrains.kotlin.light.classes.symbol.parameters.SymbolLightTypeParameterList
|
||||
import org.jetbrains.kotlin.load.java.JvmAbi.getterName
|
||||
import org.jetbrains.kotlin.load.java.JvmAbi.setterName
|
||||
import org.jetbrains.kotlin.psi.KtCallableDeclaration
|
||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||
import org.jetbrains.kotlin.psi.KtParameter
|
||||
import org.jetbrains.kotlin.psi.KtPropertyAccessor
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.ifTrue
|
||||
|
||||
context(KtAnalysisSession)
|
||||
internal class SymbolLightAccessorMethod(
|
||||
private val propertyAccessorSymbol: KtPropertyAccessorSymbol,
|
||||
private val containingPropertySymbol: KtPropertySymbol,
|
||||
propertyAccessorSymbol: KtPropertyAccessorSymbol,
|
||||
containingPropertySymbol: KtPropertySymbol,
|
||||
lightMemberOrigin: LightMemberOrigin?,
|
||||
containingClass: SymbolLightClassBase,
|
||||
private val isTopLevel: Boolean,
|
||||
private val suppressStatic: Boolean = false,
|
||||
private val ktModule: KtModule,
|
||||
) : SymbolLightMethodBase(
|
||||
lightMemberOrigin,
|
||||
containingClass,
|
||||
if (propertyAccessorSymbol is KtPropertyGetterSymbol) METHOD_INDEX_FOR_GETTER else METHOD_INDEX_FOR_SETTER
|
||||
if (propertyAccessorSymbol is KtPropertyGetterSymbol) METHOD_INDEX_FOR_GETTER else METHOD_INDEX_FOR_SETTER,
|
||||
) {
|
||||
private val isGetter: Boolean get() = propertyAccessorSymbol is KtPropertyGetterSymbol
|
||||
private val isGetter: Boolean = propertyAccessorSymbol is KtPropertyGetterSymbol
|
||||
|
||||
private fun String.abiName() =
|
||||
if (isGetter) getterName(this) else setterName(this)
|
||||
private val propertyAccessorDeclaration: KtPropertyAccessor? = propertyAccessorSymbol.sourcePsiSafe()
|
||||
private val propertyAccessorSymbolPointer: KtSymbolPointer<KtPropertyAccessorSymbol> = propertyAccessorSymbol.createPointer()
|
||||
|
||||
context(KtAnalysisSession)
|
||||
private fun propertyAccessorSymbol(): KtPropertyAccessorSymbol {
|
||||
return propertyAccessorSymbolPointer.restoreSymbolOrThrowIfDisposed()
|
||||
}
|
||||
|
||||
private val containingPropertyDeclaration: KtCallableDeclaration? = containingPropertySymbol.sourcePsiSafe()
|
||||
private val containingPropertySymbolPointer: KtSymbolPointer<KtPropertySymbol> = containingPropertySymbol.createPointer()
|
||||
|
||||
context(KtAnalysisSession)
|
||||
private fun propertySymbol(): KtPropertySymbol {
|
||||
return containingPropertySymbolPointer.restoreSymbolOrThrowIfDisposed()
|
||||
}
|
||||
|
||||
private fun String.abiName() = if (isGetter) getterName(this) else setterName(this)
|
||||
|
||||
private val _name: String by lazyPub {
|
||||
propertyAccessorSymbol.getJvmNameFromAnnotation(accessorSite) ?: run {
|
||||
val defaultName = containingPropertySymbol.name.identifier.let {
|
||||
if (containingClass.isAnnotationType) it else it.abiName()
|
||||
}
|
||||
analyzeForLightClasses(ktModule) {
|
||||
propertyAccessorSymbol().getJvmNameFromAnnotation(accessorSite) ?: run {
|
||||
val symbol = propertySymbol()
|
||||
val defaultName = symbol.name.identifier.let {
|
||||
if (containingClass.isAnnotationType) it else it.abiName()
|
||||
}
|
||||
|
||||
containingPropertySymbol.computeJvmMethodName(defaultName, containingClass, accessorSite)
|
||||
symbol.computeJvmMethodName(defaultName, containingClass, accessorSite)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -69,72 +90,76 @@ internal class SymbolLightAccessorMethod(
|
||||
|
||||
private val _typeParameterList: PsiTypeParameterList? by lazyPub {
|
||||
hasTypeParameters().ifTrue {
|
||||
SymbolLightTypeParameterList(
|
||||
owner = this,
|
||||
symbolWithTypeParameterList = containingPropertySymbol,
|
||||
)
|
||||
analyzeForLightClasses(ktModule) {
|
||||
SymbolLightTypeParameterList(
|
||||
owner = this@SymbolLightAccessorMethod,
|
||||
symbolWithTypeParameterList = propertySymbol(),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun hasTypeParameters(): Boolean = containingPropertySymbol.typeParameters.isNotEmpty()
|
||||
override fun hasTypeParameters(): Boolean =
|
||||
containingPropertyDeclaration?.typeParameters?.isNotEmpty() ?: analyzeForLightClasses(ktModule) {
|
||||
propertySymbol().typeParameters.isNotEmpty()
|
||||
}
|
||||
|
||||
override fun getTypeParameterList(): PsiTypeParameterList? = _typeParameterList
|
||||
override fun getTypeParameters(): Array<PsiTypeParameter> = _typeParameterList?.typeParameters ?: PsiTypeParameter.EMPTY_ARRAY
|
||||
|
||||
override fun isVarArgs(): Boolean = false
|
||||
|
||||
override val kotlinOrigin: KtDeclaration? get() = containingPropertyDeclaration
|
||||
|
||||
private val accessorSite
|
||||
get() =
|
||||
if (propertyAccessorSymbol is KtPropertyGetterSymbol) AnnotationUseSiteTarget.PROPERTY_GETTER
|
||||
else AnnotationUseSiteTarget.PROPERTY_SETTER
|
||||
get() = if (isGetter) AnnotationUseSiteTarget.PROPERTY_GETTER else AnnotationUseSiteTarget.PROPERTY_SETTER
|
||||
|
||||
//TODO Fix it when SymbolConstructorValueParameter be ready
|
||||
private val isParameter: Boolean get() = containingPropertySymbol.psi.let { it == null || it is KtParameter }
|
||||
private val isParameter: Boolean get() = containingPropertyDeclaration == null || containingPropertyDeclaration is KtParameter
|
||||
|
||||
private fun computeAnnotations(isPrivate: Boolean): List<PsiAnnotation> {
|
||||
val nullabilityApplicable = isGetter &&
|
||||
!isPrivate &&
|
||||
!(isParameter && containingClass.isAnnotationType)
|
||||
private fun computeAnnotations(isPrivate: Boolean): List<PsiAnnotation> = analyzeForLightClasses(ktModule) {
|
||||
val nullabilityApplicable = isGetter && !isPrivate && !(isParameter && containingClass.isAnnotationType)
|
||||
|
||||
val nullabilityType = if (nullabilityApplicable) {
|
||||
getTypeNullability(containingPropertySymbol.returnType)
|
||||
} else NullabilityType.Unknown
|
||||
|
||||
val annotationsFromProperty = containingPropertySymbol.computeAnnotations(
|
||||
parent = this,
|
||||
val propertySymbol = propertySymbol()
|
||||
val nullabilityType = if (nullabilityApplicable) getTypeNullability(propertySymbol.returnType) else NullabilityType.Unknown
|
||||
val annotationsFromProperty = propertySymbol.computeAnnotations(
|
||||
parent = this@SymbolLightAccessorMethod,
|
||||
nullability = nullabilityType,
|
||||
annotationUseSiteTarget = accessorSite,
|
||||
includeAnnotationsWithoutSite = false
|
||||
includeAnnotationsWithoutSite = false,
|
||||
)
|
||||
|
||||
val propertyAccessorSymbol = propertyAccessorSymbol()
|
||||
val annotationsFromAccessor = propertyAccessorSymbol.computeAnnotations(
|
||||
parent = this,
|
||||
parent = this@SymbolLightAccessorMethod,
|
||||
nullability = NullabilityType.Unknown,
|
||||
annotationUseSiteTarget = accessorSite,
|
||||
)
|
||||
|
||||
return annotationsFromProperty + annotationsFromAccessor
|
||||
annotationsFromProperty + annotationsFromAccessor
|
||||
}
|
||||
|
||||
private fun computeModifiers(): Set<String> {
|
||||
val isOverrideMethod = propertyAccessorSymbol.isOverride || containingPropertySymbol.isOverride
|
||||
private fun computeModifiers(): Set<String> = analyzeForLightClasses(ktModule) {
|
||||
val propertySymbol = propertySymbol()
|
||||
val propertyAccessorSymbol = propertyAccessorSymbol()
|
||||
val isOverrideMethod = propertyAccessorSymbol.isOverride || propertySymbol.isOverride
|
||||
val isInterfaceMethod = containingClass.isInterface
|
||||
|
||||
val modifiers = mutableSetOf<String>()
|
||||
|
||||
containingPropertySymbol.computeModalityForMethod(
|
||||
propertySymbol.computeModalityForMethod(
|
||||
isTopLevel = isTopLevel,
|
||||
suppressFinal = isOverrideMethod || isInterfaceMethod,
|
||||
result = modifiers
|
||||
result = modifiers,
|
||||
)
|
||||
|
||||
val visibility = isOverrideMethod.ifTrue {
|
||||
tryGetEffectiveVisibility(containingPropertySymbol)
|
||||
?.toPsiVisibilityForMember()
|
||||
tryGetEffectiveVisibility(propertySymbol)?.toPsiVisibilityForMember()
|
||||
} ?: propertyAccessorSymbol.toPsiVisibilityForMember()
|
||||
modifiers.add(visibility)
|
||||
|
||||
if (!suppressStatic &&
|
||||
(containingPropertySymbol.hasJvmStaticAnnotation() || propertyAccessorSymbol.hasJvmStaticAnnotation(accessorSite))
|
||||
(propertySymbol.hasJvmStaticAnnotation() || propertyAccessorSymbol.hasJvmStaticAnnotation(accessorSite))
|
||||
) {
|
||||
modifiers.add(PsiModifier.STATIC)
|
||||
}
|
||||
@@ -143,7 +168,7 @@ internal class SymbolLightAccessorMethod(
|
||||
modifiers.add(PsiModifier.ABSTRACT)
|
||||
}
|
||||
|
||||
return modifiers
|
||||
modifiers
|
||||
}
|
||||
|
||||
private val _modifierList: PsiModifierList by lazyPub {
|
||||
@@ -157,69 +182,95 @@ internal class SymbolLightAccessorMethod(
|
||||
override fun isConstructor(): Boolean = false
|
||||
|
||||
private val _isDeprecated: Boolean by lazyPub {
|
||||
containingPropertySymbol.hasDeprecatedAnnotation(accessorSite)
|
||||
analyzeForLightClasses(ktModule) {
|
||||
propertySymbol().hasDeprecatedAnnotation(accessorSite)
|
||||
}
|
||||
}
|
||||
|
||||
override fun isDeprecated(): Boolean = _isDeprecated
|
||||
|
||||
private val _identifier: PsiIdentifier by lazyPub {
|
||||
SymbolLightIdentifier(this, containingPropertySymbol)
|
||||
analyzeForLightClasses(ktModule) {
|
||||
SymbolLightIdentifier(this@SymbolLightAccessorMethod, propertySymbol())
|
||||
}
|
||||
}
|
||||
|
||||
override fun getNameIdentifier(): PsiIdentifier = _identifier
|
||||
|
||||
private val _returnedType: PsiType by lazyPub {
|
||||
if (!isGetter) return@lazyPub PsiType.VOID
|
||||
containingPropertySymbol.returnType.asPsiType(
|
||||
this@SymbolLightAccessorMethod,
|
||||
KtTypeMappingMode.RETURN_TYPE,
|
||||
containingClass.isAnnotationType
|
||||
) ?: nonExistentType()
|
||||
analyzeForLightClasses(ktModule) {
|
||||
propertySymbol().returnType.asPsiType(
|
||||
this@SymbolLightAccessorMethod,
|
||||
KtTypeMappingMode.RETURN_TYPE,
|
||||
containingClass.isAnnotationType,
|
||||
)
|
||||
} ?: nonExistentType()
|
||||
}
|
||||
|
||||
override fun getReturnType(): PsiType = _returnedType
|
||||
|
||||
override fun equals(other: Any?): Boolean =
|
||||
this === other ||
|
||||
(other is SymbolLightAccessorMethod &&
|
||||
isGetter == other.isGetter &&
|
||||
kotlinOrigin == other.kotlinOrigin &&
|
||||
propertyAccessorSymbol == other.propertyAccessorSymbol)
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (this === other) return true
|
||||
if (other !is SymbolLightAccessorMethod) return false
|
||||
if (propertyAccessorDeclaration != null) {
|
||||
return propertyAccessorDeclaration == other.propertyAccessorDeclaration && ktModule == other.ktModule
|
||||
}
|
||||
|
||||
override fun hashCode(): Int = kotlinOrigin.hashCode()
|
||||
return isGetter == other.isGetter &&
|
||||
other.propertyAccessorDeclaration == null &&
|
||||
ktModule == other.ktModule &&
|
||||
analyzeForLightClasses(ktModule) {
|
||||
propertyAccessorSymbolPointer.restoreSymbol() == other.propertyAccessorSymbolPointer.restoreSymbol()
|
||||
}
|
||||
}
|
||||
|
||||
override fun hashCode(): Int = propertyAccessorDeclaration.hashCode()
|
||||
|
||||
private val _parametersList by lazyPub {
|
||||
SymbolLightParameterList(this, containingPropertySymbol) { builder ->
|
||||
val propertyParameter = (propertyAccessorSymbol as? KtPropertySetterSymbol)?.parameter
|
||||
if (propertyParameter != null) {
|
||||
builder.addParameter(
|
||||
SymbolLightSetterParameter(
|
||||
containingPropertySymbol, propertyParameter, this@SymbolLightAccessorMethod
|
||||
)
|
||||
)
|
||||
val parameterPopulator: (LightParameterListBuilder) -> Unit = if (!isGetter) {
|
||||
{ builder ->
|
||||
analyzeForLightClasses(ktModule) {
|
||||
val propertyParameter = (propertyAccessorSymbol() as? KtPropertySetterSymbol)?.parameter
|
||||
if (propertyParameter != null) {
|
||||
builder.addParameter(
|
||||
SymbolLightSetterParameter(
|
||||
propertySymbol(), propertyParameter, this@SymbolLightAccessorMethod
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
{ }
|
||||
}
|
||||
|
||||
analyzeForLightClasses(ktModule) {
|
||||
SymbolLightParameterList(this@SymbolLightAccessorMethod, propertySymbol(), parameterPopulator)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getParameterList(): PsiParameterList = _parametersList
|
||||
|
||||
override fun isValid(): Boolean = super.isValid() && propertyAccessorSymbol.isValid()
|
||||
override fun isValid(): Boolean = super.isValid() &&
|
||||
propertyAccessorDeclaration?.isValid ?: analyzeForLightClasses(ktModule) { propertyAccessorSymbolPointer.restoreSymbol() != null }
|
||||
|
||||
override fun isOverride(): Boolean = propertyAccessorSymbol.isOverride
|
||||
override fun isOverride(): Boolean = analyzeForLightClasses(ktModule) { propertyAccessorSymbol().isOverride }
|
||||
|
||||
private val _defaultValue: PsiAnnotationMemberValue? by lazyPub {
|
||||
if (!containingClass.isAnnotationType) return@lazyPub null
|
||||
when (val initializer = containingPropertySymbol.initializer) {
|
||||
is KtConstantInitializerValue -> initializer.constant.createPsiLiteral(this)
|
||||
is KtConstantValueForAnnotation -> initializer.annotationValue.toAnnotationMemberValue(this)
|
||||
is KtNonConstantInitializerValue -> null
|
||||
null -> null
|
||||
|
||||
analyzeForLightClasses(ktModule) {
|
||||
when (val initializer = propertySymbol().initializer) {
|
||||
is KtConstantInitializerValue -> initializer.constant.createPsiLiteral(this@SymbolLightAccessorMethod)
|
||||
is KtConstantValueForAnnotation -> initializer.annotationValue.toAnnotationMemberValue(this@SymbolLightAccessorMethod)
|
||||
is KtNonConstantInitializerValue -> null
|
||||
null -> null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun getDefaultValue(): PsiAnnotationMemberValue? {
|
||||
return _defaultValue
|
||||
}
|
||||
override fun getDefaultValue(): PsiAnnotationMemberValue? = _defaultValue
|
||||
|
||||
override fun getText(): String {
|
||||
return lightMemberOrigin?.auxiliaryOriginalElement?.text ?: super.getText()
|
||||
|
||||
Reference in New Issue
Block a user