[SLC] SymbolLightMemberBase: introduce ktModule

fix recursion inside computeJvmMethodName

^KT-54051
This commit is contained in:
Dmitrii Gridin
2022-11-16 11:16:28 +01:00
committed by Space Team
parent 0b8b4bfe82
commit 7297c0b941
11 changed files with 14 additions and 29 deletions
@@ -10,22 +10,24 @@ import com.intellij.psi.PsiIdentifier
import com.intellij.psi.PsiMember import com.intellij.psi.PsiMember
import com.intellij.psi.PsiMethod import com.intellij.psi.PsiMethod
import com.intellij.psi.javadoc.PsiDocComment import com.intellij.psi.javadoc.PsiDocComment
import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin
import org.jetbrains.kotlin.asJava.classes.KtLightClass
import org.jetbrains.kotlin.asJava.elements.KtLightElementBase import org.jetbrains.kotlin.asJava.elements.KtLightElementBase
import org.jetbrains.kotlin.asJava.elements.KtLightMember import org.jetbrains.kotlin.asJava.elements.KtLightMember
import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassBase
import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtDeclaration
internal abstract class SymbolLightMemberBase<T : PsiMember>( internal abstract class SymbolLightMemberBase<T : PsiMember>(
override val lightMemberOrigin: LightMemberOrigin?, override val lightMemberOrigin: LightMemberOrigin?,
private val containingClass: KtLightClass, private val containingClass: SymbolLightClassBase,
) : KtLightElementBase(containingClass), PsiMember, KtLightMember<T> { ) : KtLightElementBase(containingClass), PsiMember, KtLightMember<T> {
protected val ktModule: KtModule get() = containingClass.ktModule
override fun hasModifierProperty(name: String): Boolean = modifierList?.hasModifierProperty(name) ?: false override fun hasModifierProperty(name: String): Boolean = modifierList?.hasModifierProperty(name) ?: false
override fun toString(): String = "${this::class.java.simpleName}:$name" override fun toString(): String = "${this::class.java.simpleName}:$name"
override fun getContainingClass() = containingClass override fun getContainingClass(): SymbolLightClassBase = containingClass
abstract override fun getNameIdentifier(): PsiIdentifier? abstract override fun getNameIdentifier(): PsiIdentifier?
@@ -293,7 +293,6 @@ internal open class SymbolLightClass(classOrObject: KtClassOrObject, ktModule: K
enumEntryName = name, enumEntryName = name,
containingClass = this@SymbolLightClass, containingClass = this@SymbolLightClass,
lightMemberOrigin = null, lightMemberOrigin = null,
ktModule = ktModule,
) )
} }
} }
@@ -163,7 +163,6 @@ abstract class SymbolLightClassForClassOrObject(protected val classOrObject: KtC
isTopLevel = false, isTopLevel = false,
forceStatic = true, forceStatic = true,
takePropertyVisibility = it.isConstOrJvmField, takePropertyVisibility = it.isConstOrJvmField,
ktModule = ktModule,
) )
} }
@@ -283,7 +283,6 @@ internal fun SymbolLightClassBase.createPropertyAccessors(
containingClass = this@createPropertyAccessors, containingClass = this@createPropertyAccessors,
isTopLevel = isTopLevel, isTopLevel = isTopLevel,
suppressStatic = suppressStatic, suppressStatic = suppressStatic,
ktModule = ktModule,
) )
) )
} }
@@ -309,7 +308,6 @@ internal fun SymbolLightClassBase.createPropertyAccessors(
containingClass = this@createPropertyAccessors, containingClass = this@createPropertyAccessors,
isTopLevel = isTopLevel, isTopLevel = isTopLevel,
suppressStatic = suppressStatic, suppressStatic = suppressStatic,
ktModule = ktModule,
) )
) )
} }
@@ -356,7 +354,6 @@ internal fun SymbolLightClassBase.createField(
isTopLevel = isTopLevel, isTopLevel = isTopLevel,
forceStatic = forceStatic, forceStatic = forceStatic,
takePropertyVisibility = takePropertyVisibility, takePropertyVisibility = takePropertyVisibility,
ktModule = ktModule,
) )
) )
} }
@@ -13,7 +13,6 @@ import com.intellij.util.IncorrectOperationException
import com.intellij.util.PlatformIcons import com.intellij.util.PlatformIcons
import org.jetbrains.annotations.NonNls import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin
import org.jetbrains.kotlin.asJava.classes.KtLightClass
import org.jetbrains.kotlin.asJava.classes.cannotModify import org.jetbrains.kotlin.asJava.classes.cannotModify
import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.asJava.elements.KtLightField import org.jetbrains.kotlin.asJava.elements.KtLightField
@@ -21,11 +20,12 @@ import org.jetbrains.kotlin.asJava.elements.KtLightIdentifier
import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.light.classes.symbol.SymbolLightMemberBase import org.jetbrains.kotlin.light.classes.symbol.SymbolLightMemberBase
import org.jetbrains.kotlin.light.classes.symbol.basicIsEquivalentTo import org.jetbrains.kotlin.light.classes.symbol.basicIsEquivalentTo
import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassBase
import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtNamedDeclaration
import javax.swing.Icon import javax.swing.Icon
internal abstract class SymbolLightField protected constructor( internal abstract class SymbolLightField protected constructor(
private val containingClass: KtLightClass, containingClass: SymbolLightClassBase,
lightMemberOrigin: LightMemberOrigin?, lightMemberOrigin: LightMemberOrigin?,
) : SymbolLightMemberBase<PsiField>(lightMemberOrigin, containingClass), KtLightField { ) : SymbolLightMemberBase<PsiField>(lightMemberOrigin, containingClass), KtLightField {
override fun setInitializer(initializer: PsiExpression?) = cannotModify() override fun setInitializer(initializer: PsiExpression?) = cannotModify()
@@ -35,9 +35,6 @@ internal abstract class SymbolLightField protected constructor(
override fun getLanguage(): Language = KotlinLanguage.INSTANCE override fun getLanguage(): Language = KotlinLanguage.INSTANCE
override fun getParent() = containingClass
override fun getContainingClass() = containingClass
override fun getContainingFile(): PsiFile? = containingClass.containingFile
override fun hasInitializer(): Boolean = initializer !== null override fun hasInitializer(): Boolean = initializer !== null
private val _identifier: PsiIdentifier by lazyPub { private val _identifier: PsiIdentifier by lazyPub {
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.light.classes.symbol.fields
import com.intellij.psi.* import com.intellij.psi.*
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol
import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin
import org.jetbrains.kotlin.asJava.classes.cannotModify import org.jetbrains.kotlin.asJava.classes.cannotModify
import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.classes.lazyPub
@@ -28,7 +27,6 @@ internal class SymbolLightFieldForEnumEntry(
private val enumEntryName: String, private val enumEntryName: String,
containingClass: SymbolLightClass, containingClass: SymbolLightClass,
override val lightMemberOrigin: LightMemberOrigin?, override val lightMemberOrigin: LightMemberOrigin?,
val ktModule: KtModule,
) : SymbolLightField(containingClass, lightMemberOrigin), PsiEnumConstant { ) : SymbolLightField(containingClass, lightMemberOrigin), PsiEnumConstant {
internal fun <T> withEnumEntrySymbol(action: KtAnalysisSession.(KtEnumEntrySymbol) -> T): T = analyzeForLightClasses(ktModule) { internal fun <T> withEnumEntrySymbol(action: KtAnalysisSession.(KtEnumEntrySymbol) -> T): T = analyzeForLightClasses(ktModule) {
action(enumEntry.getEnumEntrySymbol()) action(enumEntry.getEnumEntrySymbol())
@@ -13,10 +13,10 @@ import org.jetbrains.annotations.NotNull
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol
import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin
import org.jetbrains.kotlin.asJava.classes.KtLightClass
import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.light.classes.symbol.annotations.SymbolLightSimpleAnnotation import org.jetbrains.kotlin.light.classes.symbol.annotations.SymbolLightSimpleAnnotation
import org.jetbrains.kotlin.light.classes.symbol.annotations.hasDeprecatedAnnotation import org.jetbrains.kotlin.light.classes.symbol.annotations.hasDeprecatedAnnotation
import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassForClassOrObject
import org.jetbrains.kotlin.light.classes.symbol.classes.analyzeForLightClasses 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.modifierLists.SymbolLightMemberModifierList
import org.jetbrains.kotlin.light.classes.symbol.nonExistentType import org.jetbrains.kotlin.light.classes.symbol.nonExistentType
@@ -25,12 +25,12 @@ import org.jetbrains.kotlin.psi.KtObjectDeclaration
internal class SymbolLightFieldForObject( internal class SymbolLightFieldForObject(
private val objectDeclaration: KtObjectDeclaration, private val objectDeclaration: KtObjectDeclaration,
containingClass: KtLightClass, containingClass: SymbolLightClassForClassOrObject,
private val name: String, private val name: String,
lightMemberOrigin: LightMemberOrigin?, lightMemberOrigin: LightMemberOrigin?,
) : SymbolLightField(containingClass, lightMemberOrigin) { ) : SymbolLightField(containingClass, lightMemberOrigin) {
private fun <T> withObjectDeclarationSymbol(action: KtAnalysisSession.(KtNamedClassOrObjectSymbol) -> T): T = private fun <T> withObjectDeclarationSymbol(action: KtAnalysisSession.(KtNamedClassOrObjectSymbol) -> T): T =
analyzeForLightClasses(objectDeclaration) { analyzeForLightClasses(ktModule) {
action(requireNotNull(objectDeclaration.getNamedClassOrObjectSymbol())) action(requireNotNull(objectDeclaration.getNamedClassOrObjectSymbol()))
} }
@@ -17,7 +17,6 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.analysis.api.symbols.sourcePsiSafe import org.jetbrains.kotlin.analysis.api.symbols.sourcePsiSafe
import org.jetbrains.kotlin.analysis.api.types.KtTypeMappingMode 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.builder.LightMemberOrigin
import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
@@ -41,7 +40,6 @@ internal class SymbolLightFieldForProperty(
isTopLevel: Boolean, isTopLevel: Boolean,
forceStatic: Boolean, forceStatic: Boolean,
takePropertyVisibility: Boolean, takePropertyVisibility: Boolean,
private val ktModule: KtModule,
) : SymbolLightField(containingClass, lightMemberOrigin) { ) : SymbolLightField(containingClass, lightMemberOrigin) {
override val kotlinOrigin: KtCallableDeclaration? = propertySymbol.sourcePsiSafe<KtCallableDeclaration>() override val kotlinOrigin: KtCallableDeclaration? = propertySymbol.sourcePsiSafe<KtCallableDeclaration>()
private val propertySymbolPointer: KtSymbolPointer<KtPropertySymbol> = propertySymbol.createPointer() private val propertySymbolPointer: KtSymbolPointer<KtPropertySymbol> = propertySymbol.createPointer()
@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.analysis.api.KtNonConstantInitializerValue
import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.analysis.api.types.KtTypeMappingMode 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.builder.LightMemberOrigin
import org.jetbrains.kotlin.asJava.classes.METHOD_INDEX_FOR_GETTER import org.jetbrains.kotlin.asJava.classes.METHOD_INDEX_FOR_GETTER
import org.jetbrains.kotlin.asJava.classes.METHOD_INDEX_FOR_SETTER import org.jetbrains.kotlin.asJava.classes.METHOD_INDEX_FOR_SETTER
@@ -48,7 +47,6 @@ internal class SymbolLightAccessorMethod(
containingClass: SymbolLightClassBase, containingClass: SymbolLightClassBase,
private val isTopLevel: Boolean, private val isTopLevel: Boolean,
private val suppressStatic: Boolean = false, private val suppressStatic: Boolean = false,
private val ktModule: KtModule,
) : SymbolLightMethodBase( ) : SymbolLightMethodBase(
lightMemberOrigin, lightMemberOrigin,
containingClass, containingClass,
@@ -31,7 +31,7 @@ internal abstract class SymbolLightMethod(
) : SymbolLightMethodBase( ) : SymbolLightMethodBase(
lightMemberOrigin, lightMemberOrigin,
containingClass, containingClass,
methodIndex methodIndex,
) { ) {
private var _isVarArgs: Boolean = functionSymbol.valueParameters.any { it.isVararg } private var _isVarArgs: Boolean = functionSymbol.valueParameters.any { it.isVararg }
@@ -15,10 +15,8 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotatedSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotatedSymbol
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithVisibility import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithVisibility
import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
import org.jetbrains.kotlin.analysis.project.structure.getKtModule
import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin
import org.jetbrains.kotlin.asJava.classes.KotlinLightReferenceListBuilder import org.jetbrains.kotlin.asJava.classes.KotlinLightReferenceListBuilder
import org.jetbrains.kotlin.asJava.classes.KtLightClass
import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade
import org.jetbrains.kotlin.asJava.classes.cannotModify import org.jetbrains.kotlin.asJava.classes.cannotModify
import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.asJava.elements.KtLightMethod
@@ -34,10 +32,9 @@ import org.jetbrains.kotlin.utils.addToStdlib.ifTrue
internal abstract class SymbolLightMethodBase( internal abstract class SymbolLightMethodBase(
lightMemberOrigin: LightMemberOrigin?, lightMemberOrigin: LightMemberOrigin?,
containingClass: KtLightClass, containingClass: SymbolLightClassBase,
private val methodIndex: Int private val methodIndex: Int,
) : SymbolLightMemberBase<PsiMethod>(lightMemberOrigin, containingClass), KtLightMethod { ) : SymbolLightMemberBase<PsiMethod>(lightMemberOrigin, containingClass), KtLightMethod {
override fun getBody(): PsiCodeBlock? = null override fun getBody(): PsiCodeBlock? = null
override fun getReturnTypeElement(): PsiTypeElement? = null override fun getReturnTypeElement(): PsiTypeElement? = null
@@ -105,7 +102,7 @@ internal abstract class SymbolLightMethodBase(
if (containingClass is KtLightClassForFacade) return defaultName if (containingClass is KtLightClassForFacade) return defaultName
if (hasPublishedApiAnnotation(annotationUseSiteTarget)) return defaultName if (hasPublishedApiAnnotation(annotationUseSiteTarget)) return defaultName
val moduleName = (getKtModule(project) as? KtSourceModule)?.moduleName ?: return defaultName val moduleName = (ktModule as? KtSourceModule)?.moduleName ?: return defaultName
return mangleInternalName(defaultName, moduleName) return mangleInternalName(defaultName, moduleName)
} }