From 7df92cd00bdcc43baa804bf63de814ddcf368f9d Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Wed, 5 Feb 2020 16:01:59 +0300 Subject: [PATCH] Set `isOperator` property for dynamic calls by convention --- .../resolve/calls/tasks/dynamicCalls.kt | 2 + .../dynamicTypes/comparisonToNull.dynamic.txt | 4 +- .../dynamicTypes/conventions.dynamic.txt | 94 +++++++++---------- .../dynamicTypes/destructuring.dynamic.txt | 18 ++-- .../dynamicTypes/inExpression.dynamic.txt | 8 +- .../dynamicTypes/indexedAccess.dynamic.txt | 8 +- .../dynamicTypes/rangeExpression.dynamic.txt | 2 +- .../staticCallsInDynamicContext.dynamic.txt | 6 +- .../inlineExtensionToNative.dynamic.txt | 4 +- ...nsafeCastFunctionOnDynamicType.dynamic.txt | 1 + .../unsafeCastFunctionOnDynamicType.kt | 11 +++ .../unsafeCastFunctionOnDynamicType.txt | 4 + .../DiagnosticsTestWithJsStdLibGenerated.java | 5 + 13 files changed, 95 insertions(+), 72 deletions(-) create mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/unsafeCastFunctionOnDynamicType.dynamic.txt create mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/unsafeCastFunctionOnDynamicType.kt create mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/unsafeCastFunctionOnDynamicType.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/dynamicCalls.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/dynamicCalls.kt index cf90e00a92d..c6130d7c1f0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/dynamicCalls.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/dynamicCalls.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.DescriptorFactory +import org.jetbrains.kotlin.resolve.calls.callResolverUtil.isConventionCall import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.resolve.scopes.MemberScopeImpl import org.jetbrains.kotlin.resolve.scopes.receivers.TransientReceiver @@ -134,6 +135,7 @@ class DynamicCallableDescriptors(private val storageManager: StorageManager, bui Visibilities.PUBLIC ) functionDescriptor.setHasSynthesizedParameterNames(true) + functionDescriptor.isOperator = isConventionCall(call) return functionDescriptor } diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/comparisonToNull.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/comparisonToNull.dynamic.txt index e8cfa6325fc..b2300d4ef07 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/comparisonToNull.dynamic.txt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/comparisonToNull.dynamic.txt @@ -1,5 +1,5 @@ -public final fun get(/*0*/ p0: dynamic): dynamic -public final fun get(/*0*/ p0: dynamic): dynamic +public final operator fun get(/*0*/ p0: dynamic): dynamic +public final operator fun get(/*0*/ p0: dynamic): dynamic public final var foo: dynamic public final fun (): dynamic public final fun (/*0*/ : dynamic): kotlin.Unit diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/conventions.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/conventions.dynamic.txt index f37ded8b856..704031f03d4 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/conventions.dynamic.txt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/conventions.dynamic.txt @@ -1,54 +1,54 @@ -public final fun unaryPlus(): dynamic -public final fun unaryMinus(): dynamic -public final fun not(): dynamic -public final fun plus(/*0*/ p0: dynamic): dynamic -public final fun plus(/*0*/ p0: dynamic): dynamic -public final fun minus(/*0*/ p0: dynamic): dynamic -public final fun times(/*0*/ p0: dynamic): dynamic -public final fun div(/*0*/ p0: dynamic): dynamic -public final fun rem(/*0*/ p0: dynamic): dynamic +public final operator fun unaryPlus(): dynamic +public final operator fun unaryMinus(): dynamic +public final operator fun not(): dynamic +public final operator fun plus(/*0*/ p0: dynamic): dynamic +public final operator fun plus(/*0*/ p0: dynamic): dynamic +public final operator fun minus(/*0*/ p0: dynamic): dynamic +public final operator fun times(/*0*/ p0: dynamic): dynamic +public final operator fun div(/*0*/ p0: dynamic): dynamic +public final operator fun rem(/*0*/ p0: dynamic): dynamic public final fun and(/*0*/ p0: dynamic): dynamic -public final fun get(/*0*/ p0: dynamic): dynamic -public final fun set(/*0*/ p0: dynamic, /*1*/ p1: dynamic): dynamic -public final fun get(/*0*/ p0: dynamic): dynamic -public final fun inc(): dynamic -public final fun inc(): dynamic -public final fun get(/*0*/ p0: dynamic): dynamic -public final fun get(/*0*/ p0: dynamic): dynamic -public final fun dec(): dynamic -public final fun dec(): dynamic -public final fun get(/*0*/ p0: dynamic): dynamic +public final operator fun get(/*0*/ p0: dynamic): dynamic +public final operator fun set(/*0*/ p0: dynamic, /*1*/ p1: dynamic): dynamic +public final operator fun get(/*0*/ p0: dynamic): dynamic +public final operator fun inc(): dynamic +public final operator fun inc(): dynamic +public final operator fun get(/*0*/ p0: dynamic): dynamic +public final operator fun get(/*0*/ p0: dynamic): dynamic +public final operator fun dec(): dynamic +public final operator fun dec(): dynamic +public final operator fun get(/*0*/ p0: dynamic): dynamic public final fun invoke(): dynamic public final fun invoke(/*0*/ p0: dynamic): dynamic public final fun invoke(/*0*/ name: dynamic): dynamic public final fun invoke(/*0*/ p0: () -> dynamic): dynamic public final fun invoke(/*0*/ p0: dynamic): dynamic -public final fun compareTo(/*0*/ p0: dynamic): dynamic -public final fun compareTo(/*0*/ p0: dynamic): dynamic -public final fun compareTo(/*0*/ p0: dynamic): dynamic -public final fun compareTo(/*0*/ p0: dynamic): dynamic +public final operator fun compareTo(/*0*/ p0: dynamic): dynamic +public final operator fun compareTo(/*0*/ p0: dynamic): dynamic +public final operator fun compareTo(/*0*/ p0: dynamic): dynamic +public final operator fun compareTo(/*0*/ p0: dynamic): dynamic public final fun foo(): dynamic -public final fun inc(): dynamic -public final fun inc(): dynamic -public final fun dec(): dynamic -public final fun dec(): dynamic -public final fun plusAssign(/*0*/ p0: dynamic): dynamic -public final fun minusAssign(/*0*/ p0: dynamic): dynamic -public final fun timesAssign(/*0*/ p0: dynamic): dynamic -public final fun divAssign(/*0*/ p0: dynamic): dynamic -public final fun remAssign(/*0*/ p0: dynamic): dynamic -public final fun plusAssign(/*0*/ p0: dynamic): dynamic -public final fun minusAssign(/*0*/ p0: dynamic): dynamic -public final fun timesAssign(/*0*/ p0: dynamic): dynamic -public final fun divAssign(/*0*/ p0: dynamic): dynamic -public final fun remAssign(/*0*/ p0: dynamic): dynamic -public final fun get(/*0*/ p0: dynamic): dynamic -public final fun plusAssign(/*0*/ p0: dynamic): dynamic -public final fun get(/*0*/ p0: dynamic): dynamic -public final fun minusAssign(/*0*/ p0: dynamic): dynamic -public final fun get(/*0*/ p0: dynamic): dynamic -public final fun timesAssign(/*0*/ p0: dynamic): dynamic -public final fun get(/*0*/ p0: dynamic): dynamic -public final fun divAssign(/*0*/ p0: dynamic): dynamic -public final fun get(/*0*/ p0: dynamic): dynamic -public final fun remAssign(/*0*/ p0: dynamic): dynamic +public final operator fun inc(): dynamic +public final operator fun inc(): dynamic +public final operator fun dec(): dynamic +public final operator fun dec(): dynamic +public final operator fun plusAssign(/*0*/ p0: dynamic): dynamic +public final operator fun minusAssign(/*0*/ p0: dynamic): dynamic +public final operator fun timesAssign(/*0*/ p0: dynamic): dynamic +public final operator fun divAssign(/*0*/ p0: dynamic): dynamic +public final operator fun remAssign(/*0*/ p0: dynamic): dynamic +public final operator fun plusAssign(/*0*/ p0: dynamic): dynamic +public final operator fun minusAssign(/*0*/ p0: dynamic): dynamic +public final operator fun timesAssign(/*0*/ p0: dynamic): dynamic +public final operator fun divAssign(/*0*/ p0: dynamic): dynamic +public final operator fun remAssign(/*0*/ p0: dynamic): dynamic +public final operator fun get(/*0*/ p0: dynamic): dynamic +public final operator fun plusAssign(/*0*/ p0: dynamic): dynamic +public final operator fun get(/*0*/ p0: dynamic): dynamic +public final operator fun minusAssign(/*0*/ p0: dynamic): dynamic +public final operator fun get(/*0*/ p0: dynamic): dynamic +public final operator fun timesAssign(/*0*/ p0: dynamic): dynamic +public final operator fun get(/*0*/ p0: dynamic): dynamic +public final operator fun divAssign(/*0*/ p0: dynamic): dynamic +public final operator fun get(/*0*/ p0: dynamic): dynamic +public final operator fun remAssign(/*0*/ p0: dynamic): dynamic diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/destructuring.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/destructuring.dynamic.txt index 08fd47150b7..8dcbabca587 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/destructuring.dynamic.txt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/destructuring.dynamic.txt @@ -1,9 +1,9 @@ -public final fun component1(): dynamic -public final fun component2(): dynamic -public final fun plus(/*0*/ p0: dynamic): dynamic -public final fun component1(): dynamic -public final fun component2(): dynamic -public final fun plus(/*0*/ p0: dynamic): dynamic -public final fun component1(): dynamic -public final fun component2(): dynamic -public final fun plus(/*0*/ p0: dynamic): dynamic +public final operator fun component1(): dynamic +public final operator fun component2(): dynamic +public final operator fun plus(/*0*/ p0: dynamic): dynamic +public final operator fun component1(): dynamic +public final operator fun component2(): dynamic +public final operator fun plus(/*0*/ p0: dynamic): dynamic +public final operator fun component1(): dynamic +public final operator fun component2(): dynamic +public final operator fun plus(/*0*/ p0: dynamic): dynamic diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/inExpression.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/inExpression.dynamic.txt index c6cfd9456e6..512f570b2d4 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/inExpression.dynamic.txt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/inExpression.dynamic.txt @@ -1,4 +1,4 @@ -public final fun contains(/*0*/ p0: dynamic): dynamic -public final fun contains(/*0*/ p0: dynamic): dynamic -public final fun contains(/*0*/ p0: dynamic): dynamic -public final fun contains(/*0*/ p0: dynamic): dynamic +public final operator fun contains(/*0*/ p0: dynamic): dynamic +public final operator fun contains(/*0*/ p0: dynamic): dynamic +public final operator fun contains(/*0*/ p0: dynamic): dynamic +public final operator fun contains(/*0*/ p0: dynamic): dynamic diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/indexedAccess.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/indexedAccess.dynamic.txt index 0ab2de1ce5e..21068f317ec 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/indexedAccess.dynamic.txt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/indexedAccess.dynamic.txt @@ -1,4 +1,4 @@ -public final fun get(/*0*/ p0: dynamic): dynamic -public final fun get(/*0*/ p0: dynamic, /*1*/ p1: dynamic): dynamic -public final fun set(/*0*/ p0: dynamic, /*1*/ p1: dynamic): dynamic -public final fun set(/*0*/ p0: dynamic, /*1*/ p1: dynamic, /*2*/ p2: dynamic): dynamic +public final operator fun get(/*0*/ p0: dynamic): dynamic +public final operator fun get(/*0*/ p0: dynamic, /*1*/ p1: dynamic): dynamic +public final operator fun set(/*0*/ p0: dynamic, /*1*/ p1: dynamic): dynamic +public final operator fun set(/*0*/ p0: dynamic, /*1*/ p1: dynamic, /*2*/ p2: dynamic): dynamic diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/rangeExpression.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/rangeExpression.dynamic.txt index 37eada3ccc3..eb6106ec5b2 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/rangeExpression.dynamic.txt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/rangeExpression.dynamic.txt @@ -1,2 +1,2 @@ -public final fun rangeTo(/*0*/ p0: dynamic): dynamic +public final operator fun rangeTo(/*0*/ p0: dynamic): dynamic public final fun rangeTo(/*0*/ p0: dynamic): dynamic diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/staticCallsInDynamicContext.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/staticCallsInDynamicContext.dynamic.txt index de78a5e6c74..df7401417fd 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/staticCallsInDynamicContext.dynamic.txt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/staticCallsInDynamicContext.dynamic.txt @@ -10,7 +10,7 @@ public final var extVal: dynamic public final fun (): dynamic public final fun (/*0*/ : dynamic): kotlin.Unit public final fun extExtVal(): dynamic -public final fun invoke(): dynamic -public final fun plus(/*0*/ p0: dynamic): dynamic -public final fun invoke(): dynamic +public final operator fun invoke(): dynamic +public final operator fun plus(/*0*/ p0: dynamic): dynamic +public final operator fun invoke(): dynamic public final fun foo(): dynamic diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/native/inlineExtensionToNative.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/native/inlineExtensionToNative.dynamic.txt index 5ebbf59c470..64ddb5e1384 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/native/inlineExtensionToNative.dynamic.txt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/native/inlineExtensionToNative.dynamic.txt @@ -1,3 +1,3 @@ public final fun foo(/*0*/ p0: dynamic): dynamic -public final fun get(/*0*/ p0: dynamic): dynamic -public final fun get(/*0*/ p0: dynamic): dynamic +public final operator fun get(/*0*/ p0: dynamic): dynamic +public final operator fun get(/*0*/ p0: dynamic): dynamic diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/unsafeCastFunctionOnDynamicType.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/unsafeCastFunctionOnDynamicType.dynamic.txt new file mode 100644 index 00000000000..747cb5b29b9 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/unsafeCastFunctionOnDynamicType.dynamic.txt @@ -0,0 +1 @@ +public final operator fun unaryPlus(): dynamic diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/unsafeCastFunctionOnDynamicType.kt b/compiler/testData/diagnostics/testsWithJsStdLib/unsafeCastFunctionOnDynamicType.kt new file mode 100644 index 00000000000..5696a6753fc --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/unsafeCastFunctionOnDynamicType.kt @@ -0,0 +1,11 @@ +// !LANGUAGE: +NewInference + +fun String.toDouble(): Double = (+(this.asDynamic())).unsafeCast().also { + if (it.isNaN() && !this.isNaN() || it == 0.0 && this.isBlank()) + TODO() +} + +fun String.isNaN(): Boolean = when (this.toLowerCase()) { + "nan", "+nan", "-nan" -> true + else -> false +} diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/unsafeCastFunctionOnDynamicType.txt b/compiler/testData/diagnostics/testsWithJsStdLib/unsafeCastFunctionOnDynamicType.txt new file mode 100644 index 00000000000..22221375e75 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/unsafeCastFunctionOnDynamicType.txt @@ -0,0 +1,4 @@ +package + +public fun kotlin.String.isNaN(): kotlin.Boolean +public fun kotlin.String.toDouble(): kotlin.Double diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java index 671243ab122..f601633ba16 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java @@ -53,6 +53,11 @@ public class DiagnosticsTestWithJsStdLibGenerated extends AbstractDiagnosticsTes runTest("compiler/testData/diagnostics/testsWithJsStdLib/runtimeAnnotations.kt"); } + @TestMetadata("unsafeCastFunctionOnDynamicType.kt") + public void testUnsafeCastFunctionOnDynamicType() throws Exception { + runTest("compiler/testData/diagnostics/testsWithJsStdLib/unsafeCastFunctionOnDynamicType.kt"); + } + @TestMetadata("wrongMultipleInheritance.kt") public void testWrongMultipleInheritance() throws Exception { runTest("compiler/testData/diagnostics/testsWithJsStdLib/wrongMultipleInheritance.kt");