diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightSimpleMethod.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightSimpleMethod.kt index fc6c087c6d2..39eab14e98c 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightSimpleMethod.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightSimpleMethod.kt @@ -8,12 +8,16 @@ package org.jetbrains.kotlin.light.classes.symbol.methods import com.intellij.psi.* import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol +import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.types.KtTypeMappingMode import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.light.classes.symbol.* -import org.jetbrains.kotlin.light.classes.symbol.annotations.* +import org.jetbrains.kotlin.light.classes.symbol.annotations.computeAnnotations +import org.jetbrains.kotlin.light.classes.symbol.annotations.hasAnnotation +import org.jetbrains.kotlin.light.classes.symbol.annotations.hasInlineOnlyAnnotation +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.modifierLists.SymbolLightMemberModifierList import org.jetbrains.kotlin.light.classes.symbol.parameters.SymbolLightTypeParameterList @@ -22,9 +26,8 @@ import org.jetbrains.kotlin.name.JvmNames.SYNCHRONIZED_ANNOTATION_CLASS_ID import org.jetbrains.kotlin.utils.addToStdlib.ifTrue import java.util.* -context(KtAnalysisSession) internal class SymbolLightSimpleMethod( - private val functionSymbol: KtFunctionSymbol, + functionSymbol: KtFunctionSymbol, lightMemberOrigin: LightMemberOrigin?, containingClass: SymbolLightClassBase, methodIndex: Int, @@ -38,58 +41,50 @@ internal class SymbolLightSimpleMethod( methodIndex = methodIndex, argumentsSkipMask = argumentsSkipMask, ) { - private val _name: String by lazyPub { - functionSymbol.computeJvmMethodName(functionSymbol.name.asString(), containingClass, annotationUseSiteTarget = null) + withFunctionSymbol { functionSymbol -> + functionSymbol.computeJvmMethodName(functionSymbol.name.asString(), containingClass, annotationUseSiteTarget = null) + } } override fun getName(): String = _name private val _typeParameterList: PsiTypeParameterList? by lazyPub { hasTypeParameters().ifTrue { - SymbolLightTypeParameterList( - owner = this, - symbolWithTypeParameterList = functionSymbol, - ) + withFunctionSymbol { functionSymbol -> + SymbolLightTypeParameterList( + owner = this@SymbolLightSimpleMethod, + symbolWithTypeParameterList = functionSymbol, + ) + } } } - override fun hasTypeParameters(): Boolean = - functionSymbol.typeParameters.isNotEmpty() + override fun hasTypeParameters(): Boolean = hasTypeParameters(ktModule, functionDeclaration, functionSymbolPointer) override fun getTypeParameterList(): PsiTypeParameterList? = _typeParameterList - override fun getTypeParameters(): Array = - _typeParameterList?.typeParameters ?: PsiTypeParameter.EMPTY_ARRAY + override fun getTypeParameters(): Array = _typeParameterList?.typeParameters ?: PsiTypeParameter.EMPTY_ARRAY - private fun computeAnnotations(isPrivate: Boolean): List { - val nullability = if (isPrivate) { - NullabilityType.Unknown - } else { - run l@{ - val ktType = - when { - functionSymbol.isSuspend -> // Any? - return@l NullabilityType.Nullable - - isVoidReturnType -> - return@l NullabilityType.Unknown - - else -> - functionSymbol.returnType - } - getTypeNullability(ktType) + context(KtAnalysisSession) + private fun computeAnnotations(functionSymbol: KtFunctionSymbol, isPrivate: Boolean): List { + val nullability = when { + isPrivate -> NullabilityType.Unknown + functionSymbol.isSuspend -> /* Any? */ NullabilityType.Nullable + else -> { + val returnType = functionSymbol.returnType + if (returnType.isVoidType) NullabilityType.Unknown else getTypeNullability(returnType) } } return functionSymbol.computeAnnotations( - parent = this, + parent = this@SymbolLightSimpleMethod, nullability = nullability, annotationUseSiteTarget = null, ) } - private fun computeModifiers(): Set { - + context(KtAnalysisSession) + private fun computeModifiers(functionSymbol: KtFunctionSymbol): Set { if (functionSymbol.hasInlineOnlyAnnotation()) return setOf(PsiModifier.FINAL, PsiModifier.PRIVATE) val finalModifier = kotlinOrigin?.hasModifier(KtTokens.FINAL_KEYWORD) == true @@ -123,36 +118,33 @@ internal class SymbolLightSimpleMethod( } private val _modifierList: PsiModifierList by lazyPub { - val modifiers = computeModifiers() - val annotations = computeAnnotations(modifiers.contains(PsiModifier.PRIVATE)) - SymbolLightMemberModifierList(this, modifiers, annotations) + withFunctionSymbol { functionSymbol -> + val modifiers = computeModifiers(functionSymbol) + val annotations = computeAnnotations(functionSymbol, modifiers.contains(PsiModifier.PRIVATE)) + SymbolLightMemberModifierList(this@SymbolLightSimpleMethod, modifiers, annotations) + } } override fun getModifierList(): PsiModifierList = _modifierList override fun isConstructor(): Boolean = false - private val isVoidReturnType: Boolean - get() = functionSymbol.returnType.run { - isUnit && nullabilityType != NullabilityType.Nullable - } + private val KtType.isVoidType: Boolean get() = isUnit && nullabilityType != NullabilityType.Nullable private val _returnedType: PsiType by lazyPub { - val ktType = when { - functionSymbol.isSuspend -> // Any? - analysisSession.builtinTypes.NULLABLE_ANY + withFunctionSymbol { functionSymbol -> + val ktType = if (functionSymbol.isSuspend) { + analysisSession.builtinTypes.NULLABLE_ANY // Any? + } else { + functionSymbol.returnType.takeUnless { it.isVoidType } ?: return@withFunctionSymbol PsiType.VOID + } - isVoidReturnType -> - return@lazyPub PsiType.VOID - - else -> - functionSymbol.returnType - } - ktType.asPsiType( - this@SymbolLightSimpleMethod, - KtTypeMappingMode.RETURN_TYPE, - containingClass.isAnnotationType - ) ?: nonExistentType() + ktType.asPsiType( + this@SymbolLightSimpleMethod, + KtTypeMappingMode.RETURN_TYPE, + containingClass.isAnnotationType, + ) + } ?: nonExistentType() } override fun getReturnType(): PsiType = _returnedType