[JVM] Forbid non-JvmInline value classes again

This commit is contained in:
Evgeniy.Zhelenskiy
2021-12-25 04:44:00 +03:00
committed by Space
parent 7595f798e1
commit df1de3a7d3
19 changed files with 126 additions and 4798 deletions
@@ -1285,6 +1285,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
token,
)
}
add(FirErrors.VALUE_CLASS_EMPTY_CONSTRUCTOR) { firDiagnostic ->
ValueClassEmptyConstructorImpl(
firDiagnostic as KtPsiDiagnostic,
token,
)
}
add(FirErrors.VALUE_CLASS_CONSTRUCTOR_NOT_FINAL_READ_ONLY_PARAMETER) { firDiagnostic ->
ValueClassConstructorNotFinalReadOnlyParameterImpl(
firDiagnostic as KtPsiDiagnostic,
@@ -928,6 +928,10 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
override val diagnosticClass get() = InlineClassConstructorWrongParametersSize::class
}
abstract class ValueClassEmptyConstructor : KtFirDiagnostic<KtElement>() {
override val diagnosticClass get() = ValueClassEmptyConstructor::class
}
abstract class ValueClassConstructorNotFinalReadOnlyParameter : KtFirDiagnostic<KtParameter>() {
override val diagnosticClass get() = ValueClassConstructorNotFinalReadOnlyParameter::class
}
@@ -1110,6 +1110,11 @@ internal class InlineClassConstructorWrongParametersSizeImpl(
override val token: ValidityToken,
) : KtFirDiagnostic.InlineClassConstructorWrongParametersSize(), KtAbstractFirDiagnostic<KtElement>
internal class ValueClassEmptyConstructorImpl(
override val firDiagnostic: KtPsiDiagnostic,
override val token: ValidityToken,
) : KtFirDiagnostic.ValueClassEmptyConstructor(), KtAbstractFirDiagnostic<KtElement>
internal class ValueClassConstructorNotFinalReadOnlyParameterImpl(
override val firDiagnostic: KtPsiDiagnostic,
override val token: ValidityToken,
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostic.compiler.base
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.util.KtTestUtil;
import org.jetbrains.kotlin.test.utils.TransformersFunctions;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
@@ -32113,6 +32114,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag
runTest("compiler/testData/diagnostics/tests/valueClasses/propertiesWithBackingFieldsInsideValueClass.kt");
}
@Test
@TestMetadata("recursiveMultiFieldValueClasses.kt")
public void testRecursiveMultiFieldValueClasses() throws Exception {
runTest("compiler/testData/diagnostics/tests/valueClasses/recursiveMultiFieldValueClasses.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithUniversal());
}
@Test
@TestMetadata("recursiveValueClasses.kt")
public void testRecursiveValueClasses() throws Exception {
@@ -32167,6 +32174,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag
runTest("compiler/testData/diagnostics/tests/valueClasses/valueClassWithForbiddenUnderlyingType.kt");
}
@Test
@TestMetadata("valueClassWithForbiddenUnderlyingTypeMultiField.kt")
public void testValueClassWithForbiddenUnderlyingTypeMultiField() throws Exception {
runTest("compiler/testData/diagnostics/tests/valueClasses/valueClassWithForbiddenUnderlyingTypeMultiField.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithUniversal());
}
@Test
@TestMetadata("valueClassesInsideAnnotations.kt")
public void testValueClassesInsideAnnotations() throws Exception {
@@ -32117,7 +32117,7 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
@Test
@TestMetadata("recursiveMultiFieldValueClasses.kt")
public void testRecursiveMultiFieldValueClasses() throws Exception {
runTest("compiler/testData/diagnostics/tests/valueClasses/recursiveMultiFieldValueClasses.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
runTest("compiler/testData/diagnostics/tests/valueClasses/recursiveMultiFieldValueClasses.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithUniversal());
}
@Test
@@ -32177,7 +32177,7 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
@Test
@TestMetadata("valueClassWithForbiddenUnderlyingTypeMultiField.kt")
public void testValueClassWithForbiddenUnderlyingTypeMultiField() throws Exception {
runTest("compiler/testData/diagnostics/tests/valueClasses/valueClassWithForbiddenUnderlyingTypeMultiField.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
runTest("compiler/testData/diagnostics/tests/valueClasses/valueClassWithForbiddenUnderlyingTypeMultiField.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithUniversal());
}
@Test
@@ -32117,7 +32117,7 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac
@Test
@TestMetadata("recursiveMultiFieldValueClasses.kt")
public void testRecursiveMultiFieldValueClasses() throws Exception {
runTest("compiler/testData/diagnostics/tests/valueClasses/recursiveMultiFieldValueClasses.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
runTest("compiler/testData/diagnostics/tests/valueClasses/recursiveMultiFieldValueClasses.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithUniversal());
}
@Test
@@ -32177,7 +32177,7 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac
@Test
@TestMetadata("valueClassWithForbiddenUnderlyingTypeMultiField.kt")
public void testValueClassWithForbiddenUnderlyingTypeMultiField() throws Exception {
runTest("compiler/testData/diagnostics/tests/valueClasses/valueClassWithForbiddenUnderlyingTypeMultiField.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
runTest("compiler/testData/diagnostics/tests/valueClasses/valueClassWithForbiddenUnderlyingTypeMultiField.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithUniversal());
}
@Test
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.fir.analysis.jvm.checkers.declaration
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
@@ -24,9 +23,7 @@ object FirJvmInlineApplicabilityChecker : FirRegularClassChecker() {
val annotation = declaration.getAnnotationByClassId(JVM_INLINE_ANNOTATION_CLASS_ID)
if (annotation != null && !declaration.isInline) {
reporter.reportOn(annotation.source, FirJvmErrors.JVM_INLINE_WITHOUT_VALUE_CLASS, context)
} else if (annotation == null && declaration.isInline && !declaration.isExpect &&
!context.languageVersionSettings.supportsFeature(LanguageFeature.ValueClasses)
) {
} else if (annotation == null && declaration.isInline && !declaration.isExpect) {
reporter.reportOn(
declaration.getModifier(KtTokens.VALUE_KEYWORD)?.source,
FirJvmErrors.VALUE_CLASS_WITHOUT_JVM_INLINE_ANNOTATION,
@@ -16,7 +16,6 @@
package org.jetbrains.kotlin.resolve.jvm.checkers
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.lexer.KtTokens
@@ -36,9 +35,7 @@ class JvmInlineApplicabilityChecker : DeclarationChecker {
context.trace.report(ErrorsJvm.JVM_INLINE_WITHOUT_VALUE_CLASS.on(annotationEntry))
}
if (descriptor.isValue && annotation == null && !descriptor.isExpect &&
!context.languageVersionSettings.supportsFeature(LanguageFeature.ValueClasses)
) {
if (descriptor.isValue && annotation == null && !descriptor.isExpect) {
val valueKeyword = declaration.modifierList?.getModifier(KtTokens.VALUE_KEYWORD) ?: return
context.trace.report(ErrorsJvm.VALUE_CLASS_WITHOUT_JVM_INLINE_ANNOTATION.on(valueKeyword))
}
+30 -24
View File
@@ -3,11 +3,14 @@
// WORKS_WHEN_VALUE_CLASS
// LANGUAGE: +ValueClasses
OPTIONAL_JVM_INLINE_ANNOTATION
value class F1(val x: Int)
OPTIONAL_JVM_INLINE_ANNOTATION
value class F2(val x: UInt)
value class F3(val x: String)
OPTIONAL_JVM_INLINE_ANNOTATION
value class F3(val x: F1, val y: F2)
OPTIONAL_JVM_INLINE_ANNOTATION
value class F4(val x: Int)
@@ -18,9 +21,8 @@ value class F5(val x: UInt)
OPTIONAL_JVM_INLINE_ANNOTATION
value class F6(val x: String)
OPTIONAL_JVM_INLINE_ANNOTATION
value class A(
val f1: F1,
val f2: F2,
val f3: F3,
val f4: F4,
val f5: F5,
@@ -30,6 +32,7 @@ value class A(
val f9: String,
)
OPTIONAL_JVM_INLINE_ANNOTATION
value class B(val a1: A, val a2: A) {
override fun toString(): String {
return "OverridenBToString(a1 = $a1, a2 = $a2)"
@@ -39,40 +42,43 @@ value class B(val a1: A, val a2: A) {
fun box(): String {
val f1 = F1(1)
val f2 = F2(UInt.MAX_VALUE)
val f3 = F3("234")
val f3 = F3(f1, f2)
val f4 = F4(5)
val f5 = F5(UInt.MAX_VALUE.dec())
val f6 = F6("678")
val a1 = A(f1, f2, f3, f4, f5, f6, 9, UInt.MAX_VALUE - 2U, "0")
val a1 = A(f3, f4, f5, f6, 9, UInt.MAX_VALUE - 2U, "0")
val a2 = a1
val b = B(a1, a2)
assert(f1.x == 1)
assert(f2.x == UInt.MAX_VALUE)
assert(f3.x == "234")
assert(f3.x == f1)
assert(f3.x.x == 1)
assert(f3.y == f2)
assert(f3.y.x == UInt.MAX_VALUE)
assert(f4.x == 5)
assert(f5.x == UInt.MAX_VALUE - 1U)
assert(f6.x == "678")
assert(f1 == a1.f1)
assert(f1.hashCode() == a1.f1.hashCode())
assert(f1.toString() == a1.f1.toString())
assert(f1 == a2.f1)
assert(f1.hashCode() == a2.f1.hashCode())
assert(f1.toString() == a2.f1.toString())
assert(a1.f1 == a2.f1)
assert(a1.f1.hashCode() == a2.f1.hashCode())
assert(a1.f1.toString() == a2.f1.toString())
assert(f1 == a1.f3.x)
assert(f1.hashCode() == a1.f3.x.hashCode())
assert(f1.toString() == a1.f3.x.toString())
assert(f1 == a2.f3.x)
assert(f1.hashCode() == a2.f3.x.hashCode())
assert(f1.toString() == a2.f3.x.toString())
assert(a1.f3.x == a2.f3.x)
assert(a1.f3.x.hashCode() == a2.f3.x.hashCode())
assert(a1.f3.x.toString() == a2.f3.x.toString())
assert(f2 == a1.f2)
assert(f2.hashCode() == a1.f2.hashCode())
assert(f2.toString() == a1.f2.toString())
assert(f2 == a2.f2)
assert(f2.hashCode() == a2.f2.hashCode())
assert(f2.toString() == a2.f2.toString())
assert(a1.f2 == a2.f2)
assert(a1.f2.hashCode() == a2.f2.hashCode())
assert(a1.f2.toString() == a2.f2.toString())
assert(f2 == a1.f3.y)
assert(f2.hashCode() == a1.f3.y.hashCode())
assert(f2.toString() == a1.f3.y.toString())
assert(f2 == a2.f3.y)
assert(f2.hashCode() == a2.f3.y.hashCode())
assert(f2.toString() == a2.f3.y.toString())
assert(a1.f3.y == a2.f3.y)
assert(a1.f3.y.hashCode() == a2.f3.y.hashCode())
assert(a1.f3.y.toString() == a2.f3.y.toString())
assert(f3 == a1.f3)
assert(f3.hashCode() == a1.f3.hashCode())
@@ -8,12 +8,14 @@
OPTIONAL_JVM_INLINE_ANNOTATION
value class A1(val x: <!VALUE_CLASS_CANNOT_BE_RECURSIVE!>A1<!>)
OPTIONAL_JVM_INLINE_ANNOTATION
value class B1(val x: <!VALUE_CLASS_CANNOT_BE_RECURSIVE!>B1<!>, val y: <!VALUE_CLASS_CANNOT_BE_RECURSIVE!>B1<!>)
OPTIONAL_JVM_INLINE_ANNOTATION
value class A2(val x: <!VALUE_CLASS_CANNOT_BE_RECURSIVE!>B2<!>)
OPTIONAL_JVM_INLINE_ANNOTATION
value class B2(val x: <!VALUE_CLASS_CANNOT_BE_RECURSIVE!>A2<!>, val y: <!VALUE_CLASS_CANNOT_BE_RECURSIVE!>A2<!>)
@@ -24,26 +26,32 @@ OPTIONAL_JVM_INLINE_ANNOTATION
value class B3(val x: <!VALUE_CLASS_CANNOT_BE_RECURSIVE!>A3<!>)
OPTIONAL_JVM_INLINE_ANNOTATION
value class A4(val x: <!VALUE_CLASS_CANNOT_BE_RECURSIVE!>B4<!>, val y: <!VALUE_CLASS_CANNOT_BE_RECURSIVE!>B4<!>)
OPTIONAL_JVM_INLINE_ANNOTATION
value class B4(val x: <!VALUE_CLASS_CANNOT_BE_RECURSIVE!>A4<!>, val y: <!VALUE_CLASS_CANNOT_BE_RECURSIVE!>A4<!>)
OPTIONAL_JVM_INLINE_ANNOTATION
value class C4(val x: <!VALUE_CLASS_CANNOT_BE_RECURSIVE!>D4?<!>, val y: <!VALUE_CLASS_CANNOT_BE_RECURSIVE!>D4?<!>)
OPTIONAL_JVM_INLINE_ANNOTATION
value class D4(val x: <!VALUE_CLASS_CANNOT_BE_RECURSIVE!>D4?<!>, val y: <!VALUE_CLASS_CANNOT_BE_RECURSIVE!>C4?<!>)
OPTIONAL_JVM_INLINE_ANNOTATION
value class A5<T : A5<T>>(val x: <!VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T<!>, val y: <!VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T<!>)
value class A5<T : A5<T>>(val x: <!VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T<!>)
OPTIONAL_JVM_INLINE_ANNOTATION
value class B5<T : B5<T>>(val x: <!VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T<!>, val y: <!VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T<!>)
OPTIONAL_JVM_INLINE_ANNOTATION
value class A6<T : B6<<!UPPER_BOUND_VIOLATED!>T<!>>>(val x: <!VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T<!>, val y: <!VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T<!>)
value class B6<T : A6<<!UPPER_BOUND_VIOLATED!>T<!>>>(val x: <!VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T<!>, val y: <!VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T<!>)
OPTIONAL_JVM_INLINE_ANNOTATION
value class B6<T : A6<<!UPPER_BOUND_VIOLATED!>T<!>>>(val x: <!VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T<!>)
OPTIONAL_JVM_INLINE_ANNOTATION
@@ -53,11 +61,8 @@ OPTIONAL_JVM_INLINE_ANNOTATION
value class B7<T : A7<<!UPPER_BOUND_VIOLATED!>T<!>>>(val x: <!VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T<!>, val y: <!VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T<!>)
value class A8<T : B8<<!UPPER_BOUND_VIOLATED!>T<!>>>(val x: <!VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T<!>, val y: <!VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T<!>)
OPTIONAL_JVM_INLINE_ANNOTATION
value class A8<T : B8<<!UPPER_BOUND_VIOLATED!>T<!>>>(val x: <!VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T?<!>, val y: <!VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T?<!>)
value class B8<T : A8<<!UPPER_BOUND_VIOLATED!>T<!>>>(val x: <!VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T<!>, val y: <!VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T<!>)
value class A9<T : B9<<!UPPER_BOUND_VIOLATED!>T<!>>>(val x: <!VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T?<!>, val y: <!VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T?<!>)
value class B9<T : A9<<!UPPER_BOUND_VIOLATED!>T<!>>>(val x: <!VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T?<!>, val y: <!VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T?<!>)
OPTIONAL_JVM_INLINE_ANNOTATION
value class B8<T : A8<<!UPPER_BOUND_VIOLATED!>T<!>>>(val x: <!VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T?<!>, val y: <!VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T?<!>)
@@ -1,6 +1,6 @@
package
public final value class A1 {
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class A1 {
public constructor A1(/*0*/ x: A1)
public final val x: A1
public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@@ -8,7 +8,7 @@ public final value class A1 {
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class A2 {
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class A2 {
public constructor A2(/*0*/ x: B2)
public final val x: B2
public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@@ -16,7 +16,7 @@ public final value class A2 {
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class A3 {
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class A3 {
public constructor A3(/*0*/ x: B3)
public final val x: B3
public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@@ -24,7 +24,7 @@ public final value class A3 {
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class A4 {
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class A4 {
public constructor A4(/*0*/ x: B4, /*1*/ y: B4)
public final val x: B4
public final val y: B4
@@ -33,16 +33,15 @@ public final value class A4 {
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class A5</*0*/ T : A5<T>> {
public constructor A5</*0*/ T : A5<T>>(/*0*/ x: T, /*1*/ y: T)
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class A5</*0*/ T : A5<T>> {
public constructor A5</*0*/ T : A5<T>>(/*0*/ x: T)
public final val x: T
public final val y: T
public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class A6</*0*/ T : B6<T>> {
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class A6</*0*/ T : B6<T>> {
public constructor A6</*0*/ T : B6<T>>(/*0*/ x: T, /*1*/ y: T)
public final val x: T
public final val y: T
@@ -51,7 +50,7 @@ public final value class A6</*0*/ T : B6<T>> {
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class A7</*0*/ T : B7<T>> {
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class A7</*0*/ T : B7<T>> {
public constructor A7</*0*/ T : B7<T>>(/*0*/ x: T, /*1*/ y: T)
public final val x: T
public final val y: T
@@ -60,17 +59,8 @@ public final value class A7</*0*/ T : B7<T>> {
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class A8</*0*/ T : B8<T>> {
public constructor A8</*0*/ T : B8<T>>(/*0*/ x: T, /*1*/ y: T)
public final val x: T
public final val y: T
public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class A9</*0*/ T : B9<T>> {
public constructor A9</*0*/ T : B9<T>>(/*0*/ x: T?, /*1*/ y: T?)
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class A8</*0*/ T : B8<T>> {
public constructor A8</*0*/ T : B8<T>>(/*0*/ x: T?, /*1*/ y: T?)
public final val x: T?
public final val y: T?
public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@@ -78,7 +68,7 @@ public final value class A9</*0*/ T : B9<T>> {
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class B1 {
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class B1 {
public constructor B1(/*0*/ x: B1, /*1*/ y: B1)
public final val x: B1
public final val y: B1
@@ -87,7 +77,7 @@ public final value class B1 {
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class B2 {
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class B2 {
public constructor B2(/*0*/ x: A2, /*1*/ y: A2)
public final val x: A2
public final val y: A2
@@ -96,7 +86,7 @@ public final value class B2 {
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class B3 {
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class B3 {
public constructor B3(/*0*/ x: A3)
public final val x: A3
public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@@ -104,7 +94,7 @@ public final value class B3 {
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class B4 {
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class B4 {
public constructor B4(/*0*/ x: A4, /*1*/ y: A4)
public final val x: A4
public final val y: A4
@@ -113,7 +103,7 @@ public final value class B4 {
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class B5</*0*/ T : B5<T>> {
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class B5</*0*/ T : B5<T>> {
public constructor B5</*0*/ T : B5<T>>(/*0*/ x: T, /*1*/ y: T)
public final val x: T
public final val y: T
@@ -122,16 +112,15 @@ public final value class B5</*0*/ T : B5<T>> {
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class B6</*0*/ T : A6<T>> {
public constructor B6</*0*/ T : A6<T>>(/*0*/ x: T, /*1*/ y: T)
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class B6</*0*/ T : A6<T>> {
public constructor B6</*0*/ T : A6<T>>(/*0*/ x: T)
public final val x: T
public final val y: T
public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class B7</*0*/ T : A7<T>> {
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class B7</*0*/ T : A7<T>> {
public constructor B7</*0*/ T : A7<T>>(/*0*/ x: T, /*1*/ y: T)
public final val x: T
public final val y: T
@@ -140,17 +129,8 @@ public final value class B7</*0*/ T : A7<T>> {
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class B8</*0*/ T : A8<T>> {
public constructor B8</*0*/ T : A8<T>>(/*0*/ x: T, /*1*/ y: T)
public final val x: T
public final val y: T
public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class B9</*0*/ T : A9<T>> {
public constructor B9</*0*/ T : A9<T>>(/*0*/ x: T?, /*1*/ y: T?)
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class B8</*0*/ T : A8<T>> {
public constructor B8</*0*/ T : A8<T>>(/*0*/ x: T?, /*1*/ y: T?)
public final val x: T?
public final val y: T?
public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@@ -158,7 +138,7 @@ public final value class B9</*0*/ T : A9<T>> {
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class C4 {
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class C4 {
public constructor C4(/*0*/ x: D4?, /*1*/ y: D4?)
public final val x: D4?
public final val y: D4?
@@ -167,7 +147,7 @@ public final value class C4 {
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class D4 {
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class D4 {
public constructor D4(/*0*/ x: D4?, /*1*/ y: C4?)
public final val x: D4?
public final val y: C4?
@@ -175,4 +155,3 @@ public final value class D4 {
public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
@@ -4,6 +4,7 @@
// WORKS_WHEN_VALUE_CLASS
// LANGUAGE: +ValueClasses
OPTIONAL_JVM_INLINE_ANNOTATION
value class Empty<T><!VALUE_CLASS_EMPTY_CONSTRUCTOR!>()<!>
@@ -1,6 +1,6 @@
package
public final value class Bar {
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class Bar {
public constructor Bar(/*0*/ u: kotlin.Unit, /*1*/ y: kotlin.Unit)
public final val u: kotlin.Unit
public final val y: kotlin.Unit
@@ -9,7 +9,7 @@ public final value class Bar {
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class BarNullable {
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class BarNullable {
public constructor BarNullable(/*0*/ u: kotlin.Unit?, /*1*/ y: kotlin.Unit?)
public final val u: kotlin.Unit?
public final val y: kotlin.Unit?
@@ -18,7 +18,7 @@ public final value class BarNullable {
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class Baz {
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class Baz {
public constructor Baz(/*0*/ u: kotlin.Nothing, /*1*/ y: kotlin.Nothing)
public final val u: kotlin.Nothing
public final val y: kotlin.Nothing
@@ -27,7 +27,7 @@ public final value class Baz {
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class BazNullable {
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class BazNullable {
public constructor BazNullable(/*0*/ u: kotlin.Nothing?, /*1*/ y: kotlin.Nothing?)
public final val u: kotlin.Nothing?
public final val y: kotlin.Nothing?
@@ -36,14 +36,14 @@ public final value class BazNullable {
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class Empty</*0*/ T> {
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class Empty</*0*/ T> {
public constructor Empty</*0*/ T>()
public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class Foo</*0*/ T> {
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class Foo</*0*/ T> {
public constructor Foo</*0*/ T>(/*0*/ x: T, /*1*/ y: T)
public final val x: T
public final val y: T
@@ -52,7 +52,7 @@ public final value class Foo</*0*/ T> {
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class FooGenericArray</*0*/ T> {
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class FooGenericArray</*0*/ T> {
public constructor FooGenericArray</*0*/ T>(/*0*/ x: kotlin.Array<T>, /*1*/ y: kotlin.Array<T>)
public final val x: kotlin.Array<T>
public final val y: kotlin.Array<T>
@@ -61,7 +61,7 @@ public final value class FooGenericArray</*0*/ T> {
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class FooGenericArray2</*0*/ T> {
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class FooGenericArray2</*0*/ T> {
public constructor FooGenericArray2</*0*/ T>(/*0*/ x: kotlin.Array<kotlin.Array<T>>, /*1*/ y: kotlin.Array<kotlin.Array<T>>)
public final val x: kotlin.Array<kotlin.Array<T>>
public final val y: kotlin.Array<kotlin.Array<T>>
@@ -70,7 +70,7 @@ public final value class FooGenericArray2</*0*/ T> {
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class FooNullable</*0*/ T> {
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class FooNullable</*0*/ T> {
public constructor FooNullable</*0*/ T>(/*0*/ x: T?, /*1*/ y: T?)
public final val x: T?
public final val y: T?
@@ -79,7 +79,7 @@ public final value class FooNullable</*0*/ T> {
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class FooStarProjectedArray {
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class FooStarProjectedArray {
public constructor FooStarProjectedArray(/*0*/ x: kotlin.Array<*>, /*1*/ y: kotlin.Array<*>)
public final val x: kotlin.Array<*>
public final val y: kotlin.Array<*>
@@ -88,7 +88,7 @@ public final value class FooStarProjectedArray {
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
public final value class FooStarProjectedArray2 {
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class FooStarProjectedArray2 {
public constructor FooStarProjectedArray2(/*0*/ x: kotlin.Array<kotlin.Array<*>>, /*1*/ y: kotlin.Array<kotlin.Array<*>>)
public final val x: kotlin.Array<kotlin.Array<*>>
public final val y: kotlin.Array<kotlin.Array<*>>
@@ -32207,7 +32207,7 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
@Test
@TestMetadata("recursiveMultiFieldValueClasses.kt")
public void testRecursiveMultiFieldValueClasses() throws Exception {
runTest("compiler/testData/diagnostics/tests/valueClasses/recursiveMultiFieldValueClasses.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
runTest("compiler/testData/diagnostics/tests/valueClasses/recursiveMultiFieldValueClasses.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithUniversal());
}
@Test
@@ -32267,7 +32267,7 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
@Test
@TestMetadata("valueClassWithForbiddenUnderlyingTypeMultiField.kt")
public void testValueClassWithForbiddenUnderlyingTypeMultiField() throws Exception {
runTest("compiler/testData/diagnostics/tests/valueClasses/valueClassWithForbiddenUnderlyingTypeMultiField.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
runTest("compiler/testData/diagnostics/tests/valueClasses/valueClassWithForbiddenUnderlyingTypeMultiField.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithUniversal());
}
@Test
@@ -11,6 +11,9 @@ object TransformersFunctions {
@JvmStatic
val replaceOptionalJvmInlineAnnotationWithReal = ReplacingSourceTransformer("OPTIONAL_JVM_INLINE_ANNOTATION", "@JvmInline")
@JvmStatic
val replaceOptionalJvmInlineAnnotationWithUniversal = ReplacingSourceTransformer("OPTIONAL_JVM_INLINE_ANNOTATION", "@Suppress(\"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE\") @kotlin.jvm.JvmInline")
@JvmStatic
val removeOptionalJvmInlineAnnotation = ReplacingSourceTransformer("OPTIONAL_JVM_INLINE_ANNOTATION", "")
@@ -7,12 +7,16 @@ package org.jetbrains.kotlin.generators.model
class WithoutJvmInlineTestMethodModel(
source: SimpleTestMethodModel,
withAnnotation: Boolean,
withAnnotation: Boolean?,
withPostfix: Boolean,
) : TransformingTestMethodModel(
source,
transformer = "TransformersFunctions.get" +
if (withAnnotation) "ReplaceOptionalJvmInlineAnnotationWithReal()" else "RemoveOptionalJvmInlineAnnotation()"
when (withAnnotation) {
true -> "ReplaceOptionalJvmInlineAnnotationWithReal()"
false -> "RemoveOptionalJvmInlineAnnotation()"
null -> "ReplaceOptionalJvmInlineAnnotationWithUniversal()"
}
) {
override val name: String = source.name + if (withPostfix) "_valueClasses" else ""
}
@@ -42,9 +42,9 @@ fun methodModelLocator(
).let { methodModel ->
if (methodModel.containsWithoutJvmInline()) {
val isWithAnnotationAndIsWithPostfix = when {
!targetBackend.isRecursivelyCompatibleWith(TargetBackend.JVM) -> listOf(false to false)
targetBackend.isIR -> listOf(true to false, false to true)
else -> listOf(true to false)
targetBackend.isRecursivelyCompatibleWith(TargetBackend.JVM) -> listOf(true to false)
targetBackend == TargetBackend.ANY -> listOf(null to false)
else -> listOf(false to false)
}
isWithAnnotationAndIsWithPostfix.map { (ann, post) -> WithoutJvmInlineTestMethodModel(methodModel, ann, post) }
} else listOf(methodModel)