diff --git a/compiler/testData/diagnostics/tests/delegatedProperty/createDelegateOperatorDeclaration.kt b/compiler/testData/diagnostics/tests/delegatedProperty/createDelegateOperatorDeclaration.kt new file mode 100644 index 00000000000..fbf856c7a94 --- /dev/null +++ b/compiler/testData/diagnostics/tests/delegatedProperty/createDelegateOperatorDeclaration.kt @@ -0,0 +1,32 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER + +import kotlin.reflect.KProperty + +operator fun createDelegate(x: Any?, p: KProperty<*>) {} + +operator fun Any.createDelegate(x: Any?, p: KProperty<*>) {} + +operator fun Any.createDelegate(x: Any?, p: Any) {} + +operator fun Any.createDelegate(x: Any?, p: Int) {} + +class Host1 { + operator fun createDelegate(x: Any?, p: KProperty<*>) {} +} + +class Host2 { + operator fun Any.createDelegate(x: Any?, p: KProperty<*>) {} +} + +class Host3 { + operator fun createDelegate(x: Any?, p: KProperty<*>, foo: Int) {} +} + +class Host4 { + operator fun createDelegate(x: Any?, p: KProperty<*>, foo: Int = 0) {} +} + +class Host5 { + operator fun createDelegate(x: Any?, p: KProperty<*>, vararg foo: Int) {} +} + diff --git a/compiler/testData/diagnostics/tests/delegatedProperty/createDelegateOperatorDeclaration.txt b/compiler/testData/diagnostics/tests/delegatedProperty/createDelegateOperatorDeclaration.txt new file mode 100644 index 00000000000..b4485233d01 --- /dev/null +++ b/compiler/testData/diagnostics/tests/delegatedProperty/createDelegateOperatorDeclaration.txt @@ -0,0 +1,46 @@ +package + +public operator fun createDelegate(/*0*/ x: kotlin.Any?, /*1*/ p: kotlin.reflect.KProperty<*>): kotlin.Unit +public operator fun kotlin.Any.createDelegate(/*0*/ x: kotlin.Any?, /*1*/ p: kotlin.Any): kotlin.Unit +public operator fun kotlin.Any.createDelegate(/*0*/ x: kotlin.Any?, /*1*/ p: kotlin.Int): kotlin.Unit +public operator fun kotlin.Any.createDelegate(/*0*/ x: kotlin.Any?, /*1*/ p: kotlin.reflect.KProperty<*>): kotlin.Unit + +public final class Host1 { + public constructor Host1() + public final operator fun createDelegate(/*0*/ x: kotlin.Any?, /*1*/ p: kotlin.reflect.KProperty<*>): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Host2 { + public constructor Host2() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + public final operator fun kotlin.Any.createDelegate(/*0*/ x: kotlin.Any?, /*1*/ p: kotlin.reflect.KProperty<*>): kotlin.Unit +} + +public final class Host3 { + public constructor Host3() + public final operator fun createDelegate(/*0*/ x: kotlin.Any?, /*1*/ p: kotlin.reflect.KProperty<*>, /*2*/ foo: kotlin.Int): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Host4 { + public constructor Host4() + public final operator fun createDelegate(/*0*/ x: kotlin.Any?, /*1*/ p: kotlin.reflect.KProperty<*>, /*2*/ foo: kotlin.Int = ...): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Host5 { + public constructor Host5() + public final operator fun createDelegate(/*0*/ x: kotlin.Any?, /*1*/ p: kotlin.reflect.KProperty<*>, /*2*/ vararg foo: kotlin.Int /*kotlin.IntArray*/): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index be65fde6edc..4ba5ac7d595 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -5524,6 +5524,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("createDelegateOperatorDeclaration.kt") + public void testCreateDelegateOperatorDeclaration() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/delegatedProperty/createDelegateOperatorDeclaration.kt"); + doTest(fileName); + } + @TestMetadata("defaultGetter.kt") public void testDefaultGetter() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/delegatedProperty/defaultGetter.kt"); diff --git a/core/descriptors/src/org/jetbrains/kotlin/util/OperatorNameConventions.kt b/core/descriptors/src/org/jetbrains/kotlin/util/OperatorNameConventions.kt index 39b8347c653..5da4771ba98 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/util/OperatorNameConventions.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/util/OperatorNameConventions.kt @@ -21,6 +21,8 @@ import org.jetbrains.kotlin.name.Name object OperatorNameConventions { @JvmField val GET_VALUE = Name.identifier("getValue") @JvmField val SET_VALUE = Name.identifier("setValue") + @JvmField val PROPERTY_DELEGATED = Name.identifier("propertyDelegated") + @JvmField val CREATE_DELEGATE = Name.identifier("createDelegate") @JvmField val EQUALS = Name.identifier("equals") @JvmField val COMPARE_TO = Name.identifier("compareTo") @@ -62,9 +64,6 @@ object OperatorNameConventions { @JvmField val COROUTINE_HANDLE_EXCEPTION = Name.identifier("handleException") @JvmField val COROUTINE_INTERCEPT_RESUME = Name.identifier("interceptResume") - - @JvmField val PROPERTY_DELEGATED = Name.identifier("propertyDelegated") - // If you add new unary, binary or assignment operators, add it to OperatorConventions as well @JvmField diff --git a/core/descriptors/src/org/jetbrains/kotlin/util/modifierChecks.kt b/core/descriptors/src/org/jetbrains/kotlin/util/modifierChecks.kt index d3c22ae6178..4699921d996 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/util/modifierChecks.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/util/modifierChecks.kt @@ -37,6 +37,7 @@ import org.jetbrains.kotlin.util.OperatorNameConventions.CONTAINS import org.jetbrains.kotlin.util.OperatorNameConventions.COROUTINE_HANDLE_EXCEPTION import org.jetbrains.kotlin.util.OperatorNameConventions.COROUTINE_HANDLE_RESULT import org.jetbrains.kotlin.util.OperatorNameConventions.COROUTINE_INTERCEPT_RESUME +import org.jetbrains.kotlin.util.OperatorNameConventions.CREATE_DELEGATE import org.jetbrains.kotlin.util.OperatorNameConventions.DEC import org.jetbrains.kotlin.util.OperatorNameConventions.EQUALS import org.jetbrains.kotlin.util.OperatorNameConventions.GET @@ -185,6 +186,7 @@ object OperatorChecks : AbstractModifierChecks() { }, Checks(GET_VALUE, MemberOrExtension, NoDefaultAndVarargsCheck, ValueParameterCountCheck.AtLeast(2), IsKPropertyCheck), Checks(SET_VALUE, MemberOrExtension, NoDefaultAndVarargsCheck, ValueParameterCountCheck.AtLeast(3), IsKPropertyCheck), + Checks(CREATE_DELEGATE, MemberOrExtension, NoDefaultAndVarargsCheck, ValueParameterCountCheck.Equals(2), IsKPropertyCheck), Checks(INVOKE, MemberOrExtension), Checks(CONTAINS, MemberOrExtension, SingleValueParameter, NoDefaultAndVarargsCheck, ReturnsBoolean), Checks(ITERATOR, MemberOrExtension, NoValueParameters),