diff --git a/idea/idea-live-templates/src/org/jetbrains/kotlin/idea/liveTemplates/KotlinTemplateContextType.java b/idea/idea-live-templates/src/org/jetbrains/kotlin/idea/liveTemplates/KotlinTemplateContextType.java index cf01ca5c68d..a7b94c41764 100644 --- a/idea/idea-live-templates/src/org/jetbrains/kotlin/idea/liveTemplates/KotlinTemplateContextType.java +++ b/idea/idea-live-templates/src/org/jetbrains/kotlin/idea/liveTemplates/KotlinTemplateContextType.java @@ -18,7 +18,7 @@ package org.jetbrains.kotlin.idea.liveTemplates; import com.intellij.codeInsight.template.EverywhereContextType; import com.intellij.codeInsight.template.TemplateContextType; -import com.intellij.openapi.util.Condition; +import com.intellij.lang.ASTNode; import com.intellij.psi.PsiComment; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; @@ -30,6 +30,7 @@ import com.intellij.psi.util.PsiUtilCore; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.kotlin.KtNodeTypes; import org.jetbrains.kotlin.idea.KotlinLanguage; import org.jetbrains.kotlin.lexer.KtTokens; import org.jetbrains.kotlin.psi.*; @@ -162,12 +163,8 @@ public abstract class KotlinTemplateContextType extends TemplateContextType { @Override protected boolean isInContext(@NotNull PsiElement element) { - PsiElement parentStatement = PsiTreeUtil.findFirstParent(element, new Condition() { - @Override - public boolean value(PsiElement element) { - return element instanceof KtExpression && (element.getParent() instanceof KtBlockExpression); - } - }); + PsiElement parentStatement = PsiTreeUtil.findFirstParent(element, e -> + e instanceof KtExpression && KtPsiUtil.isStatementContainer(e.getParent())); if (parentStatement == null) return false; diff --git a/idea/idea-live-templates/testData/context/StatementInBlock.kt b/idea/idea-live-templates/testData/context/StatementInBlock.kt new file mode 100644 index 00000000000..f714250aa04 --- /dev/null +++ b/idea/idea-live-templates/testData/context/StatementInBlock.kt @@ -0,0 +1,3 @@ +fun test(b: Boolean) { + sout +} \ No newline at end of file diff --git a/idea/idea-live-templates/testData/context/StatementInDoWhile.kt b/idea/idea-live-templates/testData/context/StatementInDoWhile.kt new file mode 100644 index 00000000000..534742d1f5d --- /dev/null +++ b/idea/idea-live-templates/testData/context/StatementInDoWhile.kt @@ -0,0 +1,3 @@ +fun test(b: Boolean) { + do sout while (b) +} \ No newline at end of file diff --git a/idea/idea-live-templates/testData/context/StatementInFor.kt b/idea/idea-live-templates/testData/context/StatementInFor.kt new file mode 100644 index 00000000000..b0e121680e8 --- /dev/null +++ b/idea/idea-live-templates/testData/context/StatementInFor.kt @@ -0,0 +1,3 @@ +fun test(b: Boolean) { + for (i in 1..10) sout +} \ No newline at end of file diff --git a/idea/idea-live-templates/testData/context/StatementInIfElse.kt b/idea/idea-live-templates/testData/context/StatementInIfElse.kt new file mode 100644 index 00000000000..b3100399a98 --- /dev/null +++ b/idea/idea-live-templates/testData/context/StatementInIfElse.kt @@ -0,0 +1,3 @@ +fun test(b: Boolean) { + if (b) println() else sout +} \ No newline at end of file diff --git a/idea/idea-live-templates/testData/context/StatementInIfThen.kt b/idea/idea-live-templates/testData/context/StatementInIfThen.kt new file mode 100644 index 00000000000..15098dcd5ba --- /dev/null +++ b/idea/idea-live-templates/testData/context/StatementInIfThen.kt @@ -0,0 +1,3 @@ +fun test(b: Boolean) { + if (b) sout else println() +} \ No newline at end of file diff --git a/idea/idea-live-templates/testData/context/StatementInWhen.kt b/idea/idea-live-templates/testData/context/StatementInWhen.kt new file mode 100644 index 00000000000..ad39719db79 --- /dev/null +++ b/idea/idea-live-templates/testData/context/StatementInWhen.kt @@ -0,0 +1,6 @@ +fun test(b: Boolean) { + when (b) { + true -> sout + else -> println() + } +} \ No newline at end of file diff --git a/idea/idea-live-templates/testData/context/StatementInWhile.kt b/idea/idea-live-templates/testData/context/StatementInWhile.kt new file mode 100644 index 00000000000..c9bf784e5dd --- /dev/null +++ b/idea/idea-live-templates/testData/context/StatementInWhile.kt @@ -0,0 +1,3 @@ +fun test(b: Boolean) { + while (b) sout +} \ No newline at end of file diff --git a/idea/idea-live-templates/tests/org/jetbrains/kotlin/idea/liveTemplates/LiveTemplatesContextTest.kt b/idea/idea-live-templates/tests/org/jetbrains/kotlin/idea/liveTemplates/LiveTemplatesContextTest.kt index a64534b6821..7152e00b091 100644 --- a/idea/idea-live-templates/tests/org/jetbrains/kotlin/idea/liveTemplates/LiveTemplatesContextTest.kt +++ b/idea/idea-live-templates/tests/org/jetbrains/kotlin/idea/liveTemplates/LiveTemplatesContextTest.kt @@ -62,6 +62,34 @@ class LiveTemplatesContextTest : KotlinLightCodeInsightFixtureTestCase() { assertInContexts(Generic::class.java, Class::class.java, ObjectDeclaration::class.java) } + fun testStatementInBlock() { + assertInContexts(Generic::class.java, Statement::class.java, Expression::class.java) + } + + fun testStatementInDoWhile() { + assertInContexts(Generic::class.java, Statement::class.java, Expression::class.java) + } + + fun testStatementInFor() { + assertInContexts(Generic::class.java, Statement::class.java, Expression::class.java) + } + + fun testStatementInIfElse() { + assertInContexts(Generic::class.java, Statement::class.java, Expression::class.java) + } + + fun testStatementInIfThen() { + assertInContexts(Generic::class.java, Statement::class.java, Expression::class.java) + } + + fun testStatementInWhile() { + assertInContexts(Generic::class.java, Statement::class.java, Expression::class.java) + } + + fun testStatementInWhen() { + assertInContexts(Generic::class.java, Statement::class.java, Expression::class.java) + } + private fun assertInContexts(vararg expectedContexts: java.lang.Class) { myFixture.configureByFile(getTestName(false) + ".kt") val allContexts = TemplateContextType.EP_NAME.extensions.filter { it is KotlinTemplateContextType }