From 3614b0a06c57231b40044b531f9a71ba738fdde1 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 18 Aug 2016 19:00:32 +0300 Subject: [PATCH] Generate IMPLICIT_NOTNULL for (nullability flexible type) -> (non-null type) implicit conversion. --- .../org/jetbrains/kotlin/psi2ir/IrUtils.kt | 23 ++++++++++--------- .../kotlin/ir/expressions/IrOperator.kt | 4 ++-- .../ir/irText/implicitCastOnPlatformType.kt | 2 ++ .../ir/irText/implicitCastOnPlatformType.txt | 8 +++++++ .../kotlin/ir/IrTextTestCaseGenerated.java | 6 +++++ 5 files changed, 30 insertions(+), 13 deletions(-) create mode 100644 compiler/testData/ir/irText/implicitCastOnPlatformType.kt create mode 100644 compiler/testData/ir/irText/implicitCastOnPlatformType.txt diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/IrUtils.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/IrUtils.kt index 8753c6b6d56..ca48a990359 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/IrUtils.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/IrUtils.kt @@ -17,25 +17,26 @@ package org.jetbrains.kotlin.psi2ir import org.jetbrains.kotlin.ir.declarations.IrVariable -import org.jetbrains.kotlin.ir.expressions.IrExpression -import org.jetbrains.kotlin.ir.expressions.IrGetVariableExpressionImpl -import org.jetbrains.kotlin.ir.expressions.IrTypeOperator -import org.jetbrains.kotlin.ir.expressions.IrTypeOperatorExpressionImpl +import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.checker.KotlinTypeChecker +import org.jetbrains.kotlin.types.isNullabilityFlexible fun IrExpression.toExpectedType(expectedType: KotlinType?): IrExpression { if (expectedType == null) return this val valueType = type ?: throw AssertionError("expectedType != null, valueType == null: $this") - if (KotlinTypeChecker.DEFAULT.isSubtypeOf(valueType, expectedType)) { - return this + + if (valueType.isNullabilityFlexible() && !expectedType.isMarkedNullable) { + return IrUnaryOperatorExpressionImpl(startOffset, endOffset, expectedType, + IrOperator.IMPLICIT_NOTNULL, null, this) } - return IrTypeOperatorExpressionImpl( - startOffset, endOffset, expectedType, - IrTypeOperator.IMPLICIT_CAST, expectedType, - this - ) + if (!KotlinTypeChecker.DEFAULT.isSubtypeOf(valueType, expectedType)) { + return IrTypeOperatorExpressionImpl(startOffset, endOffset, expectedType, + IrTypeOperator.IMPLICIT_CAST, expectedType, this) + } + + return this } fun IrVariable.load(): IrExpression = diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrOperator.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrOperator.kt index c5f382fba2b..f9e43696597 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrOperator.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrOperator.kt @@ -21,6 +21,8 @@ interface IrOperator { object EXCL : IrOperatorImpl("EXCL"), IrUnaryOperator object EXCLEXCL : IrOperatorImpl("EXCLEXCL"), IrUnaryOperator + object IMPLICIT_NOTNULL : IrOperatorImpl("IMPLICIT_NOTNULL"), IrUnaryOperator + object ELVIS : IrOperatorImpl("ELVIS"), IrBinaryOperator object LT : IrOperatorImpl("LT"), IrBinaryOperator @@ -38,8 +40,6 @@ interface IrOperator { object ANDAND : IrOperatorImpl("ANDAND"), IrBinaryOperator object OROR : IrOperatorImpl("OROR"), IrBinaryOperator - - object PLUS : IrOperatorImpl("PLUS"), IrBinaryOperator object MINUS : IrOperatorImpl("MINUS"), IrBinaryOperator object MUL : IrOperatorImpl("MUL"), IrBinaryOperator diff --git a/compiler/testData/ir/irText/implicitCastOnPlatformType.kt b/compiler/testData/ir/irText/implicitCastOnPlatformType.kt new file mode 100644 index 00000000000..1afdcc54378 --- /dev/null +++ b/compiler/testData/ir/irText/implicitCastOnPlatformType.kt @@ -0,0 +1,2 @@ +fun test(): String = + System.getProperty("test") \ No newline at end of file diff --git a/compiler/testData/ir/irText/implicitCastOnPlatformType.txt b/compiler/testData/ir/irText/implicitCastOnPlatformType.txt new file mode 100644 index 00000000000..359a5e58429 --- /dev/null +++ b/compiler/testData/ir/irText/implicitCastOnPlatformType.txt @@ -0,0 +1,8 @@ +IrFile /implicitCastOnPlatformType.kt + IrFunction public fun test(): kotlin.String + IrExpressionBody + BLOCK type= hasResult=false operator=null + RETURN type= + UNARY_OP operator=IMPLICIT_NOTNULL type=kotlin.String related=null + CALL .getProperty type=kotlin.String! operator=null + p0: LITERAL String type=kotlin.String value='test' diff --git a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java index f1ab3bdd427..ee59950f158 100644 --- a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java @@ -131,6 +131,12 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase { doTest(fileName); } + @TestMetadata("implicitCastOnPlatformType.kt") + public void testImplicitCastOnPlatformType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/implicitCastOnPlatformType.kt"); + doTest(fileName); + } + @TestMetadata("in.kt") public void testIn() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/in.kt");