From bbda6d8b02d70203032c06e4fef4ee302cc68e1b Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 17 Aug 2015 14:49:58 +0200 Subject: [PATCH] fix operation assignment (IDEA-143986) --- .../editorActions/DeclarationJoinLinesHandler.java | 14 ++++++++++---- .../codeInspection/RemoveAssignmentFix.java | 9 ++++++++- .../unusedAssignment/afterAssignmentOperation.java | 10 ++++++++++ .../beforeAssignmentOperation.java | 10 ++++++++++ 4 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/afterAssignmentOperation.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/beforeAssignmentOperation.java diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/DeclarationJoinLinesHandler.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/DeclarationJoinLinesHandler.java index a09e8dd983e6..8a404ea89def 100644 --- a/java/java-impl/src/com/intellij/codeInsight/editorActions/DeclarationJoinLinesHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/DeclarationJoinLinesHandler.java @@ -104,6 +104,12 @@ public class DeclarationJoinLinesHandler implements JoinLinesHandlerDelegate { public static PsiExpression getInitializerExpression(PsiLocalVariable var, PsiAssignmentExpression assignment) { + return getInitializerExpression(var.getInitializer(), + assignment); + } + + public static PsiExpression getInitializerExpression(PsiExpression initializer, + PsiAssignmentExpression assignment) { PsiExpression initializerExpression; final IElementType originalOpSign = assignment.getOperationTokenType(); final PsiExpression rExpression = assignment.getRExpression(); @@ -111,7 +117,7 @@ public class DeclarationJoinLinesHandler implements JoinLinesHandlerDelegate { initializerExpression = rExpression; } else { - if (var.getInitializer() == null) return null; + if (initializer == null) return null; String opSign = null; if (originalOpSign == JavaTokenType.ANDEQ) { opSign = "&"; @@ -148,8 +154,8 @@ public class DeclarationJoinLinesHandler implements JoinLinesHandlerDelegate { } try { - final Project project = var.getProject(); - String initializerText = var.getInitializer().getText() + opSign; + final Project project = assignment.getProject(); + String initializerText = initializer.getText() + opSign; final String rightText = rExpression.getText(); if (ParenthesesUtils.areParenthesesNeeded(assignment.getOperationSign(), rExpression)) { initializerText += "(" + rightText + ")"; @@ -157,7 +163,7 @@ public class DeclarationJoinLinesHandler implements JoinLinesHandlerDelegate { else { initializerText += rightText; } - initializerExpression = JavaPsiFacade.getElementFactory(project).createExpressionFromText(initializerText, var); + initializerExpression = JavaPsiFacade.getElementFactory(project).createExpressionFromText(initializerText, assignment); initializerExpression = (PsiExpression)CodeStyleManager.getInstance(project).reformat(initializerExpression); } catch (IncorrectOperationException e) { diff --git a/java/java-impl/src/com/intellij/codeInspection/RemoveAssignmentFix.java b/java/java-impl/src/com/intellij/codeInspection/RemoveAssignmentFix.java index 87c5a3ace5dd..d2d962623c7b 100644 --- a/java/java-impl/src/com/intellij/codeInspection/RemoveAssignmentFix.java +++ b/java/java-impl/src/com/intellij/codeInspection/RemoveAssignmentFix.java @@ -16,8 +16,10 @@ package com.intellij.codeInspection; import com.intellij.codeInsight.FileModificationService; +import com.intellij.codeInsight.editorActions.DeclarationJoinLinesHandler; import com.intellij.openapi.project.Project; import com.intellij.psi.*; +import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.NotNull; @@ -38,7 +40,12 @@ public class RemoveAssignmentFix extends RemoveInitializerFix { parent = element; } if (!(parent instanceof PsiAssignmentExpression)) return; - final PsiExpression rExpression = ((PsiAssignmentExpression)parent).getRExpression(); + final IElementType operationSign = ((PsiAssignmentExpression)parent).getOperationTokenType(); + PsiExpression rExpression = ((PsiAssignmentExpression)parent).getRExpression(); + if (JavaTokenType.EQ != operationSign && rExpression != null ) { + rExpression = DeclarationJoinLinesHandler.getInitializerExpression(((PsiAssignmentExpression)parent).getLExpression(), + (PsiAssignmentExpression)parent); + } final PsiElement gParent = parent.getParent(); if ((gParent instanceof PsiExpression || gParent instanceof PsiExpressionList || gParent instanceof PsiReturnStatement) && rExpression != null) { if (!FileModificationService.getInstance().prepareFileForWrite(gParent.getContainingFile())) return; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/afterAssignmentOperation.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/afterAssignmentOperation.java new file mode 100644 index 000000000000..4bc7ccb75bad --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/afterAssignmentOperation.java @@ -0,0 +1,10 @@ +// "Remove redundant assignment" "true" +class A { + public String getContexts(final String env) { + String contexts = "a"; + if ("dev".equals(env)) { + return contexts + ",b"; + } + return contexts; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/beforeAssignmentOperation.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/beforeAssignmentOperation.java new file mode 100644 index 000000000000..0fd309432830 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/beforeAssignmentOperation.java @@ -0,0 +1,10 @@ +// "Remove redundant assignment" "true" +class A { + public String getContexts(final String env) { + String contexts = "a"; + if ("dev".equals(env)) { + return contexts += ",b"; + } + return contexts; + } +} \ No newline at end of file