From d8902816d0275c63ce607fe9ba8fa895d293796a Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Wed, 29 Mar 2023 13:41:13 -0700 Subject: [PATCH] SLC: fix non-last vararg parameter type ^KT-57547 Fixed --- .../symbol/parameters/SymbolLightParameter.kt | 7 ------- .../parameters/SymbolLightParameterCommon.kt | 19 ++++++++++++++++--- .../parameters/SymbolLightSetterParameter.kt | 1 + .../lightClassByPsi/constructors.fir.java | 2 +- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameter.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameter.kt index 4f7e979cc6b..04d42dae854 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameter.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameter.kt @@ -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 } \ No newline at end of file diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameterCommon.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameterCommon.kt index 05fa369bf32..ff90465cc44 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameterCommon.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameterCommon.kt @@ -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 } diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightSetterParameter.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightSetterParameter.kt index d2c5466277f..fcbd51f1f9d 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightSetterParameter.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightSetterParameter.kt @@ -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 } diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/constructors.fir.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/constructors.fir.java index c9e3478c692..cc77ef0c5a8 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/constructors.fir.java +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/constructors.fir.java @@ -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);// .ctor(int[], kotlin.jvm.functions.Function0) + public /* vararg */ AAA(@org.jetbrains.annotations.NotNull() int[], @org.jetbrains.annotations.NotNull() kotlin.jvm.functions.Function0);// .ctor(int[], kotlin.jvm.functions.Function0) } public final class B /* B*/ {