K1: Adjust positioning for NO_CONTEXT_RECEIVER

This commit is contained in:
Denis.Zharkov
2022-04-06 09:59:47 +03:00
committed by teamcity
parent 82b6fdf97e
commit 3d06a92eea
12 changed files with 26 additions and 114 deletions
@@ -35,10 +35,10 @@ import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluat
import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor
import org.jetbrains.kotlin.types.error.ErrorUtils
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeUtils
import org.jetbrains.kotlin.types.checker.intersectWrappedTypes
import org.jetbrains.kotlin.types.error.ErrorUtils
import org.jetbrains.kotlin.types.expressions.ControlStructureTypingUtils
import org.jetbrains.kotlin.types.model.TypeSystemInferenceExtensionContextDelegate
import org.jetbrains.kotlin.types.model.TypeVariableMarker
@@ -119,7 +119,7 @@ class DiagnosticReporterByTrackingStrategy(
val callElement = psiKotlinCall.psiCall.callElement
trace.report(
NO_CONTEXT_RECEIVER.on(
callElement,
callElement.getCalleeExpressionIfAny() ?: callElement,
(diagnostic as NoContextReceiver).receiverDescriptor.value.toString()
)
)
@@ -14,5 +14,5 @@ fun test() {
with(f) {
listOf(1, 2, 3).iterator(null)
}
listOf(1, 2, 3).<!NO_CONTEXT_RECEIVER!><!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>iterator<!>(null)<!>
}
listOf(1, 2, 3).<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NO_CONTEXT_RECEIVER!>iterator<!>(null)
}
@@ -1,34 +0,0 @@
// !LANGUAGE: +ContextReceivers
interface Semigroup<T> {
infix fun T.combine(other: T): T
}
interface Monoid<T> : Semigroup<T> {
val unit: T
}
object IntMonoid : Monoid<Int> {
override fun Int.combine(other: Int): Int = this + other
override val unit: Int = 0
}
object StringMonoid : Monoid<String> {
override fun String.combine(other: String): String = this + other
override val unit: String = ""
}
public inline fun <T, R> Iterable<T>.fold(initial: R, operation: (acc: R, T) -> R): R = TODO()
context(Monoid<T>)
fun <T> List<T>.sum(): T = fold(unit) { acc, e -> acc.combine(e) }
fun <T> listOf(vararg items: T): List<T> = null!!
fun test() {
with(IntMonoid) {
listOf(1, 2, 3).sum()
}
with(StringMonoid) {
listOf(1, 2, 3).<!NO_CONTEXT_RECEIVER!>sum<!>()
listOf("1", "2", "3").sum()
}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !LANGUAGE: +ContextReceivers
interface Semigroup<T> {
@@ -28,7 +29,7 @@ fun test() {
listOf(1, 2, 3).sum()
}
with(StringMonoid) {
listOf(1, 2, 3).<!NO_CONTEXT_RECEIVER!>sum()<!>
listOf(1, 2, 3).<!NO_CONTEXT_RECEIVER!>sum<!>()
listOf("1", "2", "3").sum()
}
}
}
@@ -16,35 +16,35 @@ fun <T> f(lazy1: Lazy<Int>, lazy2: Lazy<CharSequence>, lazyT: Lazy<T>, lazyLazyT
with(lazy2) {
test1()
test2()
<!NO_CONTEXT_RECEIVER!><!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>test3<!>()<!>
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NO_CONTEXT_RECEIVER!>test3<!>()
}
}
with(lazy2) {
with(lazy1) {
test1()
test2()
<!NO_CONTEXT_RECEIVER!><!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>test3<!>()<!>
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NO_CONTEXT_RECEIVER!>test3<!>()
}
}
with(lazyT) {
with(lazy1) {
<!NO_CONTEXT_RECEIVER!>test1()<!>
<!NO_CONTEXT_RECEIVER!>test1<!>()
test2()
<!NO_CONTEXT_RECEIVER!><!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>test3<!>()<!>
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NO_CONTEXT_RECEIVER!>test3<!>()
}
}
with(lazyLazyT) {
with(lazy1) {
<!NO_CONTEXT_RECEIVER!>test1()<!>
<!NO_CONTEXT_RECEIVER!>test1<!>()
test2()
test3()
}
}
with(lazy1) {
with(lazyLazyT) {
<!NO_CONTEXT_RECEIVER!>test1()<!>
<!NO_CONTEXT_RECEIVER!>test1<!>()
test2()
test3()
}
}
}
}
@@ -8,5 +8,5 @@ context(T)
fun <T> T.f(t: B<T>) {}
fun Int.main(a: A, b: B<String>) {
a.<!NO_CONTEXT_RECEIVER!>f(<!TYPE_MISMATCH!>b<!>)<!>
}
a.<!NO_CONTEXT_RECEIVER!>f<!>(<!TYPE_MISMATCH!>b<!>)
}
@@ -1,18 +0,0 @@
// !LANGUAGE: +ContextReceivers
// !DIAGNOSTICS: -UNUSED_PARAMETER
fun <T> listOf(vararg e: T): List<T> = null!!
class A<T>
context(List<T>)
fun <T> A<T>.f() {}
fun main() {
with(listOf(1, 2, 3)) {
A<Int>().f()
}
with(listOf("1", "2", "3")) {
A<Int>().<!NO_CONTEXT_RECEIVER!>f<!>()
}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !LANGUAGE: +ContextReceivers
// !DIAGNOSTICS: -UNUSED_PARAMETER
@@ -13,6 +14,6 @@ fun main() {
A<Int>().f()
}
with(listOf("1", "2", "3")) {
A<Int>().<!NO_CONTEXT_RECEIVER!>f()<!>
A<Int>().<!NO_CONTEXT_RECEIVER!>f<!>()
}
}
}
@@ -1,20 +0,0 @@
// !LANGUAGE: +ContextReceivers
open class A
class B
class C: A()
context(A)
fun B.f() {}
fun main() {
val b = B()
b.<!NO_CONTEXT_RECEIVER!>f<!>()
with(A()) {
b.f()
}
with(C()) {
b.f()
}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !LANGUAGE: +ContextReceivers
open class A
@@ -10,11 +11,11 @@ fun B.f() {}
fun main() {
val b = B()
b.<!NO_CONTEXT_RECEIVER!>f()<!>
b.<!NO_CONTEXT_RECEIVER!>f<!>()
with(A()) {
b.f()
}
with(C()) {
b.f()
}
}
}
@@ -1,20 +0,0 @@
// !LANGUAGE: +ContextReceivers
class A
class B
class C
context(A)
fun B.f() {}
fun main() {
val b = B()
b.<!NO_CONTEXT_RECEIVER!>f<!>()
with(A()) {
b.f()
}
with(C()) {
b.<!NO_CONTEXT_RECEIVER!>f<!>()
}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !LANGUAGE: +ContextReceivers
class A
@@ -10,11 +11,11 @@ fun B.f() {}
fun main() {
val b = B()
b.<!NO_CONTEXT_RECEIVER!>f()<!>
b.<!NO_CONTEXT_RECEIVER!>f<!>()
with(A()) {
b.f()
}
with(C()) {
b.<!NO_CONTEXT_RECEIVER!>f()<!>
b.<!NO_CONTEXT_RECEIVER!>f<!>()
}
}
}