SLC: fix non-last vararg parameter type

^KT-57547 Fixed
This commit is contained in:
Jinseong Jeon
2023-03-29 13:41:13 -07:00
committed by teamcity
parent 2622e593b5
commit d8902816d0
4 changed files with 18 additions and 11 deletions
@@ -16,7 +16,6 @@ import org.jetbrains.kotlin.light.classes.symbol.annotations.SymbolAnnotationsPr
import org.jetbrains.kotlin.light.classes.symbol.annotations.toOptionalFilter
import org.jetbrains.kotlin.light.classes.symbol.methods.SymbolLightMethodBase
import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightClassModifierList
import org.jetbrains.kotlin.light.classes.symbol.withSymbol
import org.jetbrains.kotlin.utils.addToStdlib.ifTrue
internal class SymbolLightParameter(
@@ -43,10 +42,4 @@ internal class SymbolLightParameter(
),
)
}
private val isVararg: Boolean by lazyPub {
parameterSymbolPointer.withSymbol(ktModule) { it.isVararg }
}
override fun isVarArgs() = isVararg
}
@@ -48,8 +48,15 @@ internal abstract class SymbolLightParameterCommon(
abstract override fun getModifierList(): PsiModifierList
protected open fun isDeclaredAsVararg(): Boolean =
parameterSymbolPointer.withSymbol(ktModule) { it.isVararg }
override fun isVarArgs() =
// true only if this is "last" `vararg`
containingMethod.parameterList.parameters.lastOrNull() == this && isDeclaredAsVararg()
protected open fun nullabilityType(): NullabilityType {
if (isVarArgs) return NullabilityType.NotNull
if (isDeclaredAsVararg()) return NullabilityType.NotNull
val nullabilityApplicable = !containingMethod.hasModifierProperty(PsiModifier.PRIVATE) &&
!containingMethod.containingClass.let { it.isAnnotationType || it.isEnum }
@@ -83,8 +90,14 @@ internal abstract class SymbolLightParameterCommon(
}
} ?: nonExistentType()
if (parameterSymbol.isVararg) {
PsiEllipsisType(convertedType, convertedType.annotationProvider)
if (isDeclaredAsVararg()) {
if (isVarArgs) {
// last vararg
PsiEllipsisType(convertedType, convertedType.annotationProvider)
} else {
// non-last vararg
PsiArrayType(convertedType, convertedType.annotationProvider)
}
} else {
convertedType
}
@@ -64,6 +64,7 @@ internal class SymbolLightSetterParameter(
override fun nullabilityType(): NullabilityType =
if (containingPropertySymbolPointer.withSymbol(ktModule) { it.isLateInit }) NullabilityType.NotNull else super.nullabilityType()
override fun isDeclaredAsVararg(): Boolean = false
override fun isVarArgs() = false
}
@@ -11,7 +11,7 @@ public abstract class A /* A*/ {
}
public final class AAA /* AAA*/ {
public /* vararg */ AAA(@org.jetbrains.annotations.NotNull() int..., @org.jetbrains.annotations.NotNull() kotlin.jvm.functions.Function0<kotlin.Unit>);// .ctor(int[], kotlin.jvm.functions.Function0<kotlin.Unit>)
public /* vararg */ AAA(@org.jetbrains.annotations.NotNull() int[], @org.jetbrains.annotations.NotNull() kotlin.jvm.functions.Function0<kotlin.Unit>);// .ctor(int[], kotlin.jvm.functions.Function0<kotlin.Unit>)
}
public final class B /* B*/ {