First steps
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirFunctionParameterChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirFunctionParameterChecker.kt
index b68a5ad..cb3cecb 100644
--- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirFunctionParameterChecker.kt
+++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirFunctionParameterChecker.kt
@@ -65,8 +65,7 @@
val nullableNothingType = context.session.builtinTypes.nullableNothingType.coneType
for (varargParameter in varargParameters) {
val varargParameterType = varargParameter.returnTypeRef.coneType.arrayElementType() ?: continue
- if (AbstractTypeChecker.isSubtypeOf(context.session.typeContext, varargParameterType, nullableNothingType) ||
- (varargParameterType.isInlineClass(context.session) && !varargParameterType.isUnsignedTypeOrNullableUnsignedType)
+ if (AbstractTypeChecker.isSubtypeOf(context.session.typeContext, varargParameterType, nullableNothingType)
// Note: comparing with FE1.0, we skip checking if the type is not primitive because primitive types are not inline. That
// is any primitive values are already allowed by the inline check.
) {
diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java
index bc0922b..112b921 100644
--- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java
+++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java
@@ -21762,6 +21762,12 @@
}
@Test
+ @TestMetadata("inlineVarargParam.kt")
+ public void testInlineVarargParam() throws Exception {
+ runTest("compiler/testData/codegen/box/inlineClasses/inlineVarargParam.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
+ }
+
+ @Test
@TestMetadata("iterateOverArrayOfInlineClassValues.kt")
public void testIterateOverArrayOfInlineClassValues() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/iterateOverArrayOfInlineClassValues.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/ArrayUtils.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/ArrayUtils.kt
index 9b5c6ae..528d673 100644
--- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/ArrayUtils.kt
+++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/ArrayUtils.kt
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.types
+import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.StandardClassIds
val ConeKotlinType.isArrayOrPrimitiveArray: Boolean
@@ -24,6 +25,9 @@
if (primitiveArrayId != null) {
return primitiveArrayId.constructClassLikeType(emptyArray(), nullable)
}
+ if (classId.asString().contains("IC")) {
+ return classId.createNestedClassId(Name.identifier("Array")).constructClassLikeType(emptyArray(), nullable)
+ }
}
}
diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt
index c83b0d3..5d585b7 100644
--- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt
+++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt
@@ -25,19 +25,19 @@
import org.jetbrains.kotlin.fir.expressions.builder.*
import org.jetbrains.kotlin.fir.expressions.impl.FirSingleExpressionBlock
import org.jetbrains.kotlin.fir.references.builder.*
+import org.jetbrains.kotlin.fir.resolve.constructType
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.builder.*
-import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
-import org.jetbrains.kotlin.fir.types.impl.FirQualifierPartImpl
-import org.jetbrains.kotlin.fir.types.impl.FirTypeArgumentListImpl
+import org.jetbrains.kotlin.fir.types.impl.*
import org.jetbrains.kotlin.lexer.KtTokens.*
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.psi.*
+import org.jetbrains.kotlin.psi.addRemoveModifier.addModifier
import org.jetbrains.kotlin.psi.psiUtil.*
import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes
import org.jetbrains.kotlin.types.Variance
@@ -206,7 +206,8 @@
defaultTypeRef: FirTypeRef? = null,
valueParameterDeclaration: ValueParameterDeclaration,
additionalAnnotations: List<FirAnnotation> = emptyList()
- ): FirValueParameter = valueParameter.toFirValueParameter(defaultTypeRef, functionSymbol, valueParameterDeclaration, additionalAnnotations)
+ ): FirValueParameter =
+ valueParameter.toFirValueParameter(defaultTypeRef, functionSymbol, valueParameterDeclaration, additionalAnnotations)
private fun KtTypeReference?.toFirOrImplicitType(): FirTypeRef =
convertSafe() ?: buildImplicitTypeRef {
@@ -1208,6 +1209,44 @@
).generate()
}
+ if (classOrObject.hasModifier(VALUE_KEYWORD)) {
+ val arrayClassId = context.currentClassId.createNestedClassId(Name.identifier("Array"))
+ addDeclaration(buildRegularClass {
+ name = arrayClassId.shortClassName
+ origin = FirDeclarationOrigin.Synthetic
+ symbol = FirRegularClassSymbol(arrayClassId)
+ scopeProvider = baseScopeProvider
+ this.classKind = ClassKind.CLASS
+ moduleData = baseModuleData
+ this.status = FirDeclarationStatusImpl(Visibilities.Public, Modality.FINAL)
+ addDeclaration(buildSimpleFunction {
+ val functionName = Name.identifier("get")
+ name = functionName
+ origin = FirDeclarationOrigin.Synthetic
+ symbol = FirNamedFunctionSymbol(CallableId(arrayClassId, functionName))
+ this.status = FirDeclarationStatusImpl(Visibilities.Public, Modality.FINAL).apply { isOperator = true }
+ moduleData = baseModuleData
+ valueParameters.add(buildValueParameter {
+ containingFunctionSymbol = this@buildSimpleFunction.symbol
+ origin = FirDeclarationOrigin.Synthetic
+ name = Name.identifier("index")
+ symbol = FirValueParameterSymbol(name)
+ isCrossinline = false
+ isNoinline = false
+ isVararg = false
+ moduleData = baseModuleData
+ returnTypeRef = FirImplicitIntTypeRef(source = null)
+ })
+ val inlineClassType =
+ FirRegularClassSymbol(context.currentClassId).constructType(emptyArray(), isNullable = false)
+ returnTypeRef = buildResolvedTypeRef { this.type = inlineClassType }
+ dispatchReceiverType =
+ FirRegularClassSymbol(arrayClassId).constructType(emptyArray(), isNullable = false)
+ body = buildEmptyExpressionBlock()
+ })
+ })
+ }
+
if (classOrObject.hasModifier(ENUM_KEYWORD)) {
generateValuesFunction(
baseModuleData,
@@ -1593,7 +1632,7 @@
}
private fun KtDeclarationWithInitializer.toInitializerExpression() =
- runIf (hasInitializer()) {
+ runIf(hasInitializer()) {
buildOrLazyExpression(initializer?.toFirSourceElement()) {
initializer.toFirExpression("Should have initializer")
}
diff --git a/compiler/testData/codegen/box/inlineClasses/inlineVarargParam.kt b/compiler/testData/codegen/box/inlineClasses/inlineVarargParam.kt
new file mode 100644
index 0000000..ca76ff3
--- /dev/null
+++ b/compiler/testData/codegen/box/inlineClasses/inlineVarargParam.kt
@@ -0,0 +1,13 @@
+// WITH_STDLIB
+// WORKS_WHEN_VALUE_CLASS
+// LANGUAGE: +ValueClasses, +CustomEqualsInInlineClasses
+// TARGET_BACKEND: JVM_IR
+
+@JvmInline
+value class IC(val x: Int)
+
+fun foo(vararg x: IC) = x[0].x
+
+fun box(): String {
+ return "OK"
+}
\ No newline at end of file
diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java
index 84dd63a..1e1fe32 100644
--- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java
+++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java
@@ -21762,6 +21762,12 @@
}
@Test
+ @TestMetadata("inlineVarargParam.kt")
+ public void testInlineVarargParam() throws Exception {
+ runTest("compiler/testData/codegen/box/inlineClasses/inlineVarargParam.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
+ }
+
+ @Test
@TestMetadata("iterateOverArrayOfInlineClassValues.kt")
public void testIterateOverArrayOfInlineClassValues() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/iterateOverArrayOfInlineClassValues.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());