Extract Function: Support implicit abnormal exits via Nothing-typed expressions

This commit is contained in:
Alexey Sedunov
2016-10-05 14:17:29 +03:00
parent 8e9f32db9e
commit d3c14ce7d6
8 changed files with 37 additions and 3 deletions
@@ -39,6 +39,8 @@ interface Pseudocode {
val exitInstruction: SubroutineExitInstruction
val errorInstruction: SubroutineExitInstruction
val sinkInstruction: SubroutineSinkInstruction
val enterInstruction: SubroutineEnterInstruction
@@ -71,7 +71,7 @@ class PseudocodeImpl(override val correspondingElement: KtElement) : Pseudocode
private var internalErrorInstruction: SubroutineExitInstruction? = null
private val errorInstruction: SubroutineExitInstruction
override val errorInstruction: SubroutineExitInstruction
get() = internalErrorInstruction ?: throw AssertionError("Error instruction is read before initialization")
private var postPrecessed = false
@@ -18,9 +18,11 @@ package org.jetbrains.kotlin.cfg.pseudocode
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.cfg.Label
import org.jetbrains.kotlin.cfg.pseudocode.instructions.Instruction
import org.jetbrains.kotlin.cfg.pseudocode.instructions.eval.*
import org.jetbrains.kotlin.cfg.pseudocode.instructions.eval.MagicKind.*
import org.jetbrains.kotlin.cfg.pseudocode.instructions.jumps.AbstractJumpInstruction
import org.jetbrains.kotlin.cfg.pseudocode.instructions.jumps.ConditionalJumpInstruction
import org.jetbrains.kotlin.cfg.pseudocode.instructions.jumps.ReturnValueInstruction
import org.jetbrains.kotlin.cfg.pseudocode.instructions.jumps.ThrowExceptionInstruction
@@ -307,4 +309,7 @@ fun Pseudocode.getPseudocodeByElement(element: KtElement): Pseudocode? {
localDeclarations.forEach { decl -> decl.body.getPseudocodeByElement(element)?.let { return it } }
return null
}
}
val Label.isJumpToError: Boolean
get() = resolveToInstruction() == pseudocode.errorInstruction