diff --git a/java/java-impl/src/com/intellij/codeInspection/intermediaryVariable/ReturnSeparatedFromComputationInspection.java b/java/java-impl/src/com/intellij/codeInspection/intermediaryVariable/ReturnSeparatedFromComputationInspection.java index 6383ebb8708f..7eee165bdc95 100644 --- a/java/java-impl/src/com/intellij/codeInspection/intermediaryVariable/ReturnSeparatedFromComputationInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/intermediaryVariable/ReturnSeparatedFromComputationInspection.java @@ -18,7 +18,6 @@ package com.intellij.codeInspection.intermediaryVariable; import com.intellij.codeInspection.*; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.controlFlow.*; @@ -218,7 +217,7 @@ public class ReturnSeparatedFromComputationInspection extends BaseJavaBatchLocal inlineAssignment((PsiAssignmentExpression)e, context.returnStatement); } }); - mover.removeCompletely.forEach(e -> removeElementKeepComment(e)); + mover.removeCompletely.forEach(e -> removeElementKeepComments(e)); if (removeReturn) { removeReturn(context); } @@ -228,7 +227,7 @@ public class ReturnSeparatedFromComputationInspection extends BaseJavaBatchLocal Set skippedEmptyStatements = new THashSet<>(); getPrevNonEmptyStatement(context.returnStatement, skippedEmptyStatements); skippedEmptyStatements.forEach(PsiElement::delete); - removeElementKeepComment(context.returnStatement); + removeElementKeepComments(context.returnStatement); } private static void inlineAssignment(PsiAssignmentExpression assignmentExpression, PsiReturnStatement returnStatement) { @@ -244,25 +243,14 @@ public class ReturnSeparatedFromComputationInspection extends BaseJavaBatchLocal } private static void replaceStatementKeepComments(PsiStatement replacedStatement, PsiReturnStatement returnStatement) { - List keptComments = new ArrayList<>(); - for (PsiElement element = replacedStatement.getFirstChild(); element != null; element = element.getNextSibling()) { - if (element instanceof PsiComment) { - keptComments.add((PsiComment)element); - } - } + List keptComments = getComments(replacedStatement); if (!keptComments.isEmpty()) { returnStatement = (PsiReturnStatement)returnStatement.copy(); PsiElement lastReturnChild = returnStatement.getLastChild(); Project project = returnStatement.getProject(); PsiParserFacade parserFacade = PsiParserFacade.SERVICE.getInstance(project); PsiElementFactory elementFactory = JavaPsiFacade.getInstance(project).getElementFactory(); - if (lastReturnChild instanceof PsiComment && ((PsiComment)lastReturnChild).getTokenType() == JavaTokenType.END_OF_LINE_COMMENT) { - String commentText = StringUtil.trimStart(lastReturnChild.getText(), "//"); - PsiComment inlineComment = elementFactory.createCommentFromText("/* " + commentText + " */", returnStatement); - lastReturnChild = lastReturnChild.replace(inlineComment); - } for (PsiComment comment : keptComments) { - lastReturnChild = returnStatement.addAfter(parserFacade.createWhiteSpaceFromText(" "), lastReturnChild); lastReturnChild = returnStatement.addAfter(comment, lastReturnChild); } CodeStyleManager.getInstance(project).reformat(returnStatement, true); @@ -270,22 +258,38 @@ public class ReturnSeparatedFromComputationInspection extends BaseJavaBatchLocal replacedStatement.replace(returnStatement); } - private static void removeElementKeepComment(PsiElement element) { - PsiComment comment = null; - for (PsiElement child = element.getLastChild(); child != null; child = child.getPrevSibling()) { - if (child instanceof PsiComment) { - comment = (PsiComment)child; - break; + private static void removeElementKeepComments(PsiElement removedElement) { + List keptComments = getComments(removedElement); + if (!keptComments.isEmpty()) { + PsiComment firstComment = keptComments.get(0); + PsiElement lastComment = removedElement.replace(firstComment); + PsiElement parent = lastComment.getParent(); + Project project = parent.getProject(); + CodeStyleManager styleManager = CodeStyleManager.getInstance(project); + styleManager.reformat(lastComment, true); + if (keptComments.size() > 1) { + for (PsiComment comment : keptComments.subList(1, keptComments.size())) { + lastComment = parent.addAfter(comment, lastComment); + styleManager.reformat(lastComment, true); + } } } - if (comment != null) { - element.replace(comment); - } else { - element.delete(); + removedElement.delete(); } } + private static List getComments(PsiElement commentedElement) { + final List comments = new ArrayList<>(); + commentedElement.accept(new JavaRecursiveElementVisitor() { + @Override + public void visitComment(PsiComment comment) { + comments.add(comment); + } + }); + return comments; + } + private static class Mover { final ControlFlow flow; final PsiStatement enclosingStatement; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterForBreakComment.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterForBreakComment.java index cb2bb8f2d7fe..e5d5c26a1f0f 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterForBreakComment.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterForBreakComment.java @@ -5,13 +5,13 @@ class T { for (int i=0; i 100) { - return n; // at the end 1 + return /* return 1 */ n /* return 2 */;// at the end 1 } if (n < 0) { - return 0; // at the end 2 + return /* return 1 */ 0 /* return 2 */;// at the end 2 /* inline */ } } - return n; + return /* return 1 */ n /* return 2 */; } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfComment.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfComment.java index 9fa3c26e66c9..15a8019ae6a3 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfComment.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfComment.java @@ -3,13 +3,16 @@ class T { String f(String a) { String s = a; if (s == null) { - return ""; /* return comment */ // end of line + return ""; // return comment + // end of line } else if (s.startsWith("@")) { return s.substring(1); // return comment + /* inline 1 *//* inline 2 */ } else if (s.startsWith("#")) { - return "#"; /* return comment */ /* inline */ + return "#"; // return comment + /* inline */ } return s; // return comment } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterLabeledFor4.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterLabeledFor4.java index fe3f5b91e728..1a27abfe6ad7 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterLabeledFor4.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterLabeledFor4.java @@ -3,15 +3,15 @@ class T { int f(int[][] a) { int n = -1; myLabel: - for (int i = 0; i < a.length; i++) { - if (a[i].length == 0) { - return -i - 1; - } - for(int j = 0; j < a[i].length; j++) { - n = j; - if (a[i][j] == 0) return n; - } - } - return n; + for (int i = 0; i < a.length; i++) { + if (a[i].length == 0) { + return -i - 1; + } + for(int j = 0; j < a[i].length; j++) { + n = j; + if (a[i][j] == 0) return n; + } + } + return n; } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeForBreakComment.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeForBreakComment.java index c0a26870bf70..3e9a1ee5274c 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeForBreakComment.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeForBreakComment.java @@ -12,6 +12,6 @@ class T { break; /* inline */ } } - return n; + return /* return 1 */ n /* return 2 */; } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeIfComment.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeIfComment.java index 54c383287c4f..6b183dff2603 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeIfComment.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeIfComment.java @@ -6,7 +6,7 @@ class T { s = ""; // end of line } else if (s.startsWith("@")) { - s = s.substring(1); + s = /* inline 1 */ s.substring(1); /* inline 2 */ } else if (s.startsWith("#")) { s = "#"; /* inline */ diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeLabeledFor4.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeLabeledFor4.java index f7ea90db3b3f..29101b43b53f 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeLabeledFor4.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeLabeledFor4.java @@ -3,16 +3,16 @@ class T { int f(int[][] a) { int n = -1; myLabel: - for (int i = 0; i < a.length; i++) { - if (a[i].length == 0) { - n = -i - 1; - break myLabel; - } - for(int j = 0; j < a[i].length; j++) { - n = j; - if (a[i][j] == 0) break myLabel; - } - } - return n; + for (int i = 0; i < a.length; i++) { + if (a[i].length == 0) { + n = -i - 1; + break myLabel; + } + for(int j = 0; j < a[i].length; j++) { + n = j; + if (a[i][j] == 0) break myLabel; + } + } + return n; } }