Expand statement templates whenever they are mentioned at the beginning of line

This commit is contained in:
Andrey Breslav
2013-11-28 17:49:10 +04:00
parent ededa487a2
commit 1234e55e7e
14 changed files with 80 additions and 13 deletions
@@ -18,10 +18,9 @@ package org.jetbrains.jet.plugin.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.psi.PsiComment; import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement; import com.intellij.openapi.util.Condition;
import com.intellij.psi.PsiFile; import com.intellij.psi.*;
import com.intellij.psi.PsiWhiteSpace;
import com.intellij.psi.impl.source.tree.LeafPsiElement; import com.intellij.psi.impl.source.tree.LeafPsiElement;
import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PsiTreeUtil; 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.lexer.JetTokens;
import org.jetbrains.jet.plugin.JetLanguage; import org.jetbrains.jet.plugin.JetLanguage;
import java.util.Arrays;
public abstract class JetTemplateContextType extends TemplateContextType { public abstract class JetTemplateContextType extends TemplateContextType {
protected JetTemplateContextType(@NotNull @NonNls String id, @NotNull String presentableName, @Nullable java.lang.Class<? extends TemplateContextType> baseContextType) { protected JetTemplateContextType(@NotNull @NonNls String id, @NotNull String presentableName, @Nullable java.lang.Class<? extends TemplateContextType> baseContextType) {
super(id, presentableName, baseContextType); super(id, presentableName, baseContextType);
@@ -143,15 +144,17 @@ public abstract class JetTemplateContextType extends TemplateContextType {
@Override @Override
protected boolean isInContext(@NotNull PsiElement element) { protected boolean isInContext(@NotNull PsiElement element) {
PsiElement parent = element.getParent(); PsiElement parentStatement = PsiTreeUtil.findFirstParent(element, new Condition<PsiElement>() {
if (parent instanceof JetSimpleNameExpression) { @Override
parent = parent.getParent(); public boolean value(PsiElement element) {
} return element instanceof JetExpression && (element.getParent() instanceof JetBlockExpression);
if (parent instanceof JetBinaryExpression) { }
// Example: sout<caret> foo() });
parent = parent.getParent();
} if (parentStatement == null) return false;
return parent instanceof JetBlockExpression;
// We are in the leftmost position in parentStatement
return element.getTextOffset() == parentStatement.getTextOffset();
} }
} }
@@ -0,0 +1,3 @@
fun main(args : Array<String>) {
foo; println(<caret>)
}
@@ -0,0 +1,3 @@
fun main(args : Array<String>) {
foo; <caret>
}
@@ -0,0 +1,3 @@
fun main(args : Array<String>) {
println(<caret>)1 + 1
}
@@ -0,0 +1,3 @@
fun main(args : Array<String>) {
<caret>1 + 1
}
@@ -0,0 +1,3 @@
fun main(args : Array<String>) {
println(<caret>)foo()
}
@@ -0,0 +1,3 @@
fun main(args : Array<String>) {
<caret>foo()
}
@@ -0,0 +1,3 @@
fun main(args : Array<String>) {
println(<caret>) foo()
}
@@ -0,0 +1,3 @@
fun main(args : Array<String>) {
<caret> foo()
}
@@ -0,0 +1,3 @@
fun main(args : Array<String>) {
println(<caret>)x.foo()
}
@@ -0,0 +1,3 @@
fun main(args : Array<String>) {
<caret>x.foo()
}
@@ -0,0 +1,5 @@
fun main(args : Array<String>) {
foo(
sout<caret>
)
}
@@ -0,0 +1,5 @@
fun main(args : Array<String>) {
foo(
<caret>
)
}
@@ -59,6 +59,30 @@ public class LiveTemplatesTest extends LightCodeInsightFixtureTestCase {
paremeterless(); 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() { public void testSerr() {
paremeterless(); paremeterless();
} }