diff --git a/uast/uast-java/src/org/jetbrains/uast/java/JavaAbstractUElement.kt b/uast/uast-java/src/org/jetbrains/uast/java/JavaAbstractUElement.kt index 6a743ad346ea..05fc5445241e 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/JavaAbstractUElement.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/JavaAbstractUElement.kt @@ -76,7 +76,7 @@ private fun JavaAbstractUElement.unwrapSwitch(uParent: UElement): UElement { } val uSwitchExpression = codeBlockParent.uastParent as? JavaUSwitchExpression ?: return uParent val psiElement = psi ?: return uParent - return findUSwitchClauseBody(uSwitchExpression, psiElement) + return findUSwitchClauseBody(uSwitchExpression, psiElement) ?: return codeBlockParent } if (codeBlockParent is JavaUSwitchExpression) { return unwrapSwitch(codeBlockParent) diff --git a/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUSwitchExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUSwitchExpression.kt index 806fbf8e860a..aab961c7cbf5 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUSwitchExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/controlStructures/JavaUSwitchExpression.kt @@ -71,11 +71,11 @@ internal fun findUSwitchEntry(body: UExpressionList, el: PsiSwitchLabelStatement body.also { require(it.kind == JavaSpecialExpressionKinds.SWITCH) } .expressions.find { (it as? JavaUSwitchEntry)?.labels?.contains(el) ?: false } as? JavaUSwitchEntry -internal fun findUSwitchClauseBody(switch: JavaUSwitchExpression, psi: PsiElement): UExpressionList { +internal fun findUSwitchClauseBody(switch: JavaUSwitchExpression, psi: PsiElement): UExpressionList? { val bodyExpressions = switch.body.expressions val uExpression = bodyExpressions.find { (it as JavaUSwitchEntry).body.expressions.any { it.psi == psi } - } ?: throw IllegalStateException("${psi.javaClass} not found in ${bodyExpressions.map { it.asLogString() }}") + } ?: return null return (uExpression as JavaUSwitchEntry).body } diff --git a/uast/uast-tests/java/BrokenCode/Switch.java b/uast/uast-tests/java/BrokenCode/Switch.java new file mode 100644 index 000000000000..ee9581578b23 --- /dev/null +++ b/uast/uast-tests/java/BrokenCode/Switch.java @@ -0,0 +1,9 @@ +class A { + + void foo(int a){ + switch (a){ + return; + } + } + +} \ No newline at end of file diff --git a/uast/uast-tests/test/org/jetbrains/uast/test/java/JavaUastApiTest.kt b/uast/uast-tests/test/org/jetbrains/uast/test/java/JavaUastApiTest.kt index 6fdbe85c9c2b..bf5e34dd0f70 100644 --- a/uast/uast-tests/test/org/jetbrains/uast/test/java/JavaUastApiTest.kt +++ b/uast/uast-tests/test/org/jetbrains/uast/test/java/JavaUastApiTest.kt @@ -165,4 +165,10 @@ class JavaUastApiTest : AbstractJavaUastTest() { } } + @Test + fun testCanFindAWayFromBrokenSwitch() = doTest("BrokenCode/Switch.java") { name, file -> + val testClass = file.findElementByTextFromPsi("""return;""") + TestCase.assertEquals(7, testClass.withContainingElements.count()) + } + }