From f4822d070aa23285a0055c191e2e7d152defae71 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 15 Oct 2021 18:36:22 +0200 Subject: [PATCH] refactorings: include additional information for refactoring helpers (IDEA-280046) in case of no actual usages, primary element may be the only source of cleanup GitOrigin-RevId: 5fe2045053a654f9675ce23ec499ed9889095d72 --- .../OptimizeImportsRefactoringHelper.java | 26 ++++++++----------- .../after/Foo.java | 2 -- .../after/pack1/A.java | 3 --- .../after/a/A.java | 2 +- .../renameClass/collision1/after/Test.java | 2 -- .../refactoring/BaseRefactoringProcessor.java | 7 +++-- .../refactoring/RefactoringHelper.java | 25 ++++++++++++++++-- .../after/javapackage.one/JavaClassOne.java | 3 --- .../after/javapackage.one/JavaClassOne.java | 3 --- .../after/javapackage.one/JavaClassOne.java | 2 -- .../after/javapackage.one/JavaClassOne.java | 1 - .../renameBoundField/after/UIClass.java | 2 +- .../renameBoundField/after/UIForm.form | 4 +-- .../renameBoundField/before/UIClass.java | 2 +- .../renameBoundField/before/UIForm.form | 4 +-- .../renameClass/after/NewClass.java | 2 +- .../renameClass/after/UIForm.form | 4 +-- .../renameClass/before/UIClass.java | 2 +- .../renameClass/before/UIForm.form | 4 +-- 19 files changed, 52 insertions(+), 48 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/OptimizeImportsRefactoringHelper.java b/java/java-impl/src/com/intellij/refactoring/OptimizeImportsRefactoringHelper.java index 4a5ef5371f44..df14959e4d75 100644 --- a/java/java-impl/src/com/intellij/refactoring/OptimizeImportsRefactoringHelper.java +++ b/java/java-impl/src/com/intellij/refactoring/OptimizeImportsRefactoringHelper.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-2009 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-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.refactoring; import com.intellij.java.refactoring.JavaRefactoringBundle; @@ -50,6 +36,16 @@ public class OptimizeImportsRefactoringHelper implements RefactoringHelper prepareOperation(UsageInfo @NotNull [] usages, @NotNull PsiElement primaryElement) { + Set files = prepareOperation(usages); + PsiFile containingFile = primaryElement.getContainingFile(); + if (containingFile instanceof PsiJavaFile) { + files.add((PsiJavaFile)containingFile); + } + return files; + } + @Override public void performOperation(@NotNull final Project project, final Set javaFiles) { CodeStyleManager.getInstance(project).performActionWithFormatterDisabled( diff --git a/java/java-tests/testData/refactoring/inlineMethod/multifile/decodeQualifierInMethodReference/after/Foo.java b/java/java-tests/testData/refactoring/inlineMethod/multifile/decodeQualifierInMethodReference/after/Foo.java index d442388bb9e4..59ed8da7b7ba 100644 --- a/java/java-tests/testData/refactoring/inlineMethod/multifile/decodeQualifierInMethodReference/after/Foo.java +++ b/java/java-tests/testData/refactoring/inlineMethod/multifile/decodeQualifierInMethodReference/after/Foo.java @@ -1,6 +1,4 @@ -import java.util.Map.Entry; -import java.util.Set; import java.util.function.Function; class Foo { diff --git a/java/java-tests/testData/refactoring/moveMembers/outerClassTypeParameters/after/pack1/A.java b/java/java-tests/testData/refactoring/moveMembers/outerClassTypeParameters/after/pack1/A.java index b53d354d83cf..46fc78fbbfbc 100644 --- a/java/java-tests/testData/refactoring/moveMembers/outerClassTypeParameters/after/pack1/A.java +++ b/java/java-tests/testData/refactoring/moveMembers/outerClassTypeParameters/after/pack1/A.java @@ -1,7 +1,4 @@ package pack1; -import java.util.ArrayList; -import java.util.List; - public class A { } \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/pushDown/staticImportsInsidePushedMethod/after/a/A.java b/java/java-tests/testData/refactoring/pushDown/staticImportsInsidePushedMethod/after/a/A.java index eb5ae9fe2af0..c9e70fd4826d 100644 --- a/java/java-tests/testData/refactoring/pushDown/staticImportsInsidePushedMethod/after/a/A.java +++ b/java/java-tests/testData/refactoring/pushDown/staticImportsInsidePushedMethod/after/a/A.java @@ -1,4 +1,4 @@ package a; -import static u.U.C; + public class A { } \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/renameClass/collision1/after/Test.java b/java/java-tests/testData/refactoring/renameClass/collision1/after/Test.java index 76fe07942fb6..7e60f4a14d61 100644 --- a/java/java-tests/testData/refactoring/renameClass/collision1/after/Test.java +++ b/java/java-tests/testData/refactoring/renameClass/collision1/after/Test.java @@ -1,5 +1,3 @@ -import java.io.*; - class Reader { java.io.Reader reader; // more code diff --git a/platform/lang-impl/src/com/intellij/refactoring/BaseRefactoringProcessor.java b/platform/lang-impl/src/com/intellij/refactoring/BaseRefactoringProcessor.java index 989b69843a0f..f30d4c82f8c3 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/BaseRefactoringProcessor.java +++ b/platform/lang-impl/src/com/intellij/refactoring/BaseRefactoringProcessor.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.refactoring; import com.intellij.codeInsight.actions.VcsFacade; @@ -502,8 +502,11 @@ public abstract class BaseRefactoringProcessor implements Runnable { myTransaction = listenerManager.startTransaction(); final Map preparedData = new LinkedHashMap<>(); final Runnable prepareHelpersRunnable = () -> { + RefactoringEventData data = ReadAction.compute(() -> getBeforeData()); + PsiElement primaryElement = data != null ? data.getUserData(RefactoringEventData.PSI_ELEMENT_KEY) : null; for (final RefactoringHelper helper : RefactoringHelper.EP_NAME.getExtensionList()) { - Object operation = ReadAction.compute(() -> helper.prepareOperation(writableUsageInfos)); + Object operation = ReadAction.compute(() -> primaryElement != null ? helper.prepareOperation(writableUsageInfos, primaryElement) + : helper.prepareOperation(writableUsageInfos)); preparedData.put(helper, operation); } }; diff --git a/platform/lang-impl/src/com/intellij/refactoring/RefactoringHelper.java b/platform/lang-impl/src/com/intellij/refactoring/RefactoringHelper.java index bb782a988c7a..7a94ec43d20a 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/RefactoringHelper.java +++ b/platform/lang-impl/src/com/intellij/refactoring/RefactoringHelper.java @@ -1,16 +1,37 @@ -// 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.refactoring; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiElement; import com.intellij.usageView.UsageInfo; import org.jetbrains.annotations.NotNull; - +/** + * Allows performing cleanup operations after refactoring is done e.g., optimize imports + */ public interface RefactoringHelper { ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.refactoring.helper"); + /** + * Is invoked in ReadAction under modal progress before refactoring is performed + * + * @return result of cleanup preparation so after refactoring is actually performed, {@link #performOperation(Project, Object)} could be executed + */ T prepareOperation(UsageInfo @NotNull [] usages); + + /** + * @param primaryElement represents the {@link BaseRefactoringProcessor#getBeforeData()}'s element which may be used in addition to {@code usages} + */ + default T prepareOperation(UsageInfo @NotNull [] usages, @NotNull PsiElement primaryElement) { + return prepareOperation(usages); + } + + /** + * Is invoked in EDT, without WriteAction after refactoring is performed + * + * Performs actual cleanup based on prepared data + */ void performOperation(@NotNull Project project, T operationData); } diff --git a/plugins/kotlin/idea/tests/testData/refactoring/inlineMultiFile/fromJavaToKotlin/complexJavaToKotlin/after/javapackage.one/JavaClassOne.java b/plugins/kotlin/idea/tests/testData/refactoring/inlineMultiFile/fromJavaToKotlin/complexJavaToKotlin/after/javapackage.one/JavaClassOne.java index 53f5022aae96..44de45d0e53f 100644 --- a/plugins/kotlin/idea/tests/testData/refactoring/inlineMultiFile/fromJavaToKotlin/complexJavaToKotlin/after/javapackage.one/JavaClassOne.java +++ b/plugins/kotlin/idea/tests/testData/refactoring/inlineMultiFile/fromJavaToKotlin/complexJavaToKotlin/after/javapackage.one/JavaClassOne.java @@ -1,8 +1,5 @@ package javapackage.one; -import usage.KotlinClassOne; -import usage.KotlinClassTwo; - public class JavaClassOne { public int field = MAGIC_CONST; diff --git a/plugins/kotlin/idea/tests/testData/refactoring/inlineMultiFile/fromJavaToKotlin/complexJavaToKotlin2/after/javapackage.one/JavaClassOne.java b/plugins/kotlin/idea/tests/testData/refactoring/inlineMultiFile/fromJavaToKotlin/complexJavaToKotlin2/after/javapackage.one/JavaClassOne.java index 53f5022aae96..44de45d0e53f 100644 --- a/plugins/kotlin/idea/tests/testData/refactoring/inlineMultiFile/fromJavaToKotlin/complexJavaToKotlin2/after/javapackage.one/JavaClassOne.java +++ b/plugins/kotlin/idea/tests/testData/refactoring/inlineMultiFile/fromJavaToKotlin/complexJavaToKotlin2/after/javapackage.one/JavaClassOne.java @@ -1,8 +1,5 @@ package javapackage.one; -import usage.KotlinClassOne; -import usage.KotlinClassTwo; - public class JavaClassOne { public int field = MAGIC_CONST; diff --git a/plugins/kotlin/idea/tests/testData/refactoring/inlineMultiFile/fromJavaToKotlin/delegateToCallChain/after/javapackage.one/JavaClassOne.java b/plugins/kotlin/idea/tests/testData/refactoring/inlineMultiFile/fromJavaToKotlin/delegateToCallChain/after/javapackage.one/JavaClassOne.java index 51efd1cab538..1fb80c7eb053 100644 --- a/plugins/kotlin/idea/tests/testData/refactoring/inlineMultiFile/fromJavaToKotlin/delegateToCallChain/after/javapackage.one/JavaClassOne.java +++ b/plugins/kotlin/idea/tests/testData/refactoring/inlineMultiFile/fromJavaToKotlin/delegateToCallChain/after/javapackage.one/JavaClassOne.java @@ -1,8 +1,6 @@ package javapackage.one; import javapackage.two.JavaClassTwo; -import kotlinpackage.one.KotlinClassOneKt; -import kotlinpackage.two.KotlinClassTwoKt; public class JavaClassOne { diff --git a/plugins/kotlin/idea/tests/testData/refactoring/inlineMultiFile/fromJavaToKotlin/inheritance/after/javapackage.one/JavaClassOne.java b/plugins/kotlin/idea/tests/testData/refactoring/inlineMultiFile/fromJavaToKotlin/inheritance/after/javapackage.one/JavaClassOne.java index e40cff56da4b..0e4e77e01ec8 100644 --- a/plugins/kotlin/idea/tests/testData/refactoring/inlineMultiFile/fromJavaToKotlin/inheritance/after/javapackage.one/JavaClassOne.java +++ b/plugins/kotlin/idea/tests/testData/refactoring/inlineMultiFile/fromJavaToKotlin/inheritance/after/javapackage.one/JavaClassOne.java @@ -1,7 +1,6 @@ package javapackage.one; import javapackage.two.JavaClassTwo; -import kotlinpackage.one.KotlinClassOneKt; import parentpack.JavaParent; public class JavaClassOne extends JavaParent { diff --git a/plugins/ui-designer/testData/renameUIRelated/renameBoundField/after/UIClass.java b/plugins/ui-designer/testData/renameUIRelated/renameBoundField/after/UIClass.java index 9c0723b41fa9..0f5753e6aced 100644 --- a/plugins/ui-designer/testData/renameUIRelated/renameBoundField/after/UIClass.java +++ b/plugins/ui-designer/testData/renameUIRelated/renameBoundField/after/UIClass.java @@ -16,5 +16,5 @@ import javax.swing.*; public class UIClass { - private JCheckBox OtherName; + private JButton OtherName; } \ No newline at end of file diff --git a/plugins/ui-designer/testData/renameUIRelated/renameBoundField/after/UIForm.form b/plugins/ui-designer/testData/renameUIRelated/renameBoundField/after/UIForm.form index feb489ab4901..dab6a1d57d0a 100644 --- a/plugins/ui-designer/testData/renameUIRelated/renameBoundField/after/UIForm.form +++ b/plugins/ui-designer/testData/renameUIRelated/renameBoundField/after/UIForm.form @@ -8,12 +8,12 @@ - + - + diff --git a/plugins/ui-designer/testData/renameUIRelated/renameBoundField/before/UIClass.java b/plugins/ui-designer/testData/renameUIRelated/renameBoundField/before/UIClass.java index b0e10dd47367..7ac4af169558 100644 --- a/plugins/ui-designer/testData/renameUIRelated/renameBoundField/before/UIClass.java +++ b/plugins/ui-designer/testData/renameUIRelated/renameBoundField/before/UIClass.java @@ -16,5 +16,5 @@ import javax.swing.*; public class UIClass { - private JCheckBox UIField; + private JButton UIField; } \ No newline at end of file diff --git a/plugins/ui-designer/testData/renameUIRelated/renameBoundField/before/UIForm.form b/plugins/ui-designer/testData/renameUIRelated/renameBoundField/before/UIForm.form index 5794eb1d9f60..01ea39b6a8c0 100644 --- a/plugins/ui-designer/testData/renameUIRelated/renameBoundField/before/UIForm.form +++ b/plugins/ui-designer/testData/renameUIRelated/renameBoundField/before/UIForm.form @@ -8,12 +8,12 @@ - + - + diff --git a/plugins/ui-designer/testData/renameUIRelated/renameClass/after/NewClass.java b/plugins/ui-designer/testData/renameUIRelated/renameClass/after/NewClass.java index 0d72638d2498..a5635464aa16 100644 --- a/plugins/ui-designer/testData/renameUIRelated/renameClass/after/NewClass.java +++ b/plugins/ui-designer/testData/renameUIRelated/renameClass/after/NewClass.java @@ -1,5 +1,5 @@ import javax.swing.*; public class NewClass { - private JCheckBox UIField; + private JButton UIField; } \ No newline at end of file diff --git a/plugins/ui-designer/testData/renameUIRelated/renameClass/after/UIForm.form b/plugins/ui-designer/testData/renameUIRelated/renameClass/after/UIForm.form index 131ac8bbc0b6..62cd219cafef 100644 --- a/plugins/ui-designer/testData/renameUIRelated/renameClass/after/UIForm.form +++ b/plugins/ui-designer/testData/renameUIRelated/renameClass/after/UIForm.form @@ -8,12 +8,12 @@ - + - + diff --git a/plugins/ui-designer/testData/renameUIRelated/renameClass/before/UIClass.java b/plugins/ui-designer/testData/renameUIRelated/renameClass/before/UIClass.java index 2ce6cfb8dfbe..511544012a7b 100644 --- a/plugins/ui-designer/testData/renameUIRelated/renameClass/before/UIClass.java +++ b/plugins/ui-designer/testData/renameUIRelated/renameClass/before/UIClass.java @@ -1,5 +1,5 @@ import javax.swing.*; public class UIClass { - private JCheckBox UIField; + private JButton UIField; } \ No newline at end of file diff --git a/plugins/ui-designer/testData/renameUIRelated/renameClass/before/UIForm.form b/plugins/ui-designer/testData/renameUIRelated/renameClass/before/UIForm.form index 5794eb1d9f60..01ea39b6a8c0 100644 --- a/plugins/ui-designer/testData/renameUIRelated/renameClass/before/UIForm.form +++ b/plugins/ui-designer/testData/renameUIRelated/renameClass/before/UIForm.form @@ -8,12 +8,12 @@ - + - +