mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
for indexed refactoring
This commit is contained in:
+2
-17
@@ -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<String, String> 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}";
|
||||
}
|
||||
}
|
||||
+4
-22
@@ -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<String, String> 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}";
|
||||
}
|
||||
}
|
||||
+27
-54
@@ -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<PsiElement> IS_NUMBER_OR_ARRAY_OR_ITERABLE = new Condition<PsiElement>() {
|
||||
@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<String, String> 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<String, String> 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";
|
||||
|
||||
+7
@@ -93,6 +93,13 @@ public abstract class JavaPostfixTemplatesUtils {
|
||||
}
|
||||
};
|
||||
|
||||
public static Condition<PsiElement> IS_NUMBER = new Condition<PsiElement>() {
|
||||
@Override
|
||||
public boolean value(PsiElement element) {
|
||||
return element instanceof PsiExpression && isNumber(((PsiExpression)element).getType());
|
||||
}
|
||||
};
|
||||
|
||||
public static Condition<PsiElement> IS_BOOLEAN = new Condition<PsiElement>() {
|
||||
@Override
|
||||
public boolean value(PsiElement element) {
|
||||
|
||||
Reference in New Issue
Block a user