From a4a30a9c0c174cd6f0627c3fb5f83d7d97c14231 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Sun, 4 Feb 2018 20:21:26 +0100 Subject: [PATCH] don't drop comment inside condition on inverting if --- .../impl/InvertIfConditionAction.java | 29 +++++-------------- .../afterCommentInsideCondition.java | 12 ++++++++ .../beforeCommentInsideCondition.java | 11 +++++++ 3 files changed, 30 insertions(+), 22 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/invertIfCondition/afterCommentInsideCondition.java create mode 100644 java/java-tests/testData/codeInsight/invertIfCondition/beforeCommentInsideCondition.java diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/InvertIfConditionAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/InvertIfConditionAction.java index bc9e5651055c..4bfed8eb99ac 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/InvertIfConditionAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/InvertIfConditionAction.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-2017 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. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.codeInsight.intention.impl; import com.intellij.codeInsight.CodeInsightBundle; @@ -86,16 +72,15 @@ public class InvertIfConditionAction extends PsiElementBaseIntentionAction { LOG.assertTrue(ifStatement != null); PsiElement block = findCodeBlock(ifStatement); - + LOG.assertTrue(block != null); ControlFlow controlFlow = buildControlFlow(block); - - PsiExpression condition = (PsiExpression) Objects.requireNonNull(ifStatement.getCondition()).copy(); - ifStatement = setupBranches(ifStatement, controlFlow); + + PsiExpression condition = Objects.requireNonNull(ifStatement.getCondition()); if (condition != null) { - PsiExpression negatedExpression = - JavaPsiFacade.getElementFactory(project).createExpressionFromText(BoolUtils.getNegatedExpressionText(condition), condition); - Objects.requireNonNull(ifStatement.getCondition()).replace(negatedExpression); + final CommentTracker tracker = new CommentTracker(); + final String negatedCondition = BoolUtils.getNegatedExpressionText(condition, tracker); + tracker.replaceAndRestoreComments(condition, negatedCondition); } formatIf(ifStatement); diff --git a/java/java-tests/testData/codeInsight/invertIfCondition/afterCommentInsideCondition.java b/java/java-tests/testData/codeInsight/invertIfCondition/afterCommentInsideCondition.java new file mode 100644 index 000000000000..2c96aec0f820 --- /dev/null +++ b/java/java-tests/testData/codeInsight/invertIfCondition/afterCommentInsideCondition.java @@ -0,0 +1,12 @@ +// "Invert 'if' condition" "true" +class A { + public void foo() { + //comment + if (1 != 2) { + System.out.println("false"); + } + else { + System.out.println("true"); +} + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/invertIfCondition/beforeCommentInsideCondition.java b/java/java-tests/testData/codeInsight/invertIfCondition/beforeCommentInsideCondition.java new file mode 100644 index 000000000000..eba9bf063fc9 --- /dev/null +++ b/java/java-tests/testData/codeInsight/invertIfCondition/beforeCommentInsideCondition.java @@ -0,0 +1,11 @@ +// "Invert 'if' condition" "true" +class A { + public void foo() { + if (1 //comment + == 2) { + System.out.println("true"); + } else { + System.out.println("false"); + } + } +} \ No newline at end of file