diff --git a/idea/src/org/jetbrains/jet/plugin/liveTemplates/JetTemplateContextType.java b/idea/src/org/jetbrains/jet/plugin/liveTemplates/JetTemplateContextType.java index da8b505a051..8d6ca1b63f2 100644 --- a/idea/src/org/jetbrains/jet/plugin/liveTemplates/JetTemplateContextType.java +++ b/idea/src/org/jetbrains/jet/plugin/liveTemplates/JetTemplateContextType.java @@ -18,10 +18,9 @@ package org.jetbrains.jet.plugin.liveTemplates; import com.intellij.codeInsight.template.EverywhereContextType; import com.intellij.codeInsight.template.TemplateContextType; -import com.intellij.psi.PsiComment; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiWhiteSpace; +import com.intellij.lang.ASTNode; +import com.intellij.openapi.util.Condition; +import com.intellij.psi.*; import com.intellij.psi.impl.source.tree.LeafPsiElement; import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiTreeUtil; @@ -33,6 +32,8 @@ import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.plugin.JetLanguage; +import java.util.Arrays; + public abstract class JetTemplateContextType extends TemplateContextType { protected JetTemplateContextType(@NotNull @NonNls String id, @NotNull String presentableName, @Nullable java.lang.Class baseContextType) { super(id, presentableName, baseContextType); @@ -143,15 +144,17 @@ public abstract class JetTemplateContextType extends TemplateContextType { @Override protected boolean isInContext(@NotNull PsiElement element) { - PsiElement parent = element.getParent(); - if (parent instanceof JetSimpleNameExpression) { - parent = parent.getParent(); - } - if (parent instanceof JetBinaryExpression) { - // Example: sout foo() - parent = parent.getParent(); - } - return parent instanceof JetBlockExpression; + PsiElement parentStatement = PsiTreeUtil.findFirstParent(element, new Condition() { + @Override + public boolean value(PsiElement element) { + return element instanceof JetExpression && (element.getParent() instanceof JetBlockExpression); + } + }); + + if (parentStatement == null) return false; + + // We are in the leftmost position in parentStatement + return element.getTextOffset() == parentStatement.getTextOffset(); } } diff --git a/idea/testData/templates/sout_AfterSemicolon.exp.kt b/idea/testData/templates/sout_AfterSemicolon.exp.kt new file mode 100644 index 00000000000..6b4fb481d36 --- /dev/null +++ b/idea/testData/templates/sout_AfterSemicolon.exp.kt @@ -0,0 +1,3 @@ +fun main(args : Array) { + foo; println() +} diff --git a/idea/testData/templates/sout_AfterSemicolon.kt b/idea/testData/templates/sout_AfterSemicolon.kt new file mode 100644 index 00000000000..4e5526f89ee --- /dev/null +++ b/idea/testData/templates/sout_AfterSemicolon.kt @@ -0,0 +1,3 @@ +fun main(args : Array) { + foo; +} diff --git a/idea/testData/templates/sout_BeforeBinary.exp.kt b/idea/testData/templates/sout_BeforeBinary.exp.kt new file mode 100644 index 00000000000..2c166a7a3af --- /dev/null +++ b/idea/testData/templates/sout_BeforeBinary.exp.kt @@ -0,0 +1,3 @@ +fun main(args : Array) { + println()1 + 1 +} diff --git a/idea/testData/templates/sout_BeforeBinary.kt b/idea/testData/templates/sout_BeforeBinary.kt new file mode 100644 index 00000000000..c202a95aa55 --- /dev/null +++ b/idea/testData/templates/sout_BeforeBinary.kt @@ -0,0 +1,3 @@ +fun main(args : Array) { + 1 + 1 +} diff --git a/idea/testData/templates/sout_BeforeCall.exp.kt b/idea/testData/templates/sout_BeforeCall.exp.kt new file mode 100644 index 00000000000..44848f19e6a --- /dev/null +++ b/idea/testData/templates/sout_BeforeCall.exp.kt @@ -0,0 +1,3 @@ +fun main(args : Array) { + println()foo() +} diff --git a/idea/testData/templates/sout_BeforeCall.kt b/idea/testData/templates/sout_BeforeCall.kt new file mode 100644 index 00000000000..ece3a22ef4f --- /dev/null +++ b/idea/testData/templates/sout_BeforeCall.kt @@ -0,0 +1,3 @@ +fun main(args : Array) { + foo() +} diff --git a/idea/testData/templates/sout_BeforeCallSpace.exp.kt b/idea/testData/templates/sout_BeforeCallSpace.exp.kt new file mode 100644 index 00000000000..8516031d415 --- /dev/null +++ b/idea/testData/templates/sout_BeforeCallSpace.exp.kt @@ -0,0 +1,3 @@ +fun main(args : Array) { + println() foo() +} diff --git a/idea/testData/templates/sout_BeforeCallSpace.kt b/idea/testData/templates/sout_BeforeCallSpace.kt new file mode 100644 index 00000000000..6f8b2ba9c10 --- /dev/null +++ b/idea/testData/templates/sout_BeforeCallSpace.kt @@ -0,0 +1,3 @@ +fun main(args : Array) { + foo() +} diff --git a/idea/testData/templates/sout_BeforeQualifiedCall.exp.kt b/idea/testData/templates/sout_BeforeQualifiedCall.exp.kt new file mode 100644 index 00000000000..eb3a396cea8 --- /dev/null +++ b/idea/testData/templates/sout_BeforeQualifiedCall.exp.kt @@ -0,0 +1,3 @@ +fun main(args : Array) { + println()x.foo() +} diff --git a/idea/testData/templates/sout_BeforeQualifiedCall.kt b/idea/testData/templates/sout_BeforeQualifiedCall.kt new file mode 100644 index 00000000000..c9cc896bad4 --- /dev/null +++ b/idea/testData/templates/sout_BeforeQualifiedCall.kt @@ -0,0 +1,3 @@ +fun main(args : Array) { + x.foo() +} diff --git a/idea/testData/templates/sout_InCallArguments.exp.kt b/idea/testData/templates/sout_InCallArguments.exp.kt new file mode 100644 index 00000000000..be8e8036d0b --- /dev/null +++ b/idea/testData/templates/sout_InCallArguments.exp.kt @@ -0,0 +1,5 @@ +fun main(args : Array) { + foo( + sout + ) +} diff --git a/idea/testData/templates/sout_InCallArguments.kt b/idea/testData/templates/sout_InCallArguments.kt new file mode 100644 index 00000000000..3e2998f18ed --- /dev/null +++ b/idea/testData/templates/sout_InCallArguments.kt @@ -0,0 +1,5 @@ +fun main(args : Array) { + foo( + + ) +} diff --git a/idea/tests/org/jetbrains/jet/plugin/codeInsight/LiveTemplatesTest.java b/idea/tests/org/jetbrains/jet/plugin/codeInsight/LiveTemplatesTest.java index cd13a9ec0de..a8bf4d22bf5 100644 --- a/idea/tests/org/jetbrains/jet/plugin/codeInsight/LiveTemplatesTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/codeInsight/LiveTemplatesTest.java @@ -59,6 +59,30 @@ public class LiveTemplatesTest extends LightCodeInsightFixtureTestCase { paremeterless(); } + public void testSout_BeforeCall() { + paremeterless(); + } + + public void testSout_BeforeCallSpace() { + paremeterless(); + } + + public void testSout_BeforeBinary() { + paremeterless(); + } + + public void testSout_InCallArguments() { + paremeterless(); + } + + public void testSout_BeforeQualifiedCall() { + paremeterless(); + } + + public void testSout_AfterSemicolon() { + paremeterless(); + } + public void testSerr() { paremeterless(); }