diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/BaseRefactoringAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/BaseRefactoringAction.java index 4d8e6d78e226..1d6465f98e3e 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/BaseRefactoringAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/BaseRefactoringAction.java @@ -21,6 +21,7 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.SyntheticElement; +import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -34,6 +35,11 @@ public abstract class BaseRefactoringAction extends PsiElementBaseIntentionActio return super.isAvailable(project, editor, file); } + @Override + public final void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { + super.invoke(project, editor, file); + } + @Override public final boolean isAvailable(@NotNull Project project, Editor editor, @NotNull PsiElement element) { return !(element instanceof SyntheticElement) && isAvailableOverride(project, editor, element); diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/IntroduceVariableIntentionAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/IntroduceVariableIntentionAction.java index 1fe33e453a66..491114620aa1 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/IntroduceVariableIntentionAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/IntroduceVariableIntentionAction.java @@ -43,25 +43,23 @@ public class IntroduceVariableIntentionAction extends BaseRefactoringAction { @Override protected boolean isAvailableOverride(@NotNull Project project, Editor editor, @NotNull PsiElement element) { - final PsiExpression expression = getExpression(element); - if (expression == null || !(expression.getParent() instanceof PsiExpressionStatement)) { + final PsiExpressionStatement statement = PsiTreeUtil.getParentOfType(element,PsiExpressionStatement.class); + if (statement == null){ return false; } + final PsiExpression expression = statement.getExpression(); + return expression.getType() != PsiType.VOID && !(expression instanceof PsiAssignmentExpression); } - @Nullable - private static PsiExpression getExpression(@NotNull PsiElement element) { - PsiExpression expression = PsiTreeUtil.getParentOfType(element, PsiExpression.class, false); - while (expression != null && expression instanceof PsiReferenceExpression) { - expression = PsiTreeUtil.getParentOfType(expression, PsiExpression.class, true); - } - return expression; - } - @Override - public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { - new IntroduceVariableHandler().invoke(project, editor, file, null); + public void invoke(@NotNull Project project, Editor editor, @NotNull PsiElement element) throws IncorrectOperationException { + final PsiExpressionStatement statement = PsiTreeUtil.getParentOfType(element,PsiExpressionStatement.class); + if (statement == null){ + return; + } + + new IntroduceVariableHandler().invoke(project, editor, statement.getExpression()); } } diff --git a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableHandler.java b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableHandler.java index 1abc687f3051..8b0854c8a821 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableHandler.java @@ -33,11 +33,15 @@ import com.intellij.refactoring.ui.ConflictsDialog; import com.intellij.refactoring.ui.TypeSelectorManagerImpl; import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.util.containers.MultiMap; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; public class IntroduceVariableHandler extends IntroduceVariableBase { + public void invoke(@NotNull final Project project, final Editor editor, final PsiExpression expression) { + invokeImpl(project, expression, editor); + } @Override public IntroduceVariableSettings getSettings(Project project, Editor editor,