Some Live Templates should probably be enabled also for "expressions" not only "statements" (KT-19194)

Consider if-then, if-else, do-while, while positions without block as
statement position.

 #KT-19194 Fixed
This commit is contained in:
Toshiaki Kameyama
2018-01-23 10:11:44 +09:00
committed by Nikolay Krasko
parent 543db380d2
commit c06aaf6128
9 changed files with 56 additions and 7 deletions
@@ -18,7 +18,7 @@ package org.jetbrains.kotlin.idea.liveTemplates;
import com.intellij.codeInsight.template.EverywhereContextType; import com.intellij.codeInsight.template.EverywhereContextType;
import com.intellij.codeInsight.template.TemplateContextType; 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.PsiComment;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFile;
@@ -30,6 +30,7 @@ import com.intellij.psi.util.PsiUtilCore;
import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.KtNodeTypes;
import org.jetbrains.kotlin.idea.KotlinLanguage; import org.jetbrains.kotlin.idea.KotlinLanguage;
import org.jetbrains.kotlin.lexer.KtTokens; import org.jetbrains.kotlin.lexer.KtTokens;
import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.psi.*;
@@ -162,12 +163,8 @@ public abstract class KotlinTemplateContextType extends TemplateContextType {
@Override @Override
protected boolean isInContext(@NotNull PsiElement element) { protected boolean isInContext(@NotNull PsiElement element) {
PsiElement parentStatement = PsiTreeUtil.findFirstParent(element, new Condition<PsiElement>() { PsiElement parentStatement = PsiTreeUtil.findFirstParent(element, e ->
@Override e instanceof KtExpression && KtPsiUtil.isStatementContainer(e.getParent()));
public boolean value(PsiElement element) {
return element instanceof KtExpression && (element.getParent() instanceof KtBlockExpression);
}
});
if (parentStatement == null) return false; if (parentStatement == null) return false;
@@ -0,0 +1,3 @@
fun test(b: Boolean) {
sou<caret>t
}
@@ -0,0 +1,3 @@
fun test(b: Boolean) {
do sou<caret>t while (b)
}
@@ -0,0 +1,3 @@
fun test(b: Boolean) {
for (i in 1..10) sou<caret>t
}
@@ -0,0 +1,3 @@
fun test(b: Boolean) {
if (b) println() else sou<caret>t
}
@@ -0,0 +1,3 @@
fun test(b: Boolean) {
if (b) sou<caret>t else println()
}
@@ -0,0 +1,6 @@
fun test(b: Boolean) {
when (b) {
true -> sou<caret>t
else -> println()
}
}
@@ -0,0 +1,3 @@
fun test(b: Boolean) {
while (b) sou<caret>t
}
@@ -62,6 +62,34 @@ class LiveTemplatesContextTest : KotlinLightCodeInsightFixtureTestCase() {
assertInContexts(Generic::class.java, Class::class.java, ObjectDeclaration::class.java) 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<out KotlinTemplateContextType>) { private fun assertInContexts(vararg expectedContexts: java.lang.Class<out KotlinTemplateContextType>) {
myFixture.configureByFile(getTestName(false) + ".kt") myFixture.configureByFile(getTestName(false) + ".kt")
val allContexts = TemplateContextType.EP_NAME.extensions.filter { it is KotlinTemplateContextType } val allContexts = TemplateContextType.EP_NAME.extensions.filter { it is KotlinTemplateContextType }