KT-6159: generate Unit while code inlining when needed
This commit is contained in:
@@ -25,7 +25,6 @@ import org.jetbrains.kotlin.psi.psiUtil.PsiChildRange
|
||||
import org.jetbrains.kotlin.psi.psiUtil.findDescendantOfType
|
||||
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
|
||||
import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsExpression
|
||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||
import java.util.*
|
||||
|
||||
internal abstract class ReplacementPerformer<TElement : KtElement>(
|
||||
@@ -85,14 +84,16 @@ internal class ExpressionReplacementPerformer(
|
||||
elementToBeReplaced.replace(codeToInline.mainExpression!!)
|
||||
}
|
||||
else {
|
||||
val bindingContext = elementToBeReplaced.analyze(BodyResolveMode.FULL)
|
||||
val canDropElementToBeReplaced = !elementToBeReplaced.isUsedAsExpression(bindingContext)
|
||||
// NB: Unit is never used as expression
|
||||
val stub = elementToBeReplaced.replace(psiFactory.createExpression("0")) as KtExpression
|
||||
val bindingContext = stub.analyze()
|
||||
val canDropElementToBeReplaced = !stub.isUsedAsExpression(bindingContext)
|
||||
if (canDropElementToBeReplaced) {
|
||||
elementToBeReplaced.delete()
|
||||
stub.delete()
|
||||
null
|
||||
}
|
||||
else {
|
||||
elementToBeReplaced.replace(psiFactory.createExpression("Unit"))
|
||||
stub.replace(psiFactory.createExpression("Unit"))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,9 +2,9 @@ fun <T> doIt(p: () -> T): T = TODO()
|
||||
|
||||
fun g(p: String?) {
|
||||
|
||||
p?.let { }
|
||||
p?.let { Unit }
|
||||
}
|
||||
|
||||
fun h() = Unit
|
||||
|
||||
fun x() = doIt { }
|
||||
fun x() = doIt { Unit }
|
||||
|
||||
@@ -9,6 +9,7 @@ class C {
|
||||
p?.let {
|
||||
println(3)
|
||||
println(4)
|
||||
Unit
|
||||
}
|
||||
|
||||
if (other != null) {
|
||||
@@ -25,5 +26,6 @@ class C {
|
||||
fun x() = doIt {
|
||||
println(9)
|
||||
println(10)
|
||||
Unit
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ fun g(p: String?) {
|
||||
p?.let {
|
||||
println(3)
|
||||
nonUnit(4)
|
||||
Unit
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,5 +21,5 @@ fun h() {
|
||||
fun x() = doIt {
|
||||
println(7)
|
||||
nonUnit(8)
|
||||
// Unit should be here
|
||||
Unit
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user