diff --git a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/CastExpressionPostfixTemplate.java b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/CastExpressionPostfixTemplate.java index 4cb9bbc5eb0e..952987a72c19 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/CastExpressionPostfixTemplate.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/CastExpressionPostfixTemplate.java @@ -17,16 +17,16 @@ package com.intellij.codeInsight.template.postfix.templates; import com.intellij.codeInsight.generation.surroundWith.JavaWithCastSurrounder; import com.intellij.openapi.editor.Editor; -import com.intellij.psi.PsiExpression; +import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; -public class CastExpressionPostfixTemplate extends ExpressionPostfixTemplateWithChooser { +public class CastExpressionPostfixTemplate extends JavaPostfixTemplateWithChooser { public CastExpressionPostfixTemplate() { super("cast", "((SomeType) expr)"); } @Override - protected void doIt(@NotNull final Editor editor, @NotNull final PsiExpression expression) { + protected void doIt(@NotNull final Editor editor, @NotNull final PsiElement expression) { PostfixTemplatesUtils.surround(new JavaWithCastSurrounder(), editor, expression); } } \ No newline at end of file diff --git a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/IntroduceFieldPostfixTemplate.java b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/IntroduceFieldPostfixTemplate.java index 88220955ecbf..7d0547205cfe 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/IntroduceFieldPostfixTemplate.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/IntroduceFieldPostfixTemplate.java @@ -23,19 +23,20 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.introduceField.IntroduceFieldHandler; import org.jetbrains.annotations.NotNull; -public class IntroduceFieldPostfixTemplate extends ExpressionPostfixTemplateWithChooser { +public class IntroduceFieldPostfixTemplate extends JavaPostfixTemplateWithChooser { public IntroduceFieldPostfixTemplate() { super("field", "myField = expr;"); } @Override - protected void doIt(@NotNull Editor editor, @NotNull PsiExpression expression) { - IntroduceFieldHandler handler = ApplicationManager.getApplication().isUnitTestMode() ? getMockHandler(expression) : new IntroduceFieldHandler(); + protected void doIt(@NotNull Editor editor, @NotNull PsiElement expression) { + IntroduceFieldHandler handler = + ApplicationManager.getApplication().isUnitTestMode() ? getMockHandler(expression) : new IntroduceFieldHandler(); handler.invoke(expression.getProject(), new PsiElement[]{expression}, null); } @NotNull - private static IntroduceFieldHandler getMockHandler(@NotNull final PsiExpression expression) { + private static IntroduceFieldHandler getMockHandler(@NotNull final PsiElement expression) { final PsiClass containingClass = PsiTreeUtil.getParentOfType(expression, PsiClass.class); assert containingClass != null; @@ -46,7 +47,7 @@ public class IntroduceFieldPostfixTemplate extends ExpressionPostfixTemplateWith PsiExpression expr, PsiType type, PsiExpression[] occurrences, PsiElement anchorElement, PsiElement anchorElementIfAll) { return new Settings( - "foo", expression, PsiExpression.EMPTY_ARRAY, false, false, false, + "foo", (PsiExpression)expression, PsiExpression.EMPTY_ARRAY, false, false, false, InitializationPlace.IN_CURRENT_METHOD, PsiModifier.PRIVATE, null, null, false, containingClass, false, false); } diff --git a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/IntroduceVariablePostfixTemplate.java b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/IntroduceVariablePostfixTemplate.java index 216565b0f9c7..bde745a01261 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/IntroduceVariablePostfixTemplate.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/IntroduceVariablePostfixTemplate.java @@ -29,16 +29,17 @@ import com.intellij.refactoring.ui.TypeSelectorManagerImpl; import org.jetbrains.annotations.NotNull; // todo: support for int[].var (parses as .class access!) -public class IntroduceVariablePostfixTemplate extends ExpressionPostfixTemplateWithChooser { +public class IntroduceVariablePostfixTemplate extends JavaPostfixTemplateWithChooser { public IntroduceVariablePostfixTemplate() { super("var", "T name = expr;"); } @Override - protected void doIt(@NotNull Editor editor, @NotNull PsiExpression expression) { + protected void doIt(@NotNull Editor editor, @NotNull PsiElement expression) { // for advanced stuff use ((PsiJavaCodeReferenceElement)expression).advancedResolve(true).getElement(); - IntroduceVariableHandler handler = ApplicationManager.getApplication().isUnitTestMode() ? getMockHandler() : new IntroduceVariableHandler(); - handler.invoke(expression.getProject(), editor, expression); + IntroduceVariableHandler handler = + ApplicationManager.getApplication().isUnitTestMode() ? getMockHandler() : new IntroduceVariableHandler(); + handler.invoke(expression.getProject(), editor, (PsiExpression)expression); } @NotNull diff --git a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/JavaPostfixTemplateWithChooser.java b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/JavaPostfixTemplateWithChooser.java new file mode 100644 index 000000000000..72de706f4858 --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/JavaPostfixTemplateWithChooser.java @@ -0,0 +1,42 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.codeInsight.template.postfix.templates; + + +import com.intellij.codeInsight.template.postfix.util.JavaPostfixTemplatesUtils; +import com.intellij.openapi.util.Condition; +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.NotNull; + +import static com.intellij.codeInsight.template.postfix.util.JavaPostfixTemplatesUtils.JAVA_PSI_INFO; + +public abstract class JavaPostfixTemplateWithChooser extends ExpressionPostfixTemplateWithChooser { + + + protected JavaPostfixTemplateWithChooser(@NotNull String name, @NotNull String example) { + super(name, example, JAVA_PSI_INFO); + } + + protected JavaPostfixTemplateWithChooser(@NotNull String name, @NotNull String key, @NotNull String example) { + super(name, key, example, JAVA_PSI_INFO); + } + + @NotNull + @Override + protected Condition getTypeCondition() { + return JavaPostfixTemplatesUtils.IS_NON_VOID; + } +} diff --git a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/NotExpressionPostfixTemplate.java b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/NotExpressionPostfixTemplate.java index 55e53fe4126c..fcedd30a9353 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/NotExpressionPostfixTemplate.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/NotExpressionPostfixTemplate.java @@ -19,19 +19,14 @@ import com.intellij.codeInsight.CodeInsightServicesUtil; import com.intellij.codeInsight.template.postfix.util.JavaPostfixTemplatesUtils; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.util.Condition; +import com.intellij.psi.PsiElement; import com.intellij.psi.PsiExpression; import org.jetbrains.annotations.NotNull; -public class NotExpressionPostfixTemplate extends ExpressionPostfixTemplateWithChooser { - private static final Condition BOOLEAN_TYPE_CONDITION = new Condition() { - @Override - public boolean value(PsiExpression expression) { - return JavaPostfixTemplatesUtils.isBoolean(expression.getType()); - } - }; +public class NotExpressionPostfixTemplate extends JavaPostfixTemplateWithChooser { public NotExpressionPostfixTemplate() { - super("not", "!expr"); + super("not", "!expr"); } public NotExpressionPostfixTemplate(String alias) { @@ -39,13 +34,13 @@ public class NotExpressionPostfixTemplate extends ExpressionPostfixTemplateWithC } @Override - protected void doIt(@NotNull Editor editor, @NotNull PsiExpression expression) { - expression.replace(CodeInsightServicesUtil.invertCondition(expression)); + protected void doIt(@NotNull Editor editor, @NotNull PsiElement expression) { + expression.replace(CodeInsightServicesUtil.invertCondition((PsiExpression)expression)); } @NotNull @Override - protected Condition getTypeCondition() { - return BOOLEAN_TYPE_CONDITION; + protected Condition getTypeCondition() { + return JavaPostfixTemplatesUtils.IS_BOOLEAN; } } \ No newline at end of file diff --git a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/ParenthesizedExpressionPostfixTemplate.java b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/ParenthesizedExpressionPostfixTemplate.java index adfe635950a3..b325e96c49ed 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/ParenthesizedExpressionPostfixTemplate.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/ParenthesizedExpressionPostfixTemplate.java @@ -16,19 +16,16 @@ package com.intellij.codeInsight.template.postfix.templates; import com.intellij.openapi.editor.Editor; -import com.intellij.psi.JavaPsiFacade; -import com.intellij.psi.PsiElementFactory; -import com.intellij.psi.PsiExpression; -import com.intellij.psi.PsiParenthesizedExpression; +import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; -public class ParenthesizedExpressionPostfixTemplate extends ExpressionPostfixTemplateWithChooser { +public class ParenthesizedExpressionPostfixTemplate extends JavaPostfixTemplateWithChooser { public ParenthesizedExpressionPostfixTemplate() { super("par", "(expression)"); } @Override - protected void doIt(@NotNull Editor editor, @NotNull PsiExpression expression) { + protected void doIt(@NotNull Editor editor, @NotNull PsiElement expression) { PsiElementFactory factory = JavaPsiFacade.getInstance(expression.getProject()).getElementFactory(); PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression)factory.createExpressionFromText("(expr)", expression.getParent()); PsiExpression operand = parenthesizedExpression.getExpression(); 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 3c035eced952..3c7dcbda2d2d 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 @@ -17,23 +17,30 @@ package com.intellij.codeInsight.template.postfix.util; import com.intellij.codeInsight.CodeInsightServicesUtil; import com.intellij.codeInsight.CodeInsightUtilCore; -import com.intellij.codeInsight.template.postfix.templates.PostfixTemplatePsiInfo; +import com.intellij.codeInsight.template.postfix.templates.PostfixTemplatePsiInfoBase; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.util.InheritanceUtil; +import com.intellij.psi.util.PsiExpressionTrimRenderer; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.refactoring.introduceVariable.IntroduceVariableBase; +import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; + public abstract class JavaPostfixTemplatesUtils { private JavaPostfixTemplatesUtils() { } - public static PostfixTemplatePsiInfo JAVA_PSI_INFO = new PostfixTemplatePsiInfo() { + public static final PostfixTemplatePsiInfoBase JAVA_PSI_INFO = new PostfixTemplatePsiInfoBase() { @NotNull @Override @@ -60,8 +67,28 @@ public abstract class JavaPostfixTemplatesUtils { @NotNull @Override public PsiExpression getNegatedExpression(@NotNull PsiElement element) { + assert element instanceof PsiExpression; return CodeInsightServicesUtil.invertCondition((PsiExpression)element); } + + @NotNull + @Override + public List getExpressions(@NotNull PsiElement context, @NotNull Document document, int newOffset) { + return ContainerUtil.newArrayList(IntroduceVariableBase.collectExpressions(context.getContainingFile(), document, + Math.max(newOffset - 1, 0), false)); + } + + @NotNull + @Override + public Function getRenderer() { + return new Function() { + @Override + public String fun(PsiElement element) { + assert element instanceof PsiExpression; + return new PsiExpressionTrimRenderer.RenderFunction().fun((PsiExpression)element); + } + }; + } }; public static Condition IS_BOOLEAN = new Condition() { diff --git a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/ExpressionPostfixTemplateWithChooser.java b/platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/ExpressionPostfixTemplateWithChooser.java similarity index 60% rename from java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/ExpressionPostfixTemplateWithChooser.java rename to platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/ExpressionPostfixTemplateWithChooser.java index 25bd61f00b7d..3e45c0ef5508 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/ExpressionPostfixTemplateWithChooser.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/ExpressionPostfixTemplateWithChooser.java @@ -15,7 +15,6 @@ */ package com.intellij.codeInsight.template.postfix.templates; -import com.intellij.codeInsight.template.postfix.util.JavaPostfixTemplatesUtils; import com.intellij.codeInsight.unwrap.ScopeHighlighter; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.CommandProcessor; @@ -24,11 +23,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Pass; import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiExpression; -import com.intellij.psi.PsiType; -import com.intellij.psi.util.PsiExpressionTrimRenderer; import com.intellij.refactoring.IntroduceTargetChooser; -import com.intellij.refactoring.introduceVariable.IntroduceVariableBase; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; @@ -38,14 +33,21 @@ import java.util.List; * @author ignatov */ public abstract class ExpressionPostfixTemplateWithChooser extends PostfixTemplate { - protected ExpressionPostfixTemplateWithChooser(@NotNull String name, @NotNull String example) { + + @NotNull + protected final PostfixTemplatePsiInfoBase myInfo; + + protected ExpressionPostfixTemplateWithChooser(@NotNull String name, @NotNull String example, @NotNull PostfixTemplatePsiInfoBase info) { super(name, example); + myInfo = info; } protected ExpressionPostfixTemplateWithChooser(@NotNull String name, @NotNull String key, - @NotNull String example) { + @NotNull String example, + @NotNull PostfixTemplatePsiInfoBase info) { super(name, key, example); + myInfo = info; } @Override @@ -55,7 +57,7 @@ public abstract class ExpressionPostfixTemplateWithChooser extends PostfixTempla @Override public void expand(@NotNull PsiElement context, @NotNull final Editor editor) { - List expressions = getExpressions(context, editor.getDocument(), editor.getCaretModel().getOffset()); + List expressions = getExpressions(context, editor.getDocument(), editor.getCaretModel().getOffset()); if (expressions.isEmpty()) { PostfixTemplatesUtils.showErrorHint(context.getProject(), editor); @@ -66,8 +68,8 @@ public abstract class ExpressionPostfixTemplateWithChooser extends PostfixTempla else { IntroduceTargetChooser.showChooser( editor, expressions, - new Pass() { - public void pass(@NotNull final PsiExpression e) { + new Pass() { + public void pass(@NotNull final PsiElement e) { ApplicationManager.getApplication().runWriteAction(new Runnable() { @Override public void run() { @@ -80,39 +82,36 @@ public abstract class ExpressionPostfixTemplateWithChooser extends PostfixTempla }); } }, - new PsiExpressionTrimRenderer.RenderFunction(), + myInfo.getRenderer(), "Expressions", 0, ScopeHighlighter.NATURAL_RANGER ); } } @NotNull - protected List getExpressions(@NotNull PsiElement context, @NotNull Document document, final int offset) { - List expressions = ContainerUtil.filter(IntroduceVariableBase.collectExpressions(context.getContainingFile(), document, - Math.max(offset - 1, 0), false), - new Condition() { - @Override - public boolean value(PsiExpression expression) { - return expression.getTextRange().getEndOffset() == offset; - } - } + protected List getExpressions(@NotNull PsiElement context, @NotNull Document document, final int offset) { + List possibleExpressions = myInfo.getExpressions(context, document, offset); + List expressions = ContainerUtil.filter(possibleExpressions, + new Condition() { + @Override + public boolean value(PsiElement expression) { + return expression.getTextRange().getEndOffset() == offset; + } + } ); return ContainerUtil.filter(expressions.isEmpty() ? maybeTopmostExpression(context) : expressions, getTypeCondition()); } @NotNull @SuppressWarnings("unchecked") - protected Condition getTypeCondition() { + protected Condition getTypeCondition() { return Condition.TRUE; } @NotNull - private static List maybeTopmostExpression(@NotNull PsiElement context) { - PsiExpression expression = JavaPostfixTemplatesUtils.getTopmostExpression(context); - PsiType type = expression != null ? expression.getType() : null; - if (type == null || PsiType.VOID.equals(type)) return ContainerUtil.emptyList(); - return ContainerUtil.createMaybeSingletonList(expression); + private List maybeTopmostExpression(@NotNull PsiElement context) { + return ContainerUtil.createMaybeSingletonList(myInfo.getTopmostExpression(context)); } - protected abstract void doIt(@NotNull Editor editor, @NotNull PsiExpression expression); + protected abstract void doIt(@NotNull Editor editor, @NotNull PsiElement expression); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/PostfixTemplatePsiInfoBase.java b/platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/PostfixTemplatePsiInfoBase.java new file mode 100644 index 000000000000..7254e651ce41 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/PostfixTemplatePsiInfoBase.java @@ -0,0 +1,39 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.codeInsight.template.postfix.templates; + +import com.intellij.openapi.editor.Document; +import com.intellij.psi.PsiElement; +import com.intellij.util.Function; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public abstract class PostfixTemplatePsiInfoBase implements PostfixTemplatePsiInfo { + + @NotNull + public abstract List getExpressions(@NotNull PsiElement context, @NotNull Document document, int newOffset); + + @NotNull + public Function getRenderer() { + return new Function() { + @Override + public String fun(@NotNull PsiElement element) { + return element.getText(); + } + }; + } +}