KT-51243 Fix parameterized contextual lambda
^KT-51243 Fixed
This commit is contained in:
committed by
teamcity
parent
efd5beb49b
commit
d857142514
+6
@@ -10907,6 +10907,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag
|
|||||||
runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.kt");
|
runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("parameterizedContextualLambda.kt")
|
||||||
|
public void testParameterizedContextualLambda() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/parameterizedContextualLambda.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("plusMatrix.kt")
|
@TestMetadata("plusMatrix.kt")
|
||||||
public void testPlusMatrix() throws Exception {
|
public void testPlusMatrix() throws Exception {
|
||||||
|
|||||||
+6
@@ -10907,6 +10907,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
|
|||||||
runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.kt");
|
runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("parameterizedContextualLambda.kt")
|
||||||
|
public void testParameterizedContextualLambda() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/parameterizedContextualLambda.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("plusMatrix.kt")
|
@TestMetadata("plusMatrix.kt")
|
||||||
public void testPlusMatrix() throws Exception {
|
public void testPlusMatrix() throws Exception {
|
||||||
|
|||||||
+6
@@ -10907,6 +10907,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac
|
|||||||
runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.kt");
|
runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("parameterizedContextualLambda.kt")
|
||||||
|
public void testParameterizedContextualLambda() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/parameterizedContextualLambda.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("plusMatrix.kt")
|
@TestMetadata("plusMatrix.kt")
|
||||||
public void testPlusMatrix() throws Exception {
|
public void testPlusMatrix() throws Exception {
|
||||||
|
|||||||
+6
@@ -16734,6 +16734,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
|||||||
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/overloading.kt");
|
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/overloading.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("parameterizedContextualLambda.kt")
|
||||||
|
public void testParameterizedContextualLambda() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/parameterizedContextualLambda.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("passingLambdaToContextualParam.kt")
|
@TestMetadata("passingLambdaToContextualParam.kt")
|
||||||
public void testPassingLambdaToContextualParam() throws Exception {
|
public void testPassingLambdaToContextualParam() throws Exception {
|
||||||
|
|||||||
+11
-2
@@ -19,11 +19,11 @@ import org.jetbrains.kotlin.resolve.calls.model.LambdaWithTypeVariableAsExpected
|
|||||||
import org.jetbrains.kotlin.resolve.calls.model.PostponedCallableReferenceMarker
|
import org.jetbrains.kotlin.resolve.calls.model.PostponedCallableReferenceMarker
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.PostponedResolvedAtomMarker
|
import org.jetbrains.kotlin.resolve.calls.model.PostponedResolvedAtomMarker
|
||||||
import org.jetbrains.kotlin.types.model.KotlinTypeMarker
|
import org.jetbrains.kotlin.types.model.KotlinTypeMarker
|
||||||
|
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||||
|
|
||||||
// --------------------------- Variables ---------------------------
|
// --------------------------- Variables ---------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// -------------------------- Atoms --------------------------
|
// -------------------------- Atoms --------------------------
|
||||||
|
|
||||||
sealed class PostponedResolvedAtom : PostponedResolvedAtomMarker {
|
sealed class PostponedResolvedAtom : PostponedResolvedAtomMarker {
|
||||||
@@ -62,7 +62,16 @@ class ResolvedLambdaAtom(
|
|||||||
|
|
||||||
lateinit var returnStatements: Collection<FirStatement>
|
lateinit var returnStatements: Collection<FirStatement>
|
||||||
|
|
||||||
override val inputTypes: Collection<ConeKotlinType> get() = receiver?.let { parameters + it } ?: parameters
|
override val inputTypes: Collection<ConeKotlinType>
|
||||||
|
get() {
|
||||||
|
if (receiver == null && contextReceivers.isEmpty()) return parameters
|
||||||
|
return ArrayList<ConeKotlinType>(parameters.size + contextReceivers.size + (if (receiver != null) 1 else 0)).apply {
|
||||||
|
addAll(parameters)
|
||||||
|
addIfNotNull(receiver)
|
||||||
|
addAll(contextReceivers)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override val outputType: ConeKotlinType get() = returnType
|
override val outputType: ConeKotlinType get() = returnType
|
||||||
|
|
||||||
fun replaceExpectedType(expectedType: ConeKotlinType, newReturnType: ConeTypeVariableType) {
|
fun replaceExpectedType(expectedType: ConeKotlinType, newReturnType: ConeTypeVariableType) {
|
||||||
|
|||||||
+22
-8
@@ -8,20 +8,26 @@ package org.jetbrains.kotlin.resolve.calls.model
|
|||||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.resolve.calls.components.*
|
import org.jetbrains.kotlin.resolve.calls.components.ReturnArgumentsInfo
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.components.TypeArgumentsToParametersMapper
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.components.candidate.CallableReferenceResolutionCandidate
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.components.candidate.ResolutionCandidate
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.components.extractInputOutputTypesFromCallableReferenceExpectedType
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.inference.NewConstraintSystem
|
||||||
import org.jetbrains.kotlin.resolve.calls.inference.components.FreshVariableNewTypeSubstitutor
|
import org.jetbrains.kotlin.resolve.calls.inference.components.FreshVariableNewTypeSubstitutor
|
||||||
import org.jetbrains.kotlin.resolve.calls.inference.components.NewTypeSubstitutor
|
import org.jetbrains.kotlin.resolve.calls.inference.components.NewTypeSubstitutor
|
||||||
import org.jetbrains.kotlin.resolve.calls.inference.model.*
|
import org.jetbrains.kotlin.resolve.calls.inference.model.NewConstraintError
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.inference.model.NewConstraintMismatch
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.inference.model.NewConstraintWarning
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.inference.model.TypeVariableForLambdaReturnType
|
||||||
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind
|
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind
|
||||||
import org.jetbrains.kotlin.resolve.calls.components.candidate.ResolutionCandidate
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.components.candidate.CallableReferenceResolutionCandidate
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.inference.NewConstraintSystem
|
|
||||||
import org.jetbrains.kotlin.resolve.constants.IntegerValueTypeConstant
|
import org.jetbrains.kotlin.resolve.constants.IntegerValueTypeConstant
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
import org.jetbrains.kotlin.types.TypeConstructor
|
import org.jetbrains.kotlin.types.TypeConstructor
|
||||||
import org.jetbrains.kotlin.types.UnwrappedType
|
import org.jetbrains.kotlin.types.UnwrappedType
|
||||||
import org.jetbrains.kotlin.types.model.KotlinTypeMarker
|
import org.jetbrains.kotlin.types.model.KotlinTypeMarker
|
||||||
import org.jetbrains.kotlin.types.typeUtil.unCapture
|
import org.jetbrains.kotlin.types.typeUtil.unCapture
|
||||||
|
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -174,7 +180,16 @@ class ResolvedLambdaAtom(
|
|||||||
setAnalyzedResults(subResolvedAtoms)
|
setAnalyzedResults(subResolvedAtoms)
|
||||||
}
|
}
|
||||||
|
|
||||||
override val inputTypes: Collection<UnwrappedType> get() = receiver?.let { parameters + it } ?: parameters
|
override val inputTypes: Collection<UnwrappedType>
|
||||||
|
get() {
|
||||||
|
if (receiver == null && contextReceivers.isEmpty()) return parameters
|
||||||
|
return ArrayList<UnwrappedType>(parameters.size + contextReceivers.size + (if (receiver != null) 1 else 0)).apply {
|
||||||
|
addAll(parameters)
|
||||||
|
addIfNotNull(receiver)
|
||||||
|
addAll(contextReceivers)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override val outputType: UnwrappedType get() = returnType
|
override val outputType: UnwrappedType get() = returnType
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -230,8 +245,7 @@ class CallableReferenceWithRevisedExpectedTypeAtom(
|
|||||||
class PostponedCallableReferenceAtom(
|
class PostponedCallableReferenceAtom(
|
||||||
eagerCallableReferenceAtom: EagerCallableReferenceAtom
|
eagerCallableReferenceAtom: EagerCallableReferenceAtom
|
||||||
) : AbstractPostponedCallableReferenceAtom(eagerCallableReferenceAtom.atom, eagerCallableReferenceAtom.expectedType),
|
) : AbstractPostponedCallableReferenceAtom(eagerCallableReferenceAtom.atom, eagerCallableReferenceAtom.expectedType),
|
||||||
PostponedCallableReferenceMarker
|
PostponedCallableReferenceMarker {
|
||||||
{
|
|
||||||
override var revisedExpectedType: UnwrappedType? = null
|
override var revisedExpectedType: UnwrappedType? = null
|
||||||
private set
|
private set
|
||||||
|
|
||||||
|
|||||||
Vendored
+13
@@ -0,0 +1,13 @@
|
|||||||
|
// !LANGUAGE: +ContextReceivers
|
||||||
|
// TARGET_BACKEND: JVM_IR
|
||||||
|
// FIR status: context receivers aren't yet supported
|
||||||
|
|
||||||
|
class A {
|
||||||
|
val result = "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T> test(receiver: T, action: context(T) () -> String) = action(receiver)
|
||||||
|
|
||||||
|
fun box(): String = with(A()) {
|
||||||
|
result
|
||||||
|
}
|
||||||
Vendored
+20
@@ -0,0 +1,20 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
|
// SKIP_TXT
|
||||||
|
// !LANGUAGE: +ContextReceivers
|
||||||
|
|
||||||
|
fun <T> test(action: context(T) () -> Unit) {}
|
||||||
|
|
||||||
|
fun <T> test2(actionWithArg: context(T) (T) -> Unit) {}
|
||||||
|
|
||||||
|
fun main() {
|
||||||
|
test<String> {
|
||||||
|
length
|
||||||
|
}
|
||||||
|
test<Int> {
|
||||||
|
toDouble()
|
||||||
|
}
|
||||||
|
test2<String> { a ->
|
||||||
|
length
|
||||||
|
a.length
|
||||||
|
}
|
||||||
|
}
|
||||||
Generated
+6
@@ -10913,6 +10913,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
|
|||||||
runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.kt");
|
runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("parameterizedContextualLambda.kt")
|
||||||
|
public void testParameterizedContextualLambda() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/parameterizedContextualLambda.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("plusMatrix.kt")
|
@TestMetadata("plusMatrix.kt")
|
||||||
public void testPlusMatrix() throws Exception {
|
public void testPlusMatrix() throws Exception {
|
||||||
|
|||||||
+6
@@ -16734,6 +16734,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/overloading.kt");
|
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/overloading.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("parameterizedContextualLambda.kt")
|
||||||
|
public void testParameterizedContextualLambda() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/parameterizedContextualLambda.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("passingLambdaToContextualParam.kt")
|
@TestMetadata("passingLambdaToContextualParam.kt")
|
||||||
public void testPassingLambdaToContextualParam() throws Exception {
|
public void testPassingLambdaToContextualParam() throws Exception {
|
||||||
|
|||||||
Reference in New Issue
Block a user