From c879fd36f96c4d769b9de8244ad8b3fb22958ea8 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 16 Aug 2021 19:01:34 +0200 Subject: [PATCH] convert to string literal: filter intentions when they were already added as compilation fixes GitOrigin-RevId: 32db7ed8885afc26ad1c5ebb928bec81066055ff --- .../impl/quickfix/ConvertToStringLiteralAction.java | 10 +--------- .../{NotAvailable.java => AvailableOnce.java} | 0 .../intention/ConvertToStringLiteralTest.java | 13 +++---------- .../intention/impl/CachedIntentions.java | 8 ++++++-- 4 files changed, 10 insertions(+), 21 deletions(-) rename java/java-tests/testData/codeInsight/convertToStringLiteral/{NotAvailable.java => AvailableOnce.java} (100%) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ConvertToStringLiteralAction.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ConvertToStringLiteralAction.java index ef26c83cef8f..5b1d5640410a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ConvertToStringLiteralAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ConvertToStringLiteralAction.java @@ -7,7 +7,6 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; -import com.intellij.psi.impl.source.tree.java.PsiLiteralExpressionImpl; import com.intellij.psi.util.PsiUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; @@ -28,14 +27,7 @@ public class ConvertToStringLiteralAction implements IntentionActionWithFixAllOp @Override public boolean isAvailable(@NotNull final Project project, final Editor editor, final PsiFile file) { final PsiElement element = file.findElementAt(editor.getCaretModel().getOffset()); - if (PsiUtil.isJavaToken(element, JavaTokenType.CHARACTER_LITERAL)) { - StringBuilder chars = new StringBuilder(); - String text = element.getText(); - return text.length() > 1 && - PsiLiteralExpressionImpl.parseStringCharacters(text.substring(1, text.length() - 1), chars, null) && - chars.length() == 1; - } - return false; + return PsiUtil.isJavaToken(element, JavaTokenType.CHARACTER_LITERAL); } @Override diff --git a/java/java-tests/testData/codeInsight/convertToStringLiteral/NotAvailable.java b/java/java-tests/testData/codeInsight/convertToStringLiteral/AvailableOnce.java similarity index 100% rename from java/java-tests/testData/codeInsight/convertToStringLiteral/NotAvailable.java rename to java/java-tests/testData/codeInsight/convertToStringLiteral/AvailableOnce.java diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/ConvertToStringLiteralTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/ConvertToStringLiteralTest.java index 8aa9a0d73edc..ffdb26ab80a8 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/ConvertToStringLiteralTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/ConvertToStringLiteralTest.java @@ -4,12 +4,9 @@ package com.intellij.java.codeInsight.intention; import com.intellij.JavaTestUtil; import com.intellij.codeInsight.daemon.QuickFixBundle; -import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.testFramework.fixtures.CodeInsightTestUtil; import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase; -import org.junit.Assert; - -import java.util.List; +import com.intellij.util.containers.ContainerUtil; public class ConvertToStringLiteralTest extends JavaCodeInsightFixtureTestCase { @@ -25,13 +22,9 @@ public class ConvertToStringLiteralTest extends JavaCodeInsightFixtureTestCase { CodeInsightTestUtil.doIntentionTest(myFixture, myIntention, "Simple.java", "Simple_after.java"); } - public void testNotAvailable() { + public void testAvailableOnce() { myFixture.configureByFile(getTestName(false) + ".java"); - List availableIntentions = myFixture.getAvailableIntentions(); - final IntentionAction intentionAction = CodeInsightTestUtil.findIntentionByText(availableIntentions, myIntention); - if (intentionAction != null) { - Assert.fail("Action found: " + myIntention); - } + assertSize(1, ContainerUtil.filter(myFixture.getAvailableIntentions(), a -> myIntention.equals(a.getText()))); } @Override diff --git a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/CachedIntentions.java b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/CachedIntentions.java index dcc81e434079..ca7c6d3c3369 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/CachedIntentions.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/CachedIntentions.java @@ -1,4 +1,4 @@ -// Copyright 2000-2021 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. +// Copyright 2000-2021 JetBrains s.r.o. and contributors. 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.daemon.impl.GutterIntentionAction; @@ -327,7 +327,11 @@ public final class CachedIntentions { public List getAllActions() { List result = new ArrayList<>(myErrorFixes); result.addAll(myInspectionFixes); - result.addAll(myIntentions); + for (IntentionActionWithTextCaching intention : myIntentions) { + if (!myErrorFixes.contains(intention)) { + result.add(intention); + } + } result.addAll(myGutters); result.addAll(myNotifications); result = DumbService.getInstance(myProject).filterByDumbAwareness(result);