diff --git a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/ForAscendingPostfixTemplate.java b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/ForAscendingPostfixTemplate.java index 550b1c70b0c1..bb12e3bb0fdd 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/ForAscendingPostfixTemplate.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/ForAscendingPostfixTemplate.java @@ -15,32 +15,17 @@ */ package com.intellij.codeInsight.template.postfix.templates; -import com.intellij.openapi.util.Pair; import com.intellij.psi.PsiExpression; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; public class ForAscendingPostfixTemplate extends ForIndexedPostfixTemplate { public ForAscendingPostfixTemplate() { super("fori", "for (int i = 0; i < expr.length; i++)"); } - @Override - @NotNull - protected String getOperator() { - return "++"; - } - @NotNull @Override - protected String getComparativeSign(@NotNull PsiExpression expr) { - return "<"; - } - - @Nullable - @Override - protected Pair calculateBounds(@NotNull PsiExpression expression) { - String bound = getExpressionBound(expression); - return bound != null ? Pair.create("0", bound) : null; + public String getStringTemplate(@NotNull PsiExpression expr) { + return "for ($type$ $index$ = 0; $index$ < $bound$; $index$++) {\n$END$\n}"; } } \ No newline at end of file diff --git a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/ForDescendingPostfixTemplate.java b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/ForDescendingPostfixTemplate.java index 6b70cd2db844..f6cf0adaf6d0 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/ForDescendingPostfixTemplate.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/ForDescendingPostfixTemplate.java @@ -16,37 +16,19 @@ package com.intellij.codeInsight.template.postfix.templates; import com.intellij.codeInsight.template.postfix.util.JavaPostfixTemplatesUtils; -import com.intellij.openapi.util.Pair; import com.intellij.psi.PsiExpression; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; public class ForDescendingPostfixTemplate extends ForIndexedPostfixTemplate { public ForDescendingPostfixTemplate() { super("forr", "for (int i = expr.length-1; i >= 0; i--)"); } - @Override - @NotNull - protected String getOperator() { - return "--"; - } - @NotNull @Override - protected String getComparativeSign(@NotNull PsiExpression expr) { - return JavaPostfixTemplatesUtils.isNumber(expr.getType()) ? ">" : ">="; - } - - @Nullable - @Override - protected Pair calculateBounds(@NotNull PsiExpression expression) { - String bound = getExpressionBound(expression); - if (bound == null) { - return null; - } - return JavaPostfixTemplatesUtils.isNumber(expression.getType()) - ? Pair.create(bound, "0") - : Pair.create(bound + " - 1", "0"); + public String getStringTemplate(@NotNull PsiExpression expr) { + return JavaPostfixTemplatesUtils.isNumber(expr.getType()) + ? "for ($type$ $index$ = $bound$; $index$ > 0; $index$--) {\n$END$\n}" + : "for ($type$ $index$ = $bound$ - 1; $index$ >= 0; $index$--) {\n$END$\n}"; } } \ No newline at end of file diff --git a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/ForIndexedPostfixTemplate.java b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/ForIndexedPostfixTemplate.java index 745d76ff61a5..38ea87df927f 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/ForIndexedPostfixTemplate.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/ForIndexedPostfixTemplate.java @@ -19,88 +19,61 @@ import com.intellij.codeInsight.template.Template; import com.intellij.codeInsight.template.TemplateManager; import com.intellij.codeInsight.template.impl.MacroCallNode; import com.intellij.codeInsight.template.macro.SuggestVariableNameMacro; -import com.intellij.codeInsight.template.postfix.util.JavaPostfixTemplatesUtils; -import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.Condition; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiExpression; import com.intellij.psi.PsiType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public abstract class ForIndexedPostfixTemplate extends PostfixTemplate { +import static com.intellij.codeInsight.template.postfix.util.JavaPostfixTemplatesUtils.*; + +public abstract class ForIndexedPostfixTemplate extends StringBasedPostfixTemplate { + + public static final Condition IS_NUMBER_OR_ARRAY_OR_ITERABLE = new Condition() { + @Override + public boolean value(PsiElement element) { + return IS_ITERABLE_OR_ARRAY.value(element) || IS_NUMBER.value(element); + } + }; + protected ForIndexedPostfixTemplate(@NotNull String key, @NotNull String example) { - super(key, example); + super(key, example, JAVA_PSI_INFO, IS_NUMBER_OR_ARRAY_OR_ITERABLE); } @Override - public boolean isApplicable(@NotNull PsiElement context, @NotNull Document copyDocument, int newOffset) { - PsiExpression expr = JavaPostfixTemplatesUtils.getTopmostExpression(context); - return expr != null && (JavaPostfixTemplatesUtils.isNumber(expr.getType()) || - JavaPostfixTemplatesUtils.isArray(expr.getType()) || - JavaPostfixTemplatesUtils.isIterable(expr.getType())); - } - - @Override - public void expand(@NotNull PsiElement context, @NotNull Editor editor) { - PsiExpression expr = JavaPostfixTemplatesUtils.getTopmostExpression(context); - if (expr == null) { - PostfixTemplatesUtils.showErrorHint(context.getProject(), editor); + public void expandWithTemplateManager(TemplateManager manager, PsiElement expression, Editor editor) { + PsiExpression expr = (PsiExpression)expression; + String bound = getExpressionBound(expr); + if (bound == null) { + PostfixTemplatesUtils.showErrorHint(expr.getProject(), editor); return; } - Pair bounds = calculateBounds(expr); - if (bounds == null) { - PostfixTemplatesUtils.showErrorHint(context.getProject(), editor); - return; - } - Project project = context.getProject(); + String templateWithMacro = getStringTemplate(expr).replace("$bound$", bound).replace("$type$", suggestIndexType(expr)); - Document document = editor.getDocument(); - document.deleteString(expr.getTextRange().getStartOffset(), expr.getTextRange().getEndOffset()); - TemplateManager manager = TemplateManager.getInstance(project); + Template template = manager.createTemplate("", "", templateWithMacro); - Template template = manager.createTemplate("", ""); template.setToReformat(true); - template.addTextSegment("for (" + suggestIndexType(expr) + " "); MacroCallNode index = new MacroCallNode(new SuggestVariableNameMacro()); - String indexVariable = "index"; - template.addVariable(indexVariable, index, index, true); - template.addTextSegment(" = " + bounds.first + "; "); - template.addVariableSegment(indexVariable); - template.addTextSegment(getComparativeSign(expr)); - template.addTextSegment(bounds.second); - template.addTextSegment("; "); - template.addVariableSegment(indexVariable); - template.addTextSegment(getOperator()); - template.addTextSegment(") {\n"); - template.addEndVariable(); - template.addTextSegment("\n}"); - + template.addVariable("index", index, index, true); manager.startTemplate(editor, template); } @NotNull - protected abstract String getComparativeSign(@NotNull PsiExpression expr); + protected abstract String getStringTemplate(@NotNull PsiExpression expr); @Nullable - protected abstract Pair calculateBounds(@NotNull PsiExpression expression); - - @NotNull - protected abstract String getOperator(); - - @Nullable - protected static String getExpressionBound(@NotNull PsiExpression expr) { + private static String getExpressionBound(@NotNull PsiExpression expr) { PsiType type = expr.getType(); - if (JavaPostfixTemplatesUtils.isNumber(type)) { + if (isNumber(type)) { return expr.getText(); } - else if (JavaPostfixTemplatesUtils.isArray(type)) { + else if (isArray(type)) { return expr.getText() + ".length"; } - else if (JavaPostfixTemplatesUtils.isIterable(type)) { + else if (isIterable(type)) { return expr.getText() + ".size()"; } return null; @@ -109,7 +82,7 @@ public abstract class ForIndexedPostfixTemplate extends PostfixTemplate { @NotNull private static String suggestIndexType(@NotNull PsiExpression expr) { PsiType type = expr.getType(); - if (JavaPostfixTemplatesUtils.isNumber(type)) { + if (isNumber(type)) { return type.getCanonicalText(); } return "int"; diff --git a/java/java-impl/src/com/intellij/codeInsight/template/postfix/util/JavaPostfixTemplatesUtils.java b/java/java-impl/src/com/intellij/codeInsight/template/postfix/util/JavaPostfixTemplatesUtils.java index c8f8488c7799..a6a13f7068d9 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/postfix/util/JavaPostfixTemplatesUtils.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/postfix/util/JavaPostfixTemplatesUtils.java @@ -93,6 +93,13 @@ public abstract class JavaPostfixTemplatesUtils { } }; + public static Condition IS_NUMBER = new Condition() { + @Override + public boolean value(PsiElement element) { + return element instanceof PsiExpression && isNumber(((PsiExpression)element).getType()); + } + }; + public static Condition IS_BOOLEAN = new Condition() { @Override public boolean value(PsiElement element) {