FIR: introduce inline classes checks
This commit is contained in:
committed by
Mikhail Glukhikh
parent
9cc8f44390
commit
f6e564ffa6
+28
@@ -2394,6 +2394,34 @@ public class LazyBodyIsNotTouchedTilContractsPhaseTestGenerated extends Abstract
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("compiler/fir/analysis-tests/testData/resolve/inlineClasses")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public static class InlineClasses extends AbstractLazyBodyIsNotTouchedTilContractsPhaseTest {
|
||||||
|
private void runTest(String testDataFilePath) throws Exception {
|
||||||
|
KotlinTestUtils.runTest(this::doTest, this, testDataFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testAllFilesPresentInInlineClasses() throws Exception {
|
||||||
|
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolve/inlineClasses"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("inlineClassConstructor.kt")
|
||||||
|
public void testInlineClassConstructor() throws Exception {
|
||||||
|
runTest("compiler/fir/analysis-tests/testData/resolve/inlineClasses/inlineClassConstructor.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("inlineClassDeclaration.kt")
|
||||||
|
public void testInlineClassDeclaration() throws Exception {
|
||||||
|
runTest("compiler/fir/analysis-tests/testData/resolve/inlineClasses/inlineClassDeclaration.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("inlineClassMembers.kt")
|
||||||
|
public void testInlineClassMembers() throws Exception {
|
||||||
|
runTest("compiler/fir/analysis-tests/testData/resolve/inlineClasses/inlineClassMembers.kt");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("compiler/fir/analysis-tests/testData/resolve/innerClasses")
|
@TestMetadata("compiler/fir/analysis-tests/testData/resolve/innerClasses")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
|||||||
@@ -18,4 +18,4 @@ class SomeClass : SomeInterface {
|
|||||||
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var fau: Double
|
<!INAPPLICABLE_LATEINIT_MODIFIER!>lateinit<!> var fau: Double
|
||||||
}
|
}
|
||||||
|
|
||||||
inline class InlineClass
|
<!ABSENCE_OF_PRIMARY_CONSTRUCTOR_FOR_INLINE_CLASS!>inline<!> class InlineClass
|
||||||
|
|||||||
+146
@@ -0,0 +1,146 @@
|
|||||||
|
FILE: inlineClassConstructor.kt
|
||||||
|
public final class WithoutConstructor : R|kotlin/Any| {
|
||||||
|
public constructor(): R|WithoutConstructor| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final inline class WithoutParameter : R|kotlin/Any| {
|
||||||
|
public constructor(): R|WithoutParameter| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final inline class WithTwoParameters : R|kotlin/Any| {
|
||||||
|
public constructor(x: R|kotlin/Int|, y: R|kotlin/String|): R|WithTwoParameters| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val x: R|kotlin/Int| = R|<local>/x|
|
||||||
|
public get(): R|kotlin/Int|
|
||||||
|
|
||||||
|
public final val y: R|kotlin/String| = R|<local>/y|
|
||||||
|
public get(): R|kotlin/String|
|
||||||
|
|
||||||
|
}
|
||||||
|
public final inline class Ok : R|kotlin/Any| {
|
||||||
|
public constructor(x: R|kotlin/Int|): R|Ok| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
private final val x: R|kotlin/Int| = R|<local>/x|
|
||||||
|
private get(): R|kotlin/Int|
|
||||||
|
|
||||||
|
}
|
||||||
|
public final inline class OpenParameter : R|kotlin/Any| {
|
||||||
|
public constructor(x: R|kotlin/Int|): R|OpenParameter| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public open val x: R|kotlin/Int| = R|<local>/x|
|
||||||
|
public get(): R|kotlin/Int|
|
||||||
|
|
||||||
|
}
|
||||||
|
public final inline class VarargParameter : R|kotlin/Any| {
|
||||||
|
public constructor(vararg x: R|kotlin/IntArray|): R|VarargParameter| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final inline class VarParameter : R|kotlin/Any| {
|
||||||
|
public constructor(x: R|kotlin/Int|): R|VarParameter| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final var x: R|kotlin/Int| = R|<local>/x|
|
||||||
|
public get(): R|kotlin/Int|
|
||||||
|
public set(value: R|kotlin/Int|): R|kotlin/Unit|
|
||||||
|
|
||||||
|
}
|
||||||
|
public final inline class SimpleParameter : R|kotlin/Any| {
|
||||||
|
public constructor(x: R|kotlin/Int|): R|SimpleParameter| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final inline class UnitParameter : R|kotlin/Any| {
|
||||||
|
public constructor(x: R|kotlin/Unit|): R|UnitParameter| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val x: R|kotlin/Unit| = R|<local>/x|
|
||||||
|
public get(): R|kotlin/Unit|
|
||||||
|
|
||||||
|
}
|
||||||
|
public final inline class NothingParameter : R|kotlin/Any| {
|
||||||
|
public constructor(x: R|kotlin/Nothing|): R|NothingParameter| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val x: R|kotlin/Nothing| = R|<local>/x|
|
||||||
|
public get(): R|kotlin/Nothing|
|
||||||
|
|
||||||
|
}
|
||||||
|
public final inline class TypeParameterType<T> : R|kotlin/Any| {
|
||||||
|
public constructor<T>(x: R|T|): R|TypeParameterType<T>| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val x: R|T| = R|<local>/x|
|
||||||
|
public get(): R|T|
|
||||||
|
|
||||||
|
}
|
||||||
|
public final inline class ArrayOfTypeParameters<T> : R|kotlin/Any| {
|
||||||
|
public constructor<T>(x: R|kotlin/Array<T>|): R|ArrayOfTypeParameters<T>| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val x: R|kotlin/Array<T>| = R|<local>/x|
|
||||||
|
public get(): R|kotlin/Array<T>|
|
||||||
|
|
||||||
|
}
|
||||||
|
public final inline class ListOfTypeParameters<T> : R|kotlin/Any| {
|
||||||
|
public constructor<T>(x: R|kotlin/collections/List<T>|): R|ListOfTypeParameters<T>| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val x: R|kotlin/collections/List<T>| = R|<local>/x|
|
||||||
|
public get(): R|kotlin/collections/List<T>|
|
||||||
|
|
||||||
|
}
|
||||||
|
public final inline class StarProjection<T> : R|kotlin/Any| {
|
||||||
|
public constructor<T>(x: R|kotlin/Array<*>|): R|StarProjection<T>| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val x: R|kotlin/Array<*>| = R|<local>/x|
|
||||||
|
public get(): R|kotlin/Array<*>|
|
||||||
|
|
||||||
|
}
|
||||||
|
public final inline class SimpleRecursive : R|kotlin/Any| {
|
||||||
|
public constructor(x: R|SimpleRecursive|): R|SimpleRecursive| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val x: R|SimpleRecursive| = R|<local>/x|
|
||||||
|
public get(): R|SimpleRecursive|
|
||||||
|
|
||||||
|
}
|
||||||
|
public final inline class DoubleRecursive1 : R|kotlin/Any| {
|
||||||
|
public constructor(x: R|DoubleRecursive2|): R|DoubleRecursive1| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val x: R|DoubleRecursive2| = R|<local>/x|
|
||||||
|
public get(): R|DoubleRecursive2|
|
||||||
|
|
||||||
|
}
|
||||||
|
public final inline class DoubleRecursive2 : R|kotlin/Any| {
|
||||||
|
public constructor(x: R|DoubleRecursive1|): R|DoubleRecursive2| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val x: R|DoubleRecursive1| = R|<local>/x|
|
||||||
|
public get(): R|DoubleRecursive1|
|
||||||
|
|
||||||
|
}
|
||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
<!ABSENCE_OF_PRIMARY_CONSTRUCTOR_FOR_INLINE_CLASS!>value<!> class WithoutConstructor {}
|
||||||
|
|
||||||
|
inline class WithoutParameter<!INLINE_CLASS_CONSTRUCTOR_WRONG_PARAMETERS_SIZE!>()<!> {}
|
||||||
|
inline class WithTwoParameters<!INLINE_CLASS_CONSTRUCTOR_WRONG_PARAMETERS_SIZE!>(val x: Int, val y: String)<!> {}
|
||||||
|
|
||||||
|
inline class Ok(private val x: Int) {}
|
||||||
|
inline class OpenParameter(<!INLINE_CLASS_CONSTRUCTOR_NOT_FINAL_READ_ONLY_PARAMETER!><!NON_FINAL_MEMBER_IN_FINAL_CLASS!>open<!> val x: Int<!>) {}
|
||||||
|
inline class VarargParameter(<!INLINE_CLASS_CONSTRUCTOR_NOT_FINAL_READ_ONLY_PARAMETER!>vararg x: Int<!>) {}
|
||||||
|
inline class VarParameter(<!INLINE_CLASS_CONSTRUCTOR_NOT_FINAL_READ_ONLY_PARAMETER!>var x: Int<!>) {}
|
||||||
|
inline class SimpleParameter(<!INLINE_CLASS_CONSTRUCTOR_NOT_FINAL_READ_ONLY_PARAMETER!>x: Int<!>) {}
|
||||||
|
|
||||||
|
inline class UnitParameter(val x: <!INLINE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>Unit<!>)
|
||||||
|
inline class NothingParameter(val x: <!INLINE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>Nothing<!>)
|
||||||
|
inline class TypeParameterType<T>(val x: <!INLINE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T<!>)
|
||||||
|
inline class ArrayOfTypeParameters<T>(val x: <!INLINE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>Array<T><!>)
|
||||||
|
inline class ListOfTypeParameters<T>(val x: List<T>)
|
||||||
|
inline class StarProjection<T>(val x: Array<*>)
|
||||||
|
|
||||||
|
inline class SimpleRecursive(val x: <!INLINE_CLASS_CANNOT_BE_RECURSIVE!>SimpleRecursive<!>)
|
||||||
|
inline class DoubleRecursive1(val x: <!INLINE_CLASS_CANNOT_BE_RECURSIVE!>DoubleRecursive2<!>)
|
||||||
|
inline class DoubleRecursive2(val x: <!INLINE_CLASS_CANNOT_BE_RECURSIVE!>DoubleRecursive1<!>)
|
||||||
+111
@@ -0,0 +1,111 @@
|
|||||||
|
FILE: inlineClassDeclaration.kt
|
||||||
|
public final class A : R|kotlin/Any| {
|
||||||
|
public constructor(): R|A| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final inline class B : R|kotlin/Any| {
|
||||||
|
public constructor(x: R|kotlin/Int|): R|A.B| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val x: R|kotlin/Int| = R|<local>/x|
|
||||||
|
public get(): R|kotlin/Int|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public final fun foo(): R|kotlin/Unit| {
|
||||||
|
local final inline class C : R|kotlin/Any| {
|
||||||
|
public constructor(x: R|kotlin/Int|): R|A.C| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val x: R|kotlin/Int| = R|<local>/x|
|
||||||
|
public get(): R|kotlin/Int|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public final inner class D : R|kotlin/Any| {
|
||||||
|
public constructor(x: R|kotlin/Int|): R|A.D| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val x: R|kotlin/Int| = R|<local>/x|
|
||||||
|
public get(): R|kotlin/Int|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public open inline class NotFinalClass1 : R|kotlin/Any| {
|
||||||
|
public constructor(x: R|kotlin/Int|): R|NotFinalClass1| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val x: R|kotlin/Int| = R|<local>/x|
|
||||||
|
public get(): R|kotlin/Int|
|
||||||
|
|
||||||
|
}
|
||||||
|
public abstract inline class NotFinalClass2 : R|kotlin/Any| {
|
||||||
|
public constructor(x: R|kotlin/Int|): R|NotFinalClass2| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val x: R|kotlin/Int| = R|<local>/x|
|
||||||
|
public get(): R|kotlin/Int|
|
||||||
|
|
||||||
|
}
|
||||||
|
public sealed inline class NotFinalClass3 : R|kotlin/Any| {
|
||||||
|
protected constructor(x: R|kotlin/Int|): R|NotFinalClass3| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val x: R|kotlin/Int| = R|<local>/x|
|
||||||
|
public get(): R|kotlin/Int|
|
||||||
|
|
||||||
|
}
|
||||||
|
public final class CloneableClass1 : R|kotlin/Cloneable| {
|
||||||
|
public constructor(x: R|kotlin/Int|): R|CloneableClass1| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val x: R|kotlin/Int| = R|<local>/x|
|
||||||
|
public get(): R|kotlin/Int|
|
||||||
|
|
||||||
|
}
|
||||||
|
public final inline class CloneableClass2 : R|java/lang/Cloneable| {
|
||||||
|
public constructor(x: R|kotlin/Int|): R|CloneableClass2| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val x: R|kotlin/Int| = R|<local>/x|
|
||||||
|
public get(): R|kotlin/Int|
|
||||||
|
|
||||||
|
}
|
||||||
|
public open class Test : R|kotlin/Any| {
|
||||||
|
public constructor(): R|Test| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final inline class ExtendTest : R|Test| {
|
||||||
|
public constructor(x: R|kotlin/Int|): R|ExtendTest| {
|
||||||
|
super<R|Test|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val x: R|kotlin/Int| = R|<local>/x|
|
||||||
|
public get(): R|kotlin/Int|
|
||||||
|
|
||||||
|
}
|
||||||
|
public final inline class ImplementByDelegation : R|kotlin/Comparable<kotlin/Int>| {
|
||||||
|
public constructor(x: R|kotlin/Int|): R|ImplementByDelegation| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
local final field <$$delegate_0>: R|kotlin/Comparable<kotlin/Int>| = R|<local>/x|
|
||||||
|
|
||||||
|
public final val x: R|kotlin/Int| = R|<local>/x|
|
||||||
|
public get(): R|kotlin/Int|
|
||||||
|
|
||||||
|
}
|
||||||
+19
@@ -0,0 +1,19 @@
|
|||||||
|
class A {
|
||||||
|
<!INLINE_CLASS_NOT_TOP_LEVEL!>inline<!> class B(val x: Int)
|
||||||
|
fun foo() {
|
||||||
|
<!INLINE_CLASS_NOT_TOP_LEVEL!>inline<!> class C(val x: Int)
|
||||||
|
}
|
||||||
|
inner <!INLINE_CLASS_NOT_TOP_LEVEL!>value<!> class D(val x: Int)
|
||||||
|
}
|
||||||
|
|
||||||
|
<!INLINE_CLASS_NOT_FINAL!>open<!> inline class NotFinalClass1(val x: Int)
|
||||||
|
<!INLINE_CLASS_NOT_FINAL!>abstract<!> inline class NotFinalClass2(val x: Int)
|
||||||
|
<!INLINE_CLASS_NOT_FINAL!>sealed<!> inline class NotFinalClass3(val x: Int)
|
||||||
|
|
||||||
|
<!VALUE_CLASS_CANNOT_BE_CLONEABLE!>value<!> class CloneableClass1(val x: Int): Cloneable
|
||||||
|
<!VALUE_CLASS_CANNOT_BE_CLONEABLE!>inline<!> class CloneableClass2(val x: Int): java.lang.Cloneable
|
||||||
|
|
||||||
|
open class Test
|
||||||
|
inline class ExtendTest(val x: Int): <!INLINE_CLASS_CANNOT_EXTEND_CLASSES!>Test<!>
|
||||||
|
|
||||||
|
inline class ImplementByDelegation(val x: Int) : <!INLINE_CLASS_CANNOT_IMPLEMENT_INTERFACE_BY_DELEGATION!>Comparable<Int><!> by x
|
||||||
+100
@@ -0,0 +1,100 @@
|
|||||||
|
FILE: inlineClassMembers.kt
|
||||||
|
public final class BackingFields : R|kotlin/Any| {
|
||||||
|
public constructor(x: R|kotlin/Int|): R|BackingFields| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val x: R|kotlin/Int| = R|<local>/x|
|
||||||
|
public get(): R|kotlin/Int|
|
||||||
|
|
||||||
|
public final val y: R|kotlin/Int| = Int(0)
|
||||||
|
public get(): R|kotlin/Int|
|
||||||
|
|
||||||
|
public final var z: R|kotlin/String|
|
||||||
|
public get(): R|kotlin/String| {
|
||||||
|
^ String()
|
||||||
|
}
|
||||||
|
public set(value: R|kotlin/String|): R|kotlin/Unit| {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final class Val : R|kotlin/Any| {
|
||||||
|
public constructor(): R|Val| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final operator fun getValue(thisRef: R|kotlin/Any?|, kProp: R|kotlin/Any?|): R|kotlin/Int| {
|
||||||
|
^getValue Int(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final inline class DelegatedProp : R|kotlin/Any| {
|
||||||
|
public constructor(x: R|kotlin/Int|): R|DelegatedProp| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val x: R|kotlin/Int| = R|<local>/x|
|
||||||
|
public get(): R|kotlin/Int|
|
||||||
|
|
||||||
|
public final val testVal: R|kotlin/Int|by R|/Val.Val|()
|
||||||
|
public get(): R|kotlin/Int| {
|
||||||
|
^ this@R|/DelegatedProp|.D|/DelegatedProp.testVal|.R|/Val.getValue|(this@R|/DelegatedProp|, ::R|/DelegatedProp.testVal|)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final inline class ReversedMembers : R|kotlin/Any| {
|
||||||
|
public constructor(x: R|kotlin/Int|): R|ReversedMembers| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val x: R|kotlin/Int| = R|<local>/x|
|
||||||
|
public get(): R|kotlin/Int|
|
||||||
|
|
||||||
|
public final fun box(): R|kotlin/Unit| {
|
||||||
|
}
|
||||||
|
|
||||||
|
public final fun unbox(): R|kotlin/Unit| {
|
||||||
|
}
|
||||||
|
|
||||||
|
public final override operator fun equals(other: R|kotlin/Any?|): R|kotlin/Boolean| {
|
||||||
|
^equals Boolean(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
public final override fun hashCode(): R|kotlin/Int| {
|
||||||
|
^hashCode Int(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final inline class SecondaryConstructors : R|kotlin/Any| {
|
||||||
|
public constructor(x: R|kotlin/Int|): R|SecondaryConstructors| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val x: R|kotlin/Int| = R|<local>/x|
|
||||||
|
public get(): R|kotlin/Int|
|
||||||
|
|
||||||
|
public constructor(y: R|kotlin/String|): R|SecondaryConstructors| {
|
||||||
|
this<R|SecondaryConstructors|>(Int(5))
|
||||||
|
}
|
||||||
|
|
||||||
|
public constructor(x: R|kotlin/Int|, y: R|kotlin/String|): R|SecondaryConstructors| {
|
||||||
|
this<R|SecondaryConstructors|>(R|<local>/x|)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final class WithInner : R|kotlin/Any| {
|
||||||
|
public constructor(x: R|kotlin/String|): R|WithInner| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val x: R|kotlin/String| = R|<local>/x|
|
||||||
|
public get(): R|kotlin/String|
|
||||||
|
|
||||||
|
public final inner class Inner : R|kotlin/Any| {
|
||||||
|
public constructor(): R|WithInner.Inner| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+32
@@ -0,0 +1,32 @@
|
|||||||
|
value class BackingFields(val x: Int) {
|
||||||
|
<!PROPERTY_WITH_BACKING_FIELD_INSIDE_INLINE_CLASS!>val y<!> = 0
|
||||||
|
var z: String
|
||||||
|
get() = ""
|
||||||
|
set(value) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Val {
|
||||||
|
operator fun getValue(thisRef: Any?, kProp: Any?) = 1
|
||||||
|
}
|
||||||
|
inline class DelegatedProp(val x: Int) {
|
||||||
|
val testVal by <!DELEGATED_PROPERTY_INSIDE_INLINE_CLASS!>Val()<!>
|
||||||
|
}
|
||||||
|
|
||||||
|
inline class ReversedMembers(val x: Int) {
|
||||||
|
<!RESERVED_MEMBER_INSIDE_INLINE_CLASS{LT}!>fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS{PSI}!>box<!>() {}<!>
|
||||||
|
<!RESERVED_MEMBER_INSIDE_INLINE_CLASS{LT}!>fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS{PSI}!>unbox<!>() {}<!>
|
||||||
|
|
||||||
|
<!RESERVED_MEMBER_INSIDE_INLINE_CLASS{LT}!>override fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS{PSI}!>equals<!>(other: Any?) = true<!>
|
||||||
|
<!RESERVED_MEMBER_INSIDE_INLINE_CLASS{LT}!>override fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS{PSI}!>hashCode<!>() = 1<!>
|
||||||
|
}
|
||||||
|
|
||||||
|
inline class SecondaryConstructors(val x: Int) {
|
||||||
|
constructor(y: String) : this(5)
|
||||||
|
constructor(x: Int, y: String) : this(x) <!SECONDARY_CONSTRUCTOR_WITH_BODY_INSIDE_INLINE_CLASS!>{
|
||||||
|
|
||||||
|
}<!>
|
||||||
|
}
|
||||||
|
|
||||||
|
value class WithInner(val x: String) {
|
||||||
|
<!INNER_CLASS_INSIDE_INLINE_CLASS!>inner<!> class Inner
|
||||||
|
}
|
||||||
+28
@@ -2724,6 +2724,34 @@ public class FirDiagnosticTestGenerated extends AbstractFirDiagnosticTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nested
|
||||||
|
@TestMetadata("compiler/fir/analysis-tests/testData/resolve/inlineClasses")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
public class InlineClasses {
|
||||||
|
@Test
|
||||||
|
public void testAllFilesPresentInInlineClasses() throws Exception {
|
||||||
|
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolve/inlineClasses"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("inlineClassConstructor.kt")
|
||||||
|
public void testInlineClassConstructor() throws Exception {
|
||||||
|
runTest("compiler/fir/analysis-tests/testData/resolve/inlineClasses/inlineClassConstructor.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("inlineClassDeclaration.kt")
|
||||||
|
public void testInlineClassDeclaration() throws Exception {
|
||||||
|
runTest("compiler/fir/analysis-tests/testData/resolve/inlineClasses/inlineClassDeclaration.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("inlineClassMembers.kt")
|
||||||
|
public void testInlineClassMembers() throws Exception {
|
||||||
|
runTest("compiler/fir/analysis-tests/testData/resolve/inlineClasses/inlineClassMembers.kt");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Nested
|
@Nested
|
||||||
@TestMetadata("compiler/fir/analysis-tests/testData/resolve/innerClasses")
|
@TestMetadata("compiler/fir/analysis-tests/testData/resolve/innerClasses")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
|||||||
+29
@@ -2752,6 +2752,35 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nested
|
||||||
|
@TestMetadata("compiler/fir/analysis-tests/testData/resolve/inlineClasses")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@Execution(ExecutionMode.SAME_THREAD)
|
||||||
|
public class InlineClasses {
|
||||||
|
@Test
|
||||||
|
public void testAllFilesPresentInInlineClasses() throws Exception {
|
||||||
|
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolve/inlineClasses"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("inlineClassConstructor.kt")
|
||||||
|
public void testInlineClassConstructor() throws Exception {
|
||||||
|
runTest("compiler/fir/analysis-tests/testData/resolve/inlineClasses/inlineClassConstructor.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("inlineClassDeclaration.kt")
|
||||||
|
public void testInlineClassDeclaration() throws Exception {
|
||||||
|
runTest("compiler/fir/analysis-tests/testData/resolve/inlineClasses/inlineClassDeclaration.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("inlineClassMembers.kt")
|
||||||
|
public void testInlineClassMembers() throws Exception {
|
||||||
|
runTest("compiler/fir/analysis-tests/testData/resolve/inlineClasses/inlineClassMembers.kt");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Nested
|
@Nested
|
||||||
@TestMetadata("compiler/fir/analysis-tests/testData/resolve/innerClasses")
|
@TestMetadata("compiler/fir/analysis-tests/testData/resolve/innerClasses")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
|||||||
+2
@@ -42,6 +42,8 @@ enum class PositioningStrategy(private val strategy: String? = null) {
|
|||||||
IF_EXPRESSION,
|
IF_EXPRESSION,
|
||||||
VARIANCE_MODIFIER,
|
VARIANCE_MODIFIER,
|
||||||
LATEINIT_MODIFIER,
|
LATEINIT_MODIFIER,
|
||||||
|
INLINE_OR_VALUE_MODIFIER,
|
||||||
|
INNER_MODIFIER,
|
||||||
SELECTOR_BY_QUALIFIED,
|
SELECTOR_BY_QUALIFIED,
|
||||||
REFERENCE_BY_QUALIFIED,
|
REFERENCE_BY_QUALIFIED,
|
||||||
PRIVATE_MODIFIER,
|
PRIVATE_MODIFIER,
|
||||||
|
|||||||
+22
@@ -154,6 +154,28 @@ object DIAGNOSTICS_LIST : DiagnosticList() {
|
|||||||
val REDUNDANT_OPEN_IN_INTERFACE by warning<FirSourceElement, KtModifierListOwner>(PositioningStrategy.OPEN_MODIFIER)
|
val REDUNDANT_OPEN_IN_INTERFACE by warning<FirSourceElement, KtModifierListOwner>(PositioningStrategy.OPEN_MODIFIER)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val INLINE_CLASSES by object : DiagnosticGroup("Inline classes") {
|
||||||
|
val INLINE_CLASS_NOT_TOP_LEVEL by error<FirSourceElement, KtDeclaration>(PositioningStrategy.INLINE_OR_VALUE_MODIFIER)
|
||||||
|
val INLINE_CLASS_NOT_FINAL by error<FirSourceElement, KtDeclaration>(PositioningStrategy.MODALITY_MODIFIER)
|
||||||
|
val ABSENCE_OF_PRIMARY_CONSTRUCTOR_FOR_INLINE_CLASS by error<FirSourceElement, KtDeclaration>(PositioningStrategy.INLINE_OR_VALUE_MODIFIER)
|
||||||
|
val INLINE_CLASS_CONSTRUCTOR_WRONG_PARAMETERS_SIZE by error<FirSourceElement, KtElement>()
|
||||||
|
val INLINE_CLASS_CONSTRUCTOR_NOT_FINAL_READ_ONLY_PARAMETER by error<FirSourceElement, KtParameter>()
|
||||||
|
val PROPERTY_WITH_BACKING_FIELD_INSIDE_INLINE_CLASS by error<FirSourceElement, KtProperty>(PositioningStrategy.DECLARATION_SIGNATURE)
|
||||||
|
val DELEGATED_PROPERTY_INSIDE_INLINE_CLASS by error<FirSourceElement, PsiElement>()
|
||||||
|
val INLINE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE by error<FirSourceElement, KtTypeReference> {
|
||||||
|
parameter<ConeKotlinType>("type")
|
||||||
|
}
|
||||||
|
val INLINE_CLASS_CANNOT_IMPLEMENT_INTERFACE_BY_DELEGATION by error<FirSourceElement, PsiElement>()
|
||||||
|
val INLINE_CLASS_CANNOT_EXTEND_CLASSES by error<FirSourceElement, KtTypeReference>()
|
||||||
|
val INLINE_CLASS_CANNOT_BE_RECURSIVE by error<FirSourceElement, KtTypeReference>()
|
||||||
|
val RESERVED_MEMBER_INSIDE_INLINE_CLASS by error<FirSourceElement, KtFunction>(PositioningStrategy.DECLARATION_NAME) {
|
||||||
|
parameter<String>("fun name")
|
||||||
|
}
|
||||||
|
val SECONDARY_CONSTRUCTOR_WITH_BODY_INSIDE_INLINE_CLASS by error<FirSourceElement, PsiElement>()
|
||||||
|
val INNER_CLASS_INSIDE_INLINE_CLASS by error<FirSourceElement, KtDeclaration>(PositioningStrategy.INNER_MODIFIER)
|
||||||
|
val VALUE_CLASS_CANNOT_BE_CLONEABLE by error<FirSourceElement, KtDeclaration>(PositioningStrategy.INLINE_OR_VALUE_MODIFIER)
|
||||||
|
}
|
||||||
|
|
||||||
val APPLICABILITY by object : DiagnosticGroup("Applicability") {
|
val APPLICABILITY by object : DiagnosticGroup("Applicability") {
|
||||||
val NONE_APPLICABLE by error<FirSourceElement, PsiElement>(PositioningStrategy.REFERENCE_BY_QUALIFIED) {
|
val NONE_APPLICABLE by error<FirSourceElement, PsiElement>(PositioningStrategy.REFERENCE_BY_QUALIFIED) {
|
||||||
parameter<Collection<AbstractFirBasedSymbol<*>>>("candidates")
|
parameter<Collection<AbstractFirBasedSymbol<*>>>("candidates")
|
||||||
|
|||||||
@@ -141,6 +141,23 @@ object FirErrors {
|
|||||||
val INCOMPATIBLE_MODIFIERS by error2<FirSourceElement, PsiElement, KtModifierKeywordToken, KtModifierKeywordToken>()
|
val INCOMPATIBLE_MODIFIERS by error2<FirSourceElement, PsiElement, KtModifierKeywordToken, KtModifierKeywordToken>()
|
||||||
val REDUNDANT_OPEN_IN_INTERFACE by warning0<FirSourceElement, KtModifierListOwner>(SourceElementPositioningStrategies.OPEN_MODIFIER)
|
val REDUNDANT_OPEN_IN_INTERFACE by warning0<FirSourceElement, KtModifierListOwner>(SourceElementPositioningStrategies.OPEN_MODIFIER)
|
||||||
|
|
||||||
|
// Inline classes
|
||||||
|
val INLINE_CLASS_NOT_TOP_LEVEL by error0<FirSourceElement, KtDeclaration>(SourceElementPositioningStrategies.INLINE_OR_VALUE_MODIFIER)
|
||||||
|
val INLINE_CLASS_NOT_FINAL by error0<FirSourceElement, KtDeclaration>(SourceElementPositioningStrategies.MODALITY_MODIFIER)
|
||||||
|
val ABSENCE_OF_PRIMARY_CONSTRUCTOR_FOR_INLINE_CLASS by error0<FirSourceElement, KtDeclaration>(SourceElementPositioningStrategies.INLINE_OR_VALUE_MODIFIER)
|
||||||
|
val INLINE_CLASS_CONSTRUCTOR_WRONG_PARAMETERS_SIZE by error0<FirSourceElement, KtElement>()
|
||||||
|
val INLINE_CLASS_CONSTRUCTOR_NOT_FINAL_READ_ONLY_PARAMETER by error0<FirSourceElement, KtParameter>()
|
||||||
|
val PROPERTY_WITH_BACKING_FIELD_INSIDE_INLINE_CLASS by error0<FirSourceElement, KtProperty>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE)
|
||||||
|
val DELEGATED_PROPERTY_INSIDE_INLINE_CLASS by error0<FirSourceElement, PsiElement>()
|
||||||
|
val INLINE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE by error1<FirSourceElement, KtTypeReference, ConeKotlinType>()
|
||||||
|
val INLINE_CLASS_CANNOT_IMPLEMENT_INTERFACE_BY_DELEGATION by error0<FirSourceElement, PsiElement>()
|
||||||
|
val INLINE_CLASS_CANNOT_EXTEND_CLASSES by error0<FirSourceElement, KtTypeReference>()
|
||||||
|
val INLINE_CLASS_CANNOT_BE_RECURSIVE by error0<FirSourceElement, KtTypeReference>()
|
||||||
|
val RESERVED_MEMBER_INSIDE_INLINE_CLASS by error1<FirSourceElement, KtFunction, String>(SourceElementPositioningStrategies.DECLARATION_NAME)
|
||||||
|
val SECONDARY_CONSTRUCTOR_WITH_BODY_INSIDE_INLINE_CLASS by error0<FirSourceElement, PsiElement>()
|
||||||
|
val INNER_CLASS_INSIDE_INLINE_CLASS by error0<FirSourceElement, KtDeclaration>(SourceElementPositioningStrategies.INNER_MODIFIER)
|
||||||
|
val VALUE_CLASS_CANNOT_BE_CLONEABLE by error0<FirSourceElement, KtDeclaration>(SourceElementPositioningStrategies.INLINE_OR_VALUE_MODIFIER)
|
||||||
|
|
||||||
// Applicability
|
// Applicability
|
||||||
val NONE_APPLICABLE by error1<FirSourceElement, PsiElement, Collection<AbstractFirBasedSymbol<*>>>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED)
|
val NONE_APPLICABLE by error1<FirSourceElement, PsiElement, Collection<AbstractFirBasedSymbol<*>>>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED)
|
||||||
val INAPPLICABLE_CANDIDATE by error1<FirSourceElement, PsiElement, AbstractFirBasedSymbol<*>>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED)
|
val INAPPLICABLE_CANDIDATE by error1<FirSourceElement, PsiElement, AbstractFirBasedSymbol<*>>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED)
|
||||||
|
|||||||
+8
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration
|
|||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
|
import org.jetbrains.kotlin.fir.FirFakeSourceElementKind
|
||||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.modality
|
import org.jetbrains.kotlin.fir.analysis.checkers.modality
|
||||||
@@ -171,3 +172,10 @@ private val FirProperty.hasAccessorImplementation: Boolean
|
|||||||
(setter !is FirDefaultPropertyAccessor && setter?.hasBody == true)
|
(setter !is FirDefaultPropertyAccessor && setter?.hasBody == true)
|
||||||
|
|
||||||
internal val FirClass<*>.canHaveOpenMembers: Boolean get() = modality() != Modality.FINAL || classKind == ClassKind.ENUM_CLASS
|
internal val FirClass<*>.canHaveOpenMembers: Boolean get() = modality() != Modality.FINAL || classKind == ClassKind.ENUM_CLASS
|
||||||
|
|
||||||
|
internal fun FirRegularClass.isInlineOrValueClass(): Boolean {
|
||||||
|
if (this.classKind != ClassKind.CLASS) return false
|
||||||
|
|
||||||
|
val modifierList = with(FirModifierList) { source.getModifierList() }
|
||||||
|
return isInline || modifierList?.modifiers?.any { it.token == KtTokens.VALUE_KEYWORD } == true
|
||||||
|
}
|
||||||
+198
@@ -0,0 +1,198 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.analysis.checkers.declaration
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
|
import org.jetbrains.kotlin.fir.*
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClass
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.calls.isPotentiallyArray
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.defaultType
|
||||||
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
|
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
||||||
|
|
||||||
|
object FirInlineClassDeclarationChecker : FirRegularClassChecker() {
|
||||||
|
|
||||||
|
private val reservedFunctionNames = setOf("box", "unbox", "equals", "hashCode")
|
||||||
|
private val kotlinCloneableType = ClassId.fromString("kotlin/Cloneable").constructClassLikeType(emptyArray(), false)
|
||||||
|
private val javaCloneableType = ClassId.fromString("java/lang/Cloneable").constructClassLikeType(emptyArray(), false)
|
||||||
|
|
||||||
|
override fun check(declaration: FirRegularClass, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||||
|
if (!declaration.isInlineOrValueClass()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (context.containingDeclarations.size > 1) {
|
||||||
|
reporter.reportOn(declaration.source, FirErrors.INLINE_CLASS_NOT_TOP_LEVEL, context)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (declaration.modality != Modality.FINAL) {
|
||||||
|
reporter.reportOn(declaration.source, FirErrors.INLINE_CLASS_NOT_FINAL, context)
|
||||||
|
}
|
||||||
|
|
||||||
|
for (supertypeEntry in declaration.superTypeRefs) {
|
||||||
|
if (supertypeEntry.toRegularClass(context.session)?.isInterface != true) {
|
||||||
|
reporter.reportOn(supertypeEntry.source, FirErrors.INLINE_CLASS_CANNOT_EXTEND_CLASSES, context)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (declaration.isSubtypeOfCloneable(context)) {
|
||||||
|
reporter.reportOn(declaration.source, FirErrors.VALUE_CLASS_CANNOT_BE_CLONEABLE, context)
|
||||||
|
}
|
||||||
|
|
||||||
|
var primaryConstructor: FirConstructor? = null
|
||||||
|
var primaryConstructorParameter: FirValueParameter? = null
|
||||||
|
var primaryConstructorProperty: FirProperty? = null
|
||||||
|
|
||||||
|
for (innerDeclaration in declaration.declarations) {
|
||||||
|
when (innerDeclaration) {
|
||||||
|
is FirConstructor -> {
|
||||||
|
when {
|
||||||
|
innerDeclaration.isPrimary -> {
|
||||||
|
primaryConstructor = innerDeclaration
|
||||||
|
primaryConstructorParameter = innerDeclaration.valueParameters.singleOrNull()
|
||||||
|
}
|
||||||
|
|
||||||
|
innerDeclaration.body != null -> {
|
||||||
|
val bodySource = innerDeclaration.body!!.source
|
||||||
|
reporter.reportOn(bodySource, FirErrors.SECONDARY_CONSTRUCTOR_WITH_BODY_INSIDE_INLINE_CLASS, context)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
is FirRegularClass -> {
|
||||||
|
if (innerDeclaration.isInner) {
|
||||||
|
reporter.reportOn(innerDeclaration.source, FirErrors.INNER_CLASS_INSIDE_INLINE_CLASS, context)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
is FirSimpleFunction -> {
|
||||||
|
val functionName = innerDeclaration.name.asString()
|
||||||
|
|
||||||
|
if (functionName in reservedFunctionNames) {
|
||||||
|
reporter.reportOn(innerDeclaration.source, FirErrors.RESERVED_MEMBER_INSIDE_INLINE_CLASS, functionName, context)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
is FirField -> {
|
||||||
|
if (innerDeclaration.isSynthetic) {
|
||||||
|
val delegatedTypeRefSource = (innerDeclaration.returnTypeRef as FirResolvedTypeRef).delegatedTypeRef?.source
|
||||||
|
reporter.reportOn(delegatedTypeRefSource, FirErrors.INLINE_CLASS_CANNOT_IMPLEMENT_INTERFACE_BY_DELEGATION, context)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
is FirProperty -> {
|
||||||
|
if (innerDeclaration.isRelatedToParameter(primaryConstructorParameter)) {
|
||||||
|
primaryConstructorProperty = innerDeclaration
|
||||||
|
} else {
|
||||||
|
when {
|
||||||
|
innerDeclaration.delegate != null ->
|
||||||
|
reporter.reportOn(
|
||||||
|
innerDeclaration.delegate!!.source,
|
||||||
|
FirErrors.DELEGATED_PROPERTY_INSIDE_INLINE_CLASS,
|
||||||
|
context
|
||||||
|
)
|
||||||
|
|
||||||
|
innerDeclaration.hasBackingField &&
|
||||||
|
innerDeclaration.source?.kind !is FirFakeSourceElementKind ->
|
||||||
|
reporter.reportOn(
|
||||||
|
innerDeclaration.source,
|
||||||
|
FirErrors.PROPERTY_WITH_BACKING_FIELD_INSIDE_INLINE_CLASS,
|
||||||
|
context
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (primaryConstructor?.source?.kind !is FirRealSourceElementKind) {
|
||||||
|
reporter.reportOn(declaration.source, FirErrors.ABSENCE_OF_PRIMARY_CONSTRUCTOR_FOR_INLINE_CLASS, context)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (primaryConstructorParameter == null) {
|
||||||
|
reporter.reportOn(primaryConstructor.source, FirErrors.INLINE_CLASS_CONSTRUCTOR_WRONG_PARAMETERS_SIZE, context)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
when {
|
||||||
|
primaryConstructorParameter.isNotFinalReadOnly(primaryConstructorProperty) ->
|
||||||
|
reporter.reportOn(
|
||||||
|
primaryConstructorParameter.source,
|
||||||
|
FirErrors.INLINE_CLASS_CONSTRUCTOR_NOT_FINAL_READ_ONLY_PARAMETER,
|
||||||
|
context
|
||||||
|
)
|
||||||
|
|
||||||
|
primaryConstructorParameter.returnTypeRef.isInapplicableParameterType() ->
|
||||||
|
reporter.reportOn(
|
||||||
|
primaryConstructorParameter.returnTypeRef.source,
|
||||||
|
FirErrors.INLINE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE,
|
||||||
|
primaryConstructorParameter.returnTypeRef.coneType,
|
||||||
|
context
|
||||||
|
)
|
||||||
|
|
||||||
|
primaryConstructorParameter.returnTypeRef.coneType.isRecursiveInlineClassType(context.session) ->
|
||||||
|
reporter.reportOn(
|
||||||
|
primaryConstructorParameter.returnTypeRef.source,
|
||||||
|
FirErrors.INLINE_CLASS_CANNOT_BE_RECURSIVE,
|
||||||
|
context
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun FirProperty.isRelatedToParameter(parameter: FirValueParameter?) =
|
||||||
|
name == parameter?.name && source?.kind is FirFakeSourceElementKind
|
||||||
|
|
||||||
|
private fun FirValueParameter.isNotFinalReadOnly(primaryConstructorProperty: FirProperty?): Boolean {
|
||||||
|
if (primaryConstructorProperty == null) return true
|
||||||
|
|
||||||
|
val modifierList = with(FirModifierList) { source.getModifierList() }
|
||||||
|
val isOpen = modifierList?.modifiers?.any { it.token == KtTokens.OPEN_KEYWORD } == true
|
||||||
|
|
||||||
|
return isVararg || !primaryConstructorProperty.isVal || isOpen
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun FirTypeRef.isInapplicableParameterType() =
|
||||||
|
isUnit || isNothing || coneType is ConeTypeParameterType || coneType.isGenericArrayOfTypeParameter()
|
||||||
|
|
||||||
|
private fun ConeKotlinType.isGenericArrayOfTypeParameter(): Boolean {
|
||||||
|
if (this.typeArguments.firstOrNull() is ConeStarProjection || !isPotentiallyArray())
|
||||||
|
return false
|
||||||
|
|
||||||
|
val arrayElementType = arrayElementType()?.type ?: return false
|
||||||
|
return arrayElementType is ConeTypeParameterType ||
|
||||||
|
arrayElementType.isGenericArrayOfTypeParameter()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun ConeKotlinType.isRecursiveInlineClassType(session: FirSession) =
|
||||||
|
isRecursiveInlineClassType(hashSetOf(), session)
|
||||||
|
|
||||||
|
private fun ConeKotlinType.isRecursiveInlineClassType(visited: HashSet<ConeKotlinType>, session: FirSession): Boolean {
|
||||||
|
if (!visited.add(this)) return true
|
||||||
|
|
||||||
|
val asRegularClass = this.toRegularClass(session) ?: return false
|
||||||
|
|
||||||
|
return asRegularClass.isInlineOrValueClass() &&
|
||||||
|
asRegularClass.primaryConstructor
|
||||||
|
?.takeIf { it.source?.kind is FirRealSourceElementKind }
|
||||||
|
?.valueParameters
|
||||||
|
?.firstOrNull()
|
||||||
|
?.returnTypeRef
|
||||||
|
?.coneType
|
||||||
|
?.isRecursiveInlineClassType(visited, session) == true
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun FirRegularClass.isSubtypeOfCloneable(context: CheckerContext): Boolean {
|
||||||
|
val coneType = this.defaultType()
|
||||||
|
val typeContext = context.session.typeContext
|
||||||
|
|
||||||
|
return AbstractTypeChecker.isSubtypeOf(typeContext, coneType, kotlinCloneableType) ||
|
||||||
|
AbstractTypeChecker.isSubtypeOf(typeContext, coneType, javaCloneableType)
|
||||||
|
}
|
||||||
|
}
|
||||||
+32
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.SYMB
|
|||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.TO_STRING
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.TO_STRING
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.VISIBILITY
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.VISIBILITY
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.WHEN_MISSING_CASES
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.WHEN_MISSING_CASES
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ABSENCE_OF_PRIMARY_CONSTRUCTOR_FOR_INLINE_CLASS
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ABSTRACT_DELEGATED_PROPERTY
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ABSTRACT_DELEGATED_PROPERTY
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ABSTRACT_FUNCTION_WITH_BODY
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ABSTRACT_FUNCTION_WITH_BODY
|
||||||
@@ -53,6 +54,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CONFLICTING_PROJE
|
|||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CONSTRUCTOR_IN_INTERFACE
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CONSTRUCTOR_IN_INTERFACE
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CONSTRUCTOR_IN_OBJECT
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CONSTRUCTOR_IN_OBJECT
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CYCLIC_CONSTRUCTOR_DELEGATION_CALL
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CYCLIC_CONSTRUCTOR_DELEGATION_CALL
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DELEGATED_PROPERTY_INSIDE_INLINE_CLASS
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DELEGATED_PROPERTY_IN_INTERFACE
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DELEGATED_PROPERTY_IN_INTERFACE
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DELEGATION_IN_INTERFACE
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DELEGATION_IN_INTERFACE
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DELEGATION_SUPER_CALL_IN_ENUM_CONSTRUCTOR
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DELEGATION_SUPER_CALL_IN_ENUM_CONSTRUCTOR
|
||||||
@@ -89,6 +91,15 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INAPPLICABLE_LATE
|
|||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INCOMPATIBLE_MODIFIERS
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INCOMPATIBLE_MODIFIERS
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INFERENCE_ERROR
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INFERENCE_ERROR
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INITIALIZER_REQUIRED_FOR_DESTRUCTURING_DECLARATION
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INITIALIZER_REQUIRED_FOR_DESTRUCTURING_DECLARATION
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INLINE_CLASS_CANNOT_BE_RECURSIVE
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INLINE_CLASS_CANNOT_EXTEND_CLASSES
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INLINE_CLASS_CANNOT_IMPLEMENT_INTERFACE_BY_DELEGATION
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INLINE_CLASS_CONSTRUCTOR_NOT_FINAL_READ_ONLY_PARAMETER
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INLINE_CLASS_CONSTRUCTOR_WRONG_PARAMETERS_SIZE
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INLINE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INLINE_CLASS_NOT_FINAL
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INLINE_CLASS_NOT_TOP_LEVEL
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INNER_CLASS_INSIDE_INLINE_CLASS
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INNER_CLASS_OF_GENERIC_THROWABLE_SUBCLASS
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INNER_CLASS_OF_GENERIC_THROWABLE_SUBCLASS
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INSTANCE_ACCESS_BEFORE_SUPER_CALL
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INSTANCE_ACCESS_BEFORE_SUPER_CALL
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INTERFACE_WITH_SUPERCLASS
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INTERFACE_WITH_SUPERCLASS
|
||||||
@@ -132,6 +143,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PROJECTION_ON_NON
|
|||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PROPERTY_INITIALIZER_IN_INTERFACE
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PROPERTY_INITIALIZER_IN_INTERFACE
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PROPERTY_INITIALIZER_NO_BACKING_FIELD
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PROPERTY_INITIALIZER_NO_BACKING_FIELD
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PROPERTY_TYPE_MISMATCH_ON_OVERRIDE
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PROPERTY_TYPE_MISMATCH_ON_OVERRIDE
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PROPERTY_WITH_BACKING_FIELD_INSIDE_INLINE_CLASS
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PROPERTY_WITH_NO_TYPE_NO_INITIALIZER
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PROPERTY_WITH_NO_TYPE_NO_INITIALIZER
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.QUALIFIED_SUPERTYPE_EXTENDED_BY_OTHER_SUPERTYPE
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.QUALIFIED_SUPERTYPE_EXTENDED_BY_OTHER_SUPERTYPE
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.RECURSION_IN_IMPLICIT_TYPES
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.RECURSION_IN_IMPLICIT_TYPES
|
||||||
@@ -148,11 +160,13 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_SINGLE_
|
|||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_VISIBILITY_MODIFIER
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_VISIBILITY_MODIFIER
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REIFIED_TYPE_IN_CATCH_CLAUSE
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REIFIED_TYPE_IN_CATCH_CLAUSE
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REPEATED_MODIFIER
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REPEATED_MODIFIER
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.RESERVED_MEMBER_INSIDE_INLINE_CLASS
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.RETURN_NOT_ALLOWED
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.RETURN_NOT_ALLOWED
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.RETURN_TYPE_MISMATCH_ON_OVERRIDE
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.RETURN_TYPE_MISMATCH_ON_OVERRIDE
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.SEALED_CLASS_CONSTRUCTOR_CALL
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.SEALED_CLASS_CONSTRUCTOR_CALL
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.SEALED_SUPERTYPE
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.SEALED_SUPERTYPE
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.SEALED_SUPERTYPE_IN_LOCAL_CLASS
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.SEALED_SUPERTYPE_IN_LOCAL_CLASS
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.SECONDARY_CONSTRUCTOR_WITH_BODY_INSIDE_INLINE_CLASS
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.SUPERCLASS_NOT_ACCESSIBLE_FROM_INTERFACE
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.SUPERCLASS_NOT_ACCESSIBLE_FROM_INTERFACE
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.SUPERTYPE_INITIALIZED_IN_INTERFACE
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.SUPERTYPE_INITIALIZED_IN_INTERFACE
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.SUPERTYPE_INITIALIZED_WITHOUT_PRIMARY_CONSTRUCTOR
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.SUPERTYPE_INITIALIZED_WITHOUT_PRIMARY_CONSTRUCTOR
|
||||||
@@ -178,6 +192,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UPPER_BOUND_VIOLA
|
|||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.USELESS_VARARG_ON_PARAMETER
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.USELESS_VARARG_ON_PARAMETER
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VAL_REASSIGNMENT
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VAL_REASSIGNMENT
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VAL_WITH_SETTER
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VAL_WITH_SETTER
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VALUE_CLASS_CANNOT_BE_CLONEABLE
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VARARG_OUTSIDE_PARENTHESES
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VARARG_OUTSIDE_PARENTHESES
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VARIABLE_EXPECTED
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VARIABLE_EXPECTED
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VARIABLE_INITIALIZER_IS_REDUNDANT
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VARIABLE_INITIALIZER_IS_REDUNDANT
|
||||||
@@ -369,6 +384,23 @@ class FirDefaultErrorMessages : DefaultErrorMessages.Extension {
|
|||||||
map.put(CLASS_LITERAL_LHS_NOT_A_CLASS, "Only classes are allowed on the left hand side of a class literal")
|
map.put(CLASS_LITERAL_LHS_NOT_A_CLASS, "Only classes are allowed on the left hand side of a class literal")
|
||||||
map.put(NULLABLE_TYPE_IN_CLASS_LITERAL_LHS, "Type in a class literal must not be nullable")
|
map.put(NULLABLE_TYPE_IN_CLASS_LITERAL_LHS, "Type in a class literal must not be nullable")
|
||||||
|
|
||||||
|
// Inline and value classes
|
||||||
|
map.put(INLINE_CLASS_NOT_TOP_LEVEL, "Inline classes cannot be local or inner")
|
||||||
|
map.put(INLINE_CLASS_NOT_FINAL, "Inline classes can be only final")
|
||||||
|
map.put(ABSENCE_OF_PRIMARY_CONSTRUCTOR_FOR_INLINE_CLASS, "Primary constructor is required for inline class")
|
||||||
|
map.put(INLINE_CLASS_CONSTRUCTOR_WRONG_PARAMETERS_SIZE, "Inline class must have exactly one primary constructor parameter")
|
||||||
|
map.put(INLINE_CLASS_CONSTRUCTOR_NOT_FINAL_READ_ONLY_PARAMETER, "Value class primary constructor must have only final read-only (val) property parameter")
|
||||||
|
map.put(PROPERTY_WITH_BACKING_FIELD_INSIDE_INLINE_CLASS, "Inline class cannot have properties with backing fields")
|
||||||
|
map.put(DELEGATED_PROPERTY_INSIDE_INLINE_CLASS, "Inline class cannot have delegated properties")
|
||||||
|
map.put(INLINE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE, "Inline class cannot have value parameter of type ''{0}''", TO_STRING)
|
||||||
|
map.put(INLINE_CLASS_CANNOT_IMPLEMENT_INTERFACE_BY_DELEGATION, "Inline class cannot implement an interface by delegation")
|
||||||
|
map.put(INLINE_CLASS_CANNOT_EXTEND_CLASSES, "Inline class cannot extend classes")
|
||||||
|
map.put(INLINE_CLASS_CANNOT_BE_RECURSIVE, "Inline class cannot be recursive")
|
||||||
|
map.put(RESERVED_MEMBER_INSIDE_INLINE_CLASS, "Member with the name ''{0}'' is reserved for future releases", TO_STRING)
|
||||||
|
map.put(SECONDARY_CONSTRUCTOR_WITH_BODY_INSIDE_INLINE_CLASS, "Secondary constructors with bodies are reserved for for future releases")
|
||||||
|
map.put(INNER_CLASS_INSIDE_INLINE_CLASS, "Inline class cannot have inner classes")
|
||||||
|
map.put(VALUE_CLASS_CANNOT_BE_CLONEABLE, "Value class cannot be Cloneable")
|
||||||
|
|
||||||
// Overrides
|
// Overrides
|
||||||
map.put(NOTHING_TO_OVERRIDE, "''{0}'' overrides nothing", DECLARATION_NAME)
|
map.put(NOTHING_TO_OVERRIDE, "''{0}'' overrides nothing", DECLARATION_NAME)
|
||||||
map.put(OVERRIDING_FINAL_MEMBER, "''{0}'' in ''{1}'' is final and cannot be overridden", NAME, TO_STRING)
|
map.put(OVERRIDING_FINAL_MEMBER, "''{0}'' in ''{1}'' is final and cannot be overridden", NAME, TO_STRING)
|
||||||
|
|||||||
+6
@@ -295,6 +295,12 @@ object LightTreePositioningStrategies {
|
|||||||
val CONST_MODIFIER: LightTreePositioningStrategy =
|
val CONST_MODIFIER: LightTreePositioningStrategy =
|
||||||
ModifierSetBasedLightTreePositioningStrategy(TokenSet.create(KtTokens.CONST_KEYWORD))
|
ModifierSetBasedLightTreePositioningStrategy(TokenSet.create(KtTokens.CONST_KEYWORD))
|
||||||
|
|
||||||
|
val INLINE_OR_VALUE_MODIFIER: LightTreePositioningStrategy =
|
||||||
|
ModifierSetBasedLightTreePositioningStrategy(TokenSet.create(KtTokens.INLINE_KEYWORD, KtTokens.VALUE_KEYWORD))
|
||||||
|
|
||||||
|
val INNER_MODIFIER: LightTreePositioningStrategy =
|
||||||
|
ModifierSetBasedLightTreePositioningStrategy(TokenSet.create(KtTokens.INNER_KEYWORD))
|
||||||
|
|
||||||
val OPERATOR: LightTreePositioningStrategy = object : LightTreePositioningStrategy() {
|
val OPERATOR: LightTreePositioningStrategy = object : LightTreePositioningStrategy() {
|
||||||
override fun mark(
|
override fun mark(
|
||||||
node: LighterASTNode,
|
node: LighterASTNode,
|
||||||
|
|||||||
+10
@@ -93,6 +93,16 @@ object SourceElementPositioningStrategies {
|
|||||||
PositioningStrategies.CONST_MODIFIER
|
PositioningStrategies.CONST_MODIFIER
|
||||||
)
|
)
|
||||||
|
|
||||||
|
val INLINE_OR_VALUE_MODIFIER = SourceElementPositioningStrategy(
|
||||||
|
LightTreePositioningStrategies.INLINE_OR_VALUE_MODIFIER,
|
||||||
|
PositioningStrategies.INLINE_OR_VALUE_MODIFIER
|
||||||
|
)
|
||||||
|
|
||||||
|
val INNER_MODIFIER = SourceElementPositioningStrategy(
|
||||||
|
LightTreePositioningStrategies.INNER_MODIFIER,
|
||||||
|
PositioningStrategies.INNER_MODIFIER
|
||||||
|
)
|
||||||
|
|
||||||
val OPERATOR = SourceElementPositioningStrategy(
|
val OPERATOR = SourceElementPositioningStrategy(
|
||||||
LightTreePositioningStrategies.OPERATOR,
|
LightTreePositioningStrategies.OPERATOR,
|
||||||
PositioningStrategies.OPERATOR
|
PositioningStrategies.OPERATOR
|
||||||
|
|||||||
+1
@@ -62,6 +62,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() {
|
|||||||
FirMemberFunctionsChecker,
|
FirMemberFunctionsChecker,
|
||||||
FirMemberPropertiesChecker,
|
FirMemberPropertiesChecker,
|
||||||
FirNestedClassChecker,
|
FirNestedClassChecker,
|
||||||
|
FirInlineClassDeclarationChecker,
|
||||||
)
|
)
|
||||||
|
|
||||||
override val constructorCheckers: Set<FirConstructorChecker> = setOf(
|
override val constructorCheckers: Set<FirConstructorChecker> = setOf(
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.KtNodeTypes
|
|||||||
import org.jetbrains.kotlin.cfg.UnreachableCode
|
import org.jetbrains.kotlin.cfg.UnreachableCode
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors.ACTUAL_WITHOUT_EXPECT
|
import org.jetbrains.kotlin.diagnostics.Errors.ACTUAL_WITHOUT_EXPECT
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors.NO_ACTUAL_FOR_EXPECT
|
import org.jetbrains.kotlin.diagnostics.Errors.NO_ACTUAL_FOR_EXPECT
|
||||||
|
import org.jetbrains.kotlin.diagnostics.PositioningStrategies.INNER_MODIFIER
|
||||||
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens.MODALITY_MODIFIERS
|
import org.jetbrains.kotlin.lexer.KtTokens.MODALITY_MODIFIERS
|
||||||
@@ -440,6 +441,14 @@ object PositioningStrategies {
|
|||||||
@JvmField
|
@JvmField
|
||||||
val MODALITY_MODIFIER: PositioningStrategy<KtModifierListOwner> = ModifierSetBasedPositioningStrategy(MODALITY_MODIFIERS)
|
val MODALITY_MODIFIER: PositioningStrategy<KtModifierListOwner> = ModifierSetBasedPositioningStrategy(MODALITY_MODIFIERS)
|
||||||
|
|
||||||
|
@JvmField
|
||||||
|
val INLINE_OR_VALUE_MODIFIER: PositioningStrategy<KtModifierListOwner> =
|
||||||
|
ModifierSetBasedPositioningStrategy(TokenSet.create(KtTokens.INLINE_KEYWORD, KtTokens.VALUE_KEYWORD))
|
||||||
|
|
||||||
|
@JvmField
|
||||||
|
val INNER_MODIFIER: PositioningStrategy<KtModifierListOwner> =
|
||||||
|
ModifierSetBasedPositioningStrategy(TokenSet.create(KtTokens.INNER_KEYWORD))
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val VARIANCE_IN_PROJECTION: PositioningStrategy<KtTypeProjection> = object : PositioningStrategy<KtTypeProjection>() {
|
val VARIANCE_IN_PROJECTION: PositioningStrategy<KtTypeProjection> = object : PositioningStrategy<KtTypeProjection>() {
|
||||||
override fun mark(element: KtTypeProjection): List<TextRange> {
|
override fun mark(element: KtTypeProjection): List<TextRange> {
|
||||||
|
|||||||
Vendored
+1
-1
@@ -7,4 +7,4 @@ inline annotation class InlineAnn
|
|||||||
inline object InlineObject
|
inline object InlineObject
|
||||||
inline enum class InlineEnum
|
inline enum class InlineEnum
|
||||||
|
|
||||||
inline class NotVal(x: Int)
|
inline class NotVal(<!INLINE_CLASS_CONSTRUCTOR_NOT_FINAL_READ_ONLY_PARAMETER!>x: Int<!>)
|
||||||
|
|||||||
+5
-5
@@ -20,9 +20,9 @@ object VarObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline class Z(val data: Int) {
|
inline class Z(val data: Int) {
|
||||||
val testVal by Val()
|
val testVal by <!DELEGATED_PROPERTY_INSIDE_INLINE_CLASS!>Val()<!>
|
||||||
var testVar by Var()
|
var testVar by <!DELEGATED_PROPERTY_INSIDE_INLINE_CLASS!>Var()<!>
|
||||||
|
|
||||||
val testValBySingleton by ValObject
|
val testValBySingleton by <!DELEGATED_PROPERTY_INSIDE_INLINE_CLASS!>ValObject<!>
|
||||||
var testVarBySingleton by VarObject
|
var testVarBySingleton by <!DELEGATED_PROPERTY_INSIDE_INLINE_CLASS!>VarObject<!>
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
-13
@@ -1,13 +0,0 @@
|
|||||||
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses
|
|
||||||
|
|
||||||
abstract class AbstractBaseClass
|
|
||||||
|
|
||||||
open class OpenBaseClass
|
|
||||||
|
|
||||||
interface BaseInterface
|
|
||||||
|
|
||||||
inline class TestExtendsAbstractClass(val x: Int) : AbstractBaseClass()
|
|
||||||
|
|
||||||
inline class TestExtendsOpenClass(val x: Int) : OpenBaseClass()
|
|
||||||
|
|
||||||
inline class TestImplementsInterface(val x: Int) : BaseInterface
|
|
||||||
+1
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses
|
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses
|
||||||
|
|
||||||
abstract class AbstractBaseClass
|
abstract class AbstractBaseClass
|
||||||
|
|||||||
+2
-2
@@ -4,6 +4,6 @@ interface IFoo
|
|||||||
|
|
||||||
object FooImpl : IFoo
|
object FooImpl : IFoo
|
||||||
|
|
||||||
inline class Test1(val x: Any) : IFoo by FooImpl
|
inline class Test1(val x: Any) : <!INLINE_CLASS_CANNOT_IMPLEMENT_INTERFACE_BY_DELEGATION!>IFoo<!> by FooImpl
|
||||||
|
|
||||||
inline class Test2(val x: IFoo) : IFoo by x
|
inline class Test2(val x: IFoo) : <!INLINE_CLASS_CANNOT_IMPLEMENT_INTERFACE_BY_DELEGATION!>IFoo<!> by x
|
||||||
|
|||||||
+18
-18
@@ -3,38 +3,38 @@
|
|||||||
|
|
||||||
inline class A0(val x: Int)
|
inline class A0(val x: Int)
|
||||||
|
|
||||||
inline class A1
|
<!ABSENCE_OF_PRIMARY_CONSTRUCTOR_FOR_INLINE_CLASS!>inline<!> class A1
|
||||||
inline class A2()
|
inline class A2<!INLINE_CLASS_CONSTRUCTOR_WRONG_PARAMETERS_SIZE!>()<!>
|
||||||
inline class A3(x: Int)
|
inline class A3(<!INLINE_CLASS_CONSTRUCTOR_NOT_FINAL_READ_ONLY_PARAMETER!>x: Int<!>)
|
||||||
inline class A4(var x: Int)
|
inline class A4(<!INLINE_CLASS_CONSTRUCTOR_NOT_FINAL_READ_ONLY_PARAMETER!>var x: Int<!>)
|
||||||
inline class A5(val x: Int, val y: Int)
|
inline class A5<!INLINE_CLASS_CONSTRUCTOR_WRONG_PARAMETERS_SIZE!>(val x: Int, val y: Int)<!>
|
||||||
inline class A6(x: Int, val y: Int)
|
inline class A6<!INLINE_CLASS_CONSTRUCTOR_WRONG_PARAMETERS_SIZE!>(x: Int, val y: Int)<!>
|
||||||
inline class A7(vararg val x: Int)
|
inline class A7(<!INLINE_CLASS_CONSTRUCTOR_NOT_FINAL_READ_ONLY_PARAMETER!>vararg val x: Int<!>)
|
||||||
inline class A8(<!NON_FINAL_MEMBER_IN_FINAL_CLASS!>open<!> val x: Int)
|
inline class A8(<!INLINE_CLASS_CONSTRUCTOR_NOT_FINAL_READ_ONLY_PARAMETER!><!NON_FINAL_MEMBER_IN_FINAL_CLASS!>open<!> val x: Int<!>)
|
||||||
inline class A9(final val x: Int)
|
inline class A9(final val x: Int)
|
||||||
|
|
||||||
class B1 {
|
class B1 {
|
||||||
companion object {
|
companion object {
|
||||||
inline class C1(val x: Int)
|
<!INLINE_CLASS_NOT_TOP_LEVEL!>inline<!> class C1(val x: Int)
|
||||||
inner inline class C11(val x: Int)
|
inner <!INLINE_CLASS_NOT_TOP_LEVEL!>inline<!> class C11(val x: Int)
|
||||||
}
|
}
|
||||||
|
|
||||||
inline class C2(val x: Int)
|
<!INLINE_CLASS_NOT_TOP_LEVEL!>inline<!> class C2(val x: Int)
|
||||||
inner inline class C21(val x: Int)
|
inner <!INLINE_CLASS_NOT_TOP_LEVEL!>inline<!> class C21(val x: Int)
|
||||||
}
|
}
|
||||||
|
|
||||||
object B2 {
|
object B2 {
|
||||||
inline class C3(val x: Int)
|
<!INLINE_CLASS_NOT_TOP_LEVEL!>inline<!> class C3(val x: Int)
|
||||||
inner inline class C31(val x: Int)
|
inner <!INLINE_CLASS_NOT_TOP_LEVEL!>inline<!> class C31(val x: Int)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun foo() {
|
fun foo() {
|
||||||
inline class C4(val x: Int)
|
<!INLINE_CLASS_NOT_TOP_LEVEL!>inline<!> class C4(val x: Int)
|
||||||
}
|
}
|
||||||
|
|
||||||
final inline class D0(val x: Int)
|
final inline class D0(val x: Int)
|
||||||
open inline class D1(val x: Int)
|
<!INLINE_CLASS_NOT_FINAL!>open<!> inline class D1(val x: Int)
|
||||||
abstract inline class D2(val x: Int)
|
<!INLINE_CLASS_NOT_FINAL!>abstract<!> inline class D2(val x: Int)
|
||||||
sealed inline class D3(val x: Int)
|
<!INLINE_CLASS_NOT_FINAL!>sealed<!> inline class D3(val x: Int)
|
||||||
|
|
||||||
<!INCOMPATIBLE_MODIFIERS!>inline<!> <!INCOMPATIBLE_MODIFIERS!>data<!> class D4(val x: String)
|
<!INCOMPATIBLE_MODIFIERS!>inline<!> <!INCOMPATIBLE_MODIFIERS!>data<!> class D4(val x: String)
|
||||||
|
|||||||
Vendored
-16
@@ -1,16 +0,0 @@
|
|||||||
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses
|
|
||||||
|
|
||||||
inline class Foo<T>(val x: T)
|
|
||||||
inline class FooNullable<T>(val x: T?)
|
|
||||||
|
|
||||||
inline class FooGenericArray<T>(val x: Array<T>)
|
|
||||||
inline class FooGenericArray2<T>(val x: Array<Array<T>>)
|
|
||||||
|
|
||||||
inline class FooStarProjectedArray(val x: Array<*>)
|
|
||||||
inline class FooStarProjectedArray2(val x: Array<Array<*>>)
|
|
||||||
|
|
||||||
inline class Bar(val u: Unit)
|
|
||||||
inline class BarNullable(val u: Unit?)
|
|
||||||
|
|
||||||
inline class Baz(val u: Nothing)
|
|
||||||
inline class BazNullable(val u: Nothing?)
|
|
||||||
Vendored
+1
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses
|
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses
|
||||||
|
|
||||||
inline class Foo<T>(val x: <!INLINE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T<!>)
|
inline class Foo<T>(val x: <!INLINE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T<!>)
|
||||||
|
|||||||
+3
-3
@@ -2,7 +2,7 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||||
|
|
||||||
inline class Foo(val x: Int) {
|
inline class Foo(val x: Int) {
|
||||||
inner class InnerC
|
<!INNER_CLASS_INSIDE_INLINE_CLASS!>inner<!> class InnerC
|
||||||
inner object InnerO
|
<!INNER_CLASS_INSIDE_INLINE_CLASS!>inner<!> object InnerO
|
||||||
inner interface InnerI
|
<!INNER_CLASS_INSIDE_INLINE_CLASS!>inner<!> interface InnerI
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-4
@@ -13,13 +13,13 @@ inline class Foo(val x: Int) : A, B {
|
|||||||
val a0
|
val a0
|
||||||
get() = 0
|
get() = 0
|
||||||
|
|
||||||
val a1 = 0
|
<!PROPERTY_WITH_BACKING_FIELD_INSIDE_INLINE_CLASS!>val a1<!> = 0
|
||||||
|
|
||||||
var a2: Int
|
var a2: Int
|
||||||
get() = 1
|
get() = 1
|
||||||
set(value) {}
|
set(value) {}
|
||||||
|
|
||||||
var a3: Int = 0
|
<!PROPERTY_WITH_BACKING_FIELD_INSIDE_INLINE_CLASS!>var a3: Int<!> = 0
|
||||||
get() = 1
|
get() = 1
|
||||||
set(value) {
|
set(value) {
|
||||||
field = value
|
field = value
|
||||||
@@ -28,7 +28,7 @@ inline class Foo(val x: Int) : A, B {
|
|||||||
override val goodSize: Int
|
override val goodSize: Int
|
||||||
get() = 0
|
get() = 0
|
||||||
|
|
||||||
override val badSize: Int = 0
|
<!PROPERTY_WITH_BACKING_FIELD_INSIDE_INLINE_CLASS!>override val badSize: Int<!> = 0
|
||||||
|
|
||||||
lateinit var lateinitProperty: String
|
<!PROPERTY_WITH_BACKING_FIELD_INSIDE_INLINE_CLASS!>lateinit var lateinitProperty: String<!>
|
||||||
}
|
}
|
||||||
|
|||||||
-21
@@ -1,21 +0,0 @@
|
|||||||
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses
|
|
||||||
|
|
||||||
inline class Test1(val x: Test1)
|
|
||||||
|
|
||||||
inline class Test2A(val x: Test2B)
|
|
||||||
inline class Test2B(val x: Test2A)
|
|
||||||
|
|
||||||
inline class Test3A(val x: Test3B)
|
|
||||||
inline class Test3B(val x: Test3C)
|
|
||||||
inline class Test3C(val x: Test3A)
|
|
||||||
|
|
||||||
inline class TestNullable(val x: TestNullable?)
|
|
||||||
|
|
||||||
inline class TestRecursionInTypeArguments(val x: List<TestRecursionInTypeArguments>)
|
|
||||||
|
|
||||||
inline class TestRecursionInArray(val x: Array<TestRecursionInArray>)
|
|
||||||
|
|
||||||
inline class TestRecursionInUpperBounds<T : TestRecursionInUpperBounds<T>>(val x: T)
|
|
||||||
|
|
||||||
inline class Id<T>(val x: T)
|
|
||||||
inline class TestRecursionThroughId(val x: Id<TestRecursionThroughId>)
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses
|
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses
|
||||||
|
|
||||||
inline class Test1(val x: <!INLINE_CLASS_CANNOT_BE_RECURSIVE!>Test1<!>)
|
inline class Test1(val x: <!INLINE_CLASS_CANNOT_BE_RECURSIVE!>Test1<!>)
|
||||||
|
|||||||
+19
-19
@@ -2,32 +2,32 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||||
|
|
||||||
inline class IC1(val x: Any) {
|
inline class IC1(val x: Any) {
|
||||||
fun box() {}
|
fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>box<!>() {}
|
||||||
fun box(x: Any) {}
|
fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>box<!>(x: Any) {}
|
||||||
|
|
||||||
fun unbox() {}
|
fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>unbox<!>() {}
|
||||||
fun unbox(x: Any) {}
|
fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>unbox<!>(x: Any) {}
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean = true
|
override fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>equals<!>(other: Any?): Boolean = true
|
||||||
override fun hashCode(): Int = 0
|
override fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>hashCode<!>(): Int = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
inline class IC2(val x: Any) {
|
inline class IC2(val x: Any) {
|
||||||
fun box(x: Any) {}
|
fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>box<!>(x: Any) {}
|
||||||
fun box(): Any = TODO()
|
fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>box<!>(): Any = TODO()
|
||||||
|
|
||||||
fun unbox(x: Any) {}
|
fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>unbox<!>(x: Any) {}
|
||||||
fun unbox(): Any = TODO()
|
fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>unbox<!>(): Any = TODO()
|
||||||
|
|
||||||
fun equals(my: Any, other: Any): Boolean = true
|
fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>equals<!>(my: Any, other: Any): Boolean = true
|
||||||
fun hashCode(a: Any): Int = 0
|
fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>hashCode<!>(a: Any): Int = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
inline class IC3(val x: Any) {
|
inline class IC3(val x: Any) {
|
||||||
fun box(x: Any): Any = TODO()
|
fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>box<!>(x: Any): Any = TODO()
|
||||||
fun unbox(x: Any): Any = TODO()
|
fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>unbox<!>(x: Any): Any = TODO()
|
||||||
|
|
||||||
fun equals(): Boolean = true
|
fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>equals<!>(): Boolean = true
|
||||||
}
|
}
|
||||||
|
|
||||||
interface WithBox {
|
interface WithBox {
|
||||||
@@ -35,11 +35,11 @@ interface WithBox {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline class IC4(val s: String) : WithBox {
|
inline class IC4(val s: String) : WithBox {
|
||||||
override fun box(): String = ""
|
override fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>box<!>(): String = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
inline class IC5(val a: String) {
|
inline class IC5(val a: String) {
|
||||||
constructor(i: Int) : this(i.toString()) {
|
constructor(i: Int) : this(i.toString()) <!SECONDARY_CONSTRUCTOR_WITH_BODY_INSIDE_INLINE_CLASS!>{
|
||||||
TODO("something")
|
TODO("something")
|
||||||
}
|
}<!>
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+2
-2
@@ -8,7 +8,7 @@ expect inline class Foo1(val x: Int) {
|
|||||||
|
|
||||||
expect inline class Foo2(val x: Int)
|
expect inline class Foo2(val x: Int)
|
||||||
|
|
||||||
expect inline class Foo3
|
expect <!ABSENCE_OF_PRIMARY_CONSTRUCTOR_FOR_INLINE_CLASS!>inline<!> class Foo3
|
||||||
|
|
||||||
expect class NonInlineExpect
|
expect class NonInlineExpect
|
||||||
|
|
||||||
@@ -21,7 +21,7 @@ actual inline class Foo1(val x: Int) {
|
|||||||
actual fun bar(): String = "Hello"
|
actual fun bar(): String = "Hello"
|
||||||
}
|
}
|
||||||
actual inline class Foo2(val x: String)
|
actual inline class Foo2(val x: String)
|
||||||
actual inline class Foo3
|
actual <!ABSENCE_OF_PRIMARY_CONSTRUCTOR_FOR_INLINE_CLASS!>inline<!> class Foo3
|
||||||
|
|
||||||
actual inline class NonInlineExpect(val x: Int)
|
actual inline class NonInlineExpect(val x: Int)
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -14,4 +14,4 @@ value object InlineObject
|
|||||||
value enum class InlineEnum
|
value enum class InlineEnum
|
||||||
|
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class NotVal(x: Int)
|
value class NotVal(<!INLINE_CLASS_CONSTRUCTOR_NOT_FINAL_READ_ONLY_PARAMETER!>x: Int<!>)
|
||||||
|
|||||||
+4
-4
@@ -26,9 +26,9 @@ object VarObject {
|
|||||||
|
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class Z(val data: Int) {
|
value class Z(val data: Int) {
|
||||||
val testVal by Val()
|
val testVal by <!DELEGATED_PROPERTY_INSIDE_INLINE_CLASS!>Val()<!>
|
||||||
var testVar by Var()
|
var testVar by <!DELEGATED_PROPERTY_INSIDE_INLINE_CLASS!>Var()<!>
|
||||||
|
|
||||||
val testValBySingleton by ValObject
|
val testValBySingleton by <!DELEGATED_PROPERTY_INSIDE_INLINE_CLASS!>ValObject<!>
|
||||||
var testVarBySingleton by VarObject
|
var testVarBySingleton by <!DELEGATED_PROPERTY_INSIDE_INLINE_CLASS!>VarObject<!>
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+4
-4
@@ -19,13 +19,13 @@ value class Foo(val x: Int) : A, B {
|
|||||||
val a0
|
val a0
|
||||||
get() = 0
|
get() = 0
|
||||||
|
|
||||||
val a1 = 0
|
<!PROPERTY_WITH_BACKING_FIELD_INSIDE_INLINE_CLASS!>val a1<!> = 0
|
||||||
|
|
||||||
var a2: Int
|
var a2: Int
|
||||||
get() = 1
|
get() = 1
|
||||||
set(value) {}
|
set(value) {}
|
||||||
|
|
||||||
var a3: Int = 0
|
<!PROPERTY_WITH_BACKING_FIELD_INSIDE_INLINE_CLASS!>var a3: Int<!> = 0
|
||||||
get() = 1
|
get() = 1
|
||||||
set(value) {
|
set(value) {
|
||||||
field = value
|
field = value
|
||||||
@@ -34,7 +34,7 @@ value class Foo(val x: Int) : A, B {
|
|||||||
override val goodSize: Int
|
override val goodSize: Int
|
||||||
get() = 0
|
get() = 0
|
||||||
|
|
||||||
override val badSize: Int = 0
|
<!PROPERTY_WITH_BACKING_FIELD_INSIDE_INLINE_CLASS!>override val badSize: Int<!> = 0
|
||||||
|
|
||||||
lateinit var lateinitProperty: String
|
<!PROPERTY_WITH_BACKING_FIELD_INSIDE_INLINE_CLASS!>lateinit var lateinitProperty: String<!>
|
||||||
}
|
}
|
||||||
|
|||||||
-38
@@ -1,38 +0,0 @@
|
|||||||
// !SKIP_JAVAC
|
|
||||||
// !LANGUAGE: +InlineClasses
|
|
||||||
|
|
||||||
package kotlin.jvm
|
|
||||||
|
|
||||||
annotation class JvmInline
|
|
||||||
|
|
||||||
@JvmInline
|
|
||||||
value class Test1(val x: Test1)
|
|
||||||
|
|
||||||
@JvmInline
|
|
||||||
value class Test2A(val x: Test2B)
|
|
||||||
@JvmInline
|
|
||||||
value class Test2B(val x: Test2A)
|
|
||||||
|
|
||||||
@JvmInline
|
|
||||||
value class Test3A(val x: Test3B)
|
|
||||||
@JvmInline
|
|
||||||
value class Test3B(val x: Test3C)
|
|
||||||
@JvmInline
|
|
||||||
value class Test3C(val x: Test3A)
|
|
||||||
|
|
||||||
@JvmInline
|
|
||||||
value class TestNullable(val x: TestNullable?)
|
|
||||||
|
|
||||||
@JvmInline
|
|
||||||
value class TestRecursionInTypeArguments(val x: List<TestRecursionInTypeArguments>)
|
|
||||||
|
|
||||||
@JvmInline
|
|
||||||
value class TestRecursionInArray(val x: Array<TestRecursionInArray>)
|
|
||||||
|
|
||||||
@JvmInline
|
|
||||||
value class TestRecursionInUpperBounds<T : TestRecursionInUpperBounds<T>>(val x: T)
|
|
||||||
|
|
||||||
@JvmInline
|
|
||||||
value class Id<T>(val x: T)
|
|
||||||
@JvmInline
|
|
||||||
value class TestRecursionThroughId(val x: Id<TestRecursionThroughId>)
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// !SKIP_JAVAC
|
// !SKIP_JAVAC
|
||||||
// !LANGUAGE: +InlineClasses
|
// !LANGUAGE: +InlineClasses
|
||||||
|
|
||||||
|
|||||||
compiler/testData/diagnostics/tests/valueClasses/reservedMembersAndConstructsInsideValueClass.fir.kt
Vendored
+18
-18
@@ -8,34 +8,34 @@ annotation class JvmInline
|
|||||||
|
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class IC1(val x: Any) {
|
value class IC1(val x: Any) {
|
||||||
fun box() {}
|
fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>box<!>() {}
|
||||||
fun box(x: Any) {}
|
fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>box<!>(x: Any) {}
|
||||||
|
|
||||||
fun unbox() {}
|
fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>unbox<!>() {}
|
||||||
fun unbox(x: Any) {}
|
fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>unbox<!>(x: Any) {}
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean = true
|
override fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>equals<!>(other: Any?): Boolean = true
|
||||||
override fun hashCode(): Int = 0
|
override fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>hashCode<!>(): Int = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class IC2(val x: Any) {
|
value class IC2(val x: Any) {
|
||||||
fun box(x: Any) {}
|
fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>box<!>(x: Any) {}
|
||||||
fun box(): Any = TODO()
|
fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>box<!>(): Any = TODO()
|
||||||
|
|
||||||
fun unbox(x: Any) {}
|
fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>unbox<!>(x: Any) {}
|
||||||
fun unbox(): Any = TODO()
|
fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>unbox<!>(): Any = TODO()
|
||||||
|
|
||||||
fun equals(my: Any, other: Any): Boolean = true
|
fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>equals<!>(my: Any, other: Any): Boolean = true
|
||||||
fun hashCode(a: Any): Int = 0
|
fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>hashCode<!>(a: Any): Int = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class IC3(val x: Any) {
|
value class IC3(val x: Any) {
|
||||||
fun box(x: Any): Any = TODO()
|
fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>box<!>(x: Any): Any = TODO()
|
||||||
fun unbox(x: Any): Any = TODO()
|
fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>unbox<!>(x: Any): Any = TODO()
|
||||||
|
|
||||||
fun equals(): Boolean = true
|
fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>equals<!>(): Boolean = true
|
||||||
}
|
}
|
||||||
|
|
||||||
interface WithBox {
|
interface WithBox {
|
||||||
@@ -44,12 +44,12 @@ interface WithBox {
|
|||||||
|
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class IC4(val s: String) : WithBox {
|
value class IC4(val s: String) : WithBox {
|
||||||
override fun box(): String = ""
|
override fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS!>box<!>(): String = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class IC5(val a: String) {
|
value class IC5(val a: String) {
|
||||||
constructor(i: Int) : this(i.toString()) {
|
constructor(i: Int) : this(i.toString()) <!SECONDARY_CONSTRUCTOR_WITH_BODY_INSIDE_INLINE_CLASS!>{
|
||||||
TODO("something")
|
TODO("something")
|
||||||
}
|
}<!>
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
-21
@@ -1,21 +0,0 @@
|
|||||||
// !SKIP_JAVAC
|
|
||||||
// !LANGUAGE: +InlineClasses
|
|
||||||
|
|
||||||
package kotlin.jvm
|
|
||||||
|
|
||||||
annotation class JvmInline
|
|
||||||
|
|
||||||
abstract class AbstractBaseClass
|
|
||||||
|
|
||||||
open class OpenBaseClass
|
|
||||||
|
|
||||||
interface BaseInterface
|
|
||||||
|
|
||||||
@JvmInline
|
|
||||||
value class TestExtendsAbstractClass(val x: Int) : AbstractBaseClass()
|
|
||||||
|
|
||||||
@JvmInline
|
|
||||||
value class TestExtendsOpenClass(val x: Int) : OpenBaseClass()
|
|
||||||
|
|
||||||
@JvmInline
|
|
||||||
value class TestImplementsInterface(val x: Int) : BaseInterface
|
|
||||||
+1
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// !SKIP_JAVAC
|
// !SKIP_JAVAC
|
||||||
// !LANGUAGE: +InlineClasses
|
// !LANGUAGE: +InlineClasses
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -10,7 +10,7 @@ interface IFoo
|
|||||||
object FooImpl : IFoo
|
object FooImpl : IFoo
|
||||||
|
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class Test1(val x: Any) : IFoo by FooImpl
|
value class Test1(val x: Any) : <!INLINE_CLASS_CANNOT_IMPLEMENT_INTERFACE_BY_DELEGATION!>IFoo<!> by FooImpl
|
||||||
|
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class Test2(val x: IFoo) : IFoo by x
|
value class Test2(val x: IFoo) : <!INLINE_CLASS_CANNOT_IMPLEMENT_INTERFACE_BY_DELEGATION!>IFoo<!> by x
|
||||||
|
|||||||
+14
-14
@@ -10,43 +10,43 @@ annotation class JvmInline
|
|||||||
value class A0(val x: Int)
|
value class A0(val x: Int)
|
||||||
|
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class A1
|
<!ABSENCE_OF_PRIMARY_CONSTRUCTOR_FOR_INLINE_CLASS!>value<!> class A1
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class A2()
|
value class A2<!INLINE_CLASS_CONSTRUCTOR_WRONG_PARAMETERS_SIZE!>()<!>
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class A3(x: Int)
|
value class A3(<!INLINE_CLASS_CONSTRUCTOR_NOT_FINAL_READ_ONLY_PARAMETER!>x: Int<!>)
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class A4(var x: Int)
|
value class A4(<!INLINE_CLASS_CONSTRUCTOR_NOT_FINAL_READ_ONLY_PARAMETER!>var x: Int<!>)
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class A5(val x: Int, val y: Int)
|
value class A5<!INLINE_CLASS_CONSTRUCTOR_WRONG_PARAMETERS_SIZE!>(val x: Int, val y: Int)<!>
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class A6(x: Int, val y: Int)
|
value class A6<!INLINE_CLASS_CONSTRUCTOR_WRONG_PARAMETERS_SIZE!>(x: Int, val y: Int)<!>
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class A7(vararg val x: Int)
|
value class A7(<!INLINE_CLASS_CONSTRUCTOR_NOT_FINAL_READ_ONLY_PARAMETER!>vararg val x: Int<!>)
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class A8(<!NON_FINAL_MEMBER_IN_FINAL_CLASS!>open<!> val x: Int)
|
value class A8(<!INLINE_CLASS_CONSTRUCTOR_NOT_FINAL_READ_ONLY_PARAMETER!><!NON_FINAL_MEMBER_IN_FINAL_CLASS!>open<!> val x: Int<!>)
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class A9(final val x: Int)
|
value class A9(final val x: Int)
|
||||||
|
|
||||||
class B1 {
|
class B1 {
|
||||||
companion object {
|
companion object {
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class C1(val x: Int)
|
<!INLINE_CLASS_NOT_TOP_LEVEL!>value<!> class C1(val x: Int)
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class C2(val x: Int)
|
<!INLINE_CLASS_NOT_TOP_LEVEL!>value<!> class C2(val x: Int)
|
||||||
}
|
}
|
||||||
|
|
||||||
object B2 {
|
object B2 {
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class C3(val x: Int)
|
<!INLINE_CLASS_NOT_TOP_LEVEL!>value<!> class C3(val x: Int)
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmInline
|
@JvmInline
|
||||||
final value class D0(val x: Int)
|
final value class D0(val x: Int)
|
||||||
open value class D1(val x: Int)
|
<!INLINE_CLASS_NOT_FINAL!>open<!> value class D1(val x: Int)
|
||||||
abstract value class D2(val x: Int)
|
<!INLINE_CLASS_NOT_FINAL!>abstract<!> value class D2(val x: Int)
|
||||||
sealed value class D3(val x: Int)
|
<!INLINE_CLASS_NOT_FINAL!>sealed<!> value class D3(val x: Int)
|
||||||
|
|
||||||
value data class D4(val x: String)
|
value data class D4(val x: String)
|
||||||
|
|||||||
Vendored
-31
@@ -1,31 +0,0 @@
|
|||||||
// !SKIP_JAVAC
|
|
||||||
// !LANGUAGE: +InlineClasses
|
|
||||||
|
|
||||||
package kotlin.jvm
|
|
||||||
|
|
||||||
annotation class JvmInline
|
|
||||||
|
|
||||||
@JvmInline
|
|
||||||
value class Foo<T>(val x: T)
|
|
||||||
@JvmInline
|
|
||||||
value class FooNullable<T>(val x: T?)
|
|
||||||
|
|
||||||
@JvmInline
|
|
||||||
value class FooGenericArray<T>(val x: Array<T>)
|
|
||||||
@JvmInline
|
|
||||||
value class FooGenericArray2<T>(val x: Array<Array<T>>)
|
|
||||||
|
|
||||||
@JvmInline
|
|
||||||
value class FooStarProjectedArray(val x: Array<*>)
|
|
||||||
@JvmInline
|
|
||||||
value class FooStarProjectedArray2(val x: Array<Array<*>>)
|
|
||||||
|
|
||||||
@JvmInline
|
|
||||||
value class Bar(val u: Unit)
|
|
||||||
@JvmInline
|
|
||||||
value class BarNullable(val u: Unit?)
|
|
||||||
|
|
||||||
@JvmInline
|
|
||||||
value class Baz(val u: Nothing)
|
|
||||||
@JvmInline
|
|
||||||
value class BazNullable(val u: Nothing?)
|
|
||||||
+1
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// !SKIP_JAVAC
|
// !SKIP_JAVAC
|
||||||
// !LANGUAGE: +InlineClasses
|
// !LANGUAGE: +InlineClasses
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user