[NI] Update type of complex subcall for last lambda expressions
This commit is contained in:
+12
@@ -77,6 +77,7 @@ class ResolvedAtomCompleter(
|
|||||||
is ResolvedCallableReferenceAtom -> completeCallableReference(resolvedAtom)
|
is ResolvedCallableReferenceAtom -> completeCallableReference(resolvedAtom)
|
||||||
is ResolvedLambdaAtom -> completeLambda(resolvedAtom)
|
is ResolvedLambdaAtom -> completeLambda(resolvedAtom)
|
||||||
is ResolvedCallAtom -> completeResolvedCall(resolvedAtom, emptyList())
|
is ResolvedCallAtom -> completeResolvedCall(resolvedAtom, emptyList())
|
||||||
|
is ResolvedSubCallArgument -> completeSubCallArgument(resolvedAtom)
|
||||||
is PartialCallResolutionResult -> completeResolvedCall(resolvedAtom.resultCallAtom, resolvedAtom.diagnostics)
|
is PartialCallResolutionResult -> completeResolvedCall(resolvedAtom.resultCallAtom, resolvedAtom.diagnostics)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -90,6 +91,17 @@ class ResolvedAtomCompleter(
|
|||||||
complete(resolvedAtom)
|
complete(resolvedAtom)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun completeSubCallArgument(resolvedSubCallArgument: ResolvedSubCallArgument) {
|
||||||
|
val contextWithoutExpectedType = topLevelCallContext.replaceExpectedType(TypeUtils.NO_EXPECTED_TYPE)
|
||||||
|
kotlinToResolvedCallTransformer.updateRecordedType(
|
||||||
|
resolvedSubCallArgument.atom.psiExpression ?: return,
|
||||||
|
parameter = null,
|
||||||
|
context = contextWithoutExpectedType,
|
||||||
|
reportErrorForTypeMismatch = true,
|
||||||
|
convertedArgumentType = null
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
fun completeResolvedCall(resolvedCallAtom: ResolvedCallAtom, diagnostics: Collection<KotlinCallDiagnostic>): ResolvedCall<*>? {
|
fun completeResolvedCall(resolvedCallAtom: ResolvedCallAtom, diagnostics: Collection<KotlinCallDiagnostic>): ResolvedCall<*>? {
|
||||||
clearPartiallyResolvedCall(resolvedCallAtom)
|
clearPartiallyResolvedCall(resolvedCallAtom)
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -179,7 +179,7 @@ private fun checkSubCallArgument(
|
|||||||
diagnosticsHolder: KotlinDiagnosticsHolder,
|
diagnosticsHolder: KotlinDiagnosticsHolder,
|
||||||
receiverInfo: ReceiverInfo,
|
receiverInfo: ReceiverInfo,
|
||||||
): ResolvedAtom {
|
): ResolvedAtom {
|
||||||
val subCallResult = subCallArgument.callResult
|
val subCallResult = ResolvedSubCallArgument(subCallArgument)
|
||||||
|
|
||||||
if (expectedType == null) return subCallResult
|
if (expectedType == null) return subCallResult
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -44,7 +44,7 @@ interface SimpleKotlinCallArgument : KotlinCallArgument, ReceiverKotlinCallArgum
|
|||||||
|
|
||||||
interface ExpressionKotlinCallArgument : SimpleKotlinCallArgument, ResolutionAtom
|
interface ExpressionKotlinCallArgument : SimpleKotlinCallArgument, ResolutionAtom
|
||||||
|
|
||||||
interface SubKotlinCallArgument : SimpleKotlinCallArgument {
|
interface SubKotlinCallArgument : SimpleKotlinCallArgument, ResolutionAtom {
|
||||||
val callResult: PartialCallResolutionResult
|
val callResult: PartialCallResolutionResult
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -85,6 +85,12 @@ class ResolvedExpressionAtom(override val atom: ExpressionKotlinCallArgument) :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ResolvedSubCallArgument(override val atom: SubKotlinCallArgument) : ResolvedAtom() {
|
||||||
|
init {
|
||||||
|
setAnalyzedResults(listOf(atom.callResult))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
interface PostponedResolvedAtomMarker {
|
interface PostponedResolvedAtomMarker {
|
||||||
val inputTypes: Collection<KotlinTypeMarker>
|
val inputTypes: Collection<KotlinTypeMarker>
|
||||||
val outputType: KotlinTypeMarker?
|
val outputType: KotlinTypeMarker?
|
||||||
|
|||||||
Vendored
+20
@@ -0,0 +1,20 @@
|
|||||||
|
class Inv<T>
|
||||||
|
|
||||||
|
fun Inv<*>.invToInv(): Inv<*>? = null
|
||||||
|
|
||||||
|
fun <R> myRun(block: () -> R): R {
|
||||||
|
return block()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test(c: Inv<*>) {
|
||||||
|
myRun {
|
||||||
|
if (true) return@myRun // coerction to Unit
|
||||||
|
|
||||||
|
c.invToInv()?.let {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
test(Inv<Int>())
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+5
@@ -12770,6 +12770,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
runTest("compiler/testData/codegen/box/inference/coercionToUnitWithLastLambdaExpression.kt");
|
runTest("compiler/testData/codegen/box/inference/coercionToUnitWithLastLambdaExpression.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("coerctionToUnitForLastExpressionWithStarProjection.kt")
|
||||||
|
public void testCoerctionToUnitForLastExpressionWithStarProjection() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inference/coerctionToUnitForLastExpressionWithStarProjection.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("integerLiteralTypeInLamdaReturnType.kt")
|
@TestMetadata("integerLiteralTypeInLamdaReturnType.kt")
|
||||||
public void testIntegerLiteralTypeInLamdaReturnType() throws Exception {
|
public void testIntegerLiteralTypeInLamdaReturnType() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inference/integerLiteralTypeInLamdaReturnType.kt");
|
runTest("compiler/testData/codegen/box/inference/integerLiteralTypeInLamdaReturnType.kt");
|
||||||
|
|||||||
+5
@@ -12770,6 +12770,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
runTest("compiler/testData/codegen/box/inference/coercionToUnitWithLastLambdaExpression.kt");
|
runTest("compiler/testData/codegen/box/inference/coercionToUnitWithLastLambdaExpression.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("coerctionToUnitForLastExpressionWithStarProjection.kt")
|
||||||
|
public void testCoerctionToUnitForLastExpressionWithStarProjection() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inference/coerctionToUnitForLastExpressionWithStarProjection.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("integerLiteralTypeInLamdaReturnType.kt")
|
@TestMetadata("integerLiteralTypeInLamdaReturnType.kt")
|
||||||
public void testIntegerLiteralTypeInLamdaReturnType() throws Exception {
|
public void testIntegerLiteralTypeInLamdaReturnType() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inference/integerLiteralTypeInLamdaReturnType.kt");
|
runTest("compiler/testData/codegen/box/inference/integerLiteralTypeInLamdaReturnType.kt");
|
||||||
|
|||||||
+5
@@ -11640,6 +11640,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
|||||||
runTest("compiler/testData/codegen/box/inference/coercionToUnitWithLastLambdaExpression.kt");
|
runTest("compiler/testData/codegen/box/inference/coercionToUnitWithLastLambdaExpression.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("coerctionToUnitForLastExpressionWithStarProjection.kt")
|
||||||
|
public void testCoerctionToUnitForLastExpressionWithStarProjection() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inference/coerctionToUnitForLastExpressionWithStarProjection.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("integerLiteralTypeInLamdaReturnType.kt")
|
@TestMetadata("integerLiteralTypeInLamdaReturnType.kt")
|
||||||
public void testIntegerLiteralTypeInLamdaReturnType() throws Exception {
|
public void testIntegerLiteralTypeInLamdaReturnType() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inference/integerLiteralTypeInLamdaReturnType.kt");
|
runTest("compiler/testData/codegen/box/inference/integerLiteralTypeInLamdaReturnType.kt");
|
||||||
|
|||||||
+5
@@ -11640,6 +11640,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/inference/coercionToUnitWithLastLambdaExpression.kt");
|
runTest("compiler/testData/codegen/box/inference/coercionToUnitWithLastLambdaExpression.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("coerctionToUnitForLastExpressionWithStarProjection.kt")
|
||||||
|
public void testCoerctionToUnitForLastExpressionWithStarProjection() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inference/coerctionToUnitForLastExpressionWithStarProjection.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("integerLiteralTypeInLamdaReturnType.kt")
|
@TestMetadata("integerLiteralTypeInLamdaReturnType.kt")
|
||||||
public void testIntegerLiteralTypeInLamdaReturnType() throws Exception {
|
public void testIntegerLiteralTypeInLamdaReturnType() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inference/integerLiteralTypeInLamdaReturnType.kt");
|
runTest("compiler/testData/codegen/box/inference/integerLiteralTypeInLamdaReturnType.kt");
|
||||||
|
|||||||
Generated
+5
@@ -9990,6 +9990,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/inference/coercionToUnitWithLastLambdaExpression.kt");
|
runTest("compiler/testData/codegen/box/inference/coercionToUnitWithLastLambdaExpression.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("coerctionToUnitForLastExpressionWithStarProjection.kt")
|
||||||
|
public void testCoerctionToUnitForLastExpressionWithStarProjection() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inference/coerctionToUnitForLastExpressionWithStarProjection.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("integerLiteralTypeInLamdaReturnType.kt")
|
@TestMetadata("integerLiteralTypeInLamdaReturnType.kt")
|
||||||
public void testIntegerLiteralTypeInLamdaReturnType() throws Exception {
|
public void testIntegerLiteralTypeInLamdaReturnType() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inference/integerLiteralTypeInLamdaReturnType.kt");
|
runTest("compiler/testData/codegen/box/inference/integerLiteralTypeInLamdaReturnType.kt");
|
||||||
|
|||||||
+5
@@ -10055,6 +10055,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/inference/coercionToUnitWithLastLambdaExpression.kt");
|
runTest("compiler/testData/codegen/box/inference/coercionToUnitWithLastLambdaExpression.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("coerctionToUnitForLastExpressionWithStarProjection.kt")
|
||||||
|
public void testCoerctionToUnitForLastExpressionWithStarProjection() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inference/coerctionToUnitForLastExpressionWithStarProjection.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("integerLiteralTypeInLamdaReturnType.kt")
|
@TestMetadata("integerLiteralTypeInLamdaReturnType.kt")
|
||||||
public void testIntegerLiteralTypeInLamdaReturnType() throws Exception {
|
public void testIntegerLiteralTypeInLamdaReturnType() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inference/integerLiteralTypeInLamdaReturnType.kt");
|
runTest("compiler/testData/codegen/box/inference/integerLiteralTypeInLamdaReturnType.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user