diff --git a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java index 2d30926dcc2c..4d812842b81a 100644 --- a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java @@ -33,6 +33,7 @@ import com.intellij.psi.scope.util.PsiScopesUtil; import com.intellij.psi.util.*; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.rename.RenameUtil; +import com.intellij.refactoring.rename.ResolveSnapshotProvider; import com.intellij.refactoring.util.*; import com.intellij.refactoring.util.usageInfo.DefaultConstructorImplicitUsageInfo; import com.intellij.refactoring.util.usageInfo.NoConstructorClassUsageInfo; @@ -604,6 +605,18 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr return true; } + @Override + public void registerConflictResolvers(List snapshots, + @NotNull ResolveSnapshotProvider resolveSnapshotProvider, + UsageInfo[] usages, ChangeInfo changeInfo) { + snapshots.add(resolveSnapshotProvider.createSnapshot(changeInfo.getMethod())); + for (UsageInfo usage : usages) { + if (usage instanceof OverriderUsageInfo) { + snapshots.add(resolveSnapshotProvider.createSnapshot(usage.getElement())); + } + } + } + private static boolean needDefaultValue(ChangeInfo changeInfo, PsiMethod method) { return !(changeInfo instanceof JavaChangeInfoImpl) || !((JavaChangeInfoImpl)changeInfo).propagateParametersMethods.contains(method); diff --git a/java/java-impl/src/com/intellij/refactoring/introduceVariable/JavaVariableInplaceIntroducer.java b/java/java-impl/src/com/intellij/refactoring/introduceVariable/JavaVariableInplaceIntroducer.java index efce925c99b8..eb5938ce3c66 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceVariable/JavaVariableInplaceIntroducer.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceVariable/JavaVariableInplaceIntroducer.java @@ -38,7 +38,7 @@ import com.intellij.psi.util.TypeConversionUtil; import com.intellij.refactoring.JavaRefactoringSettings; import com.intellij.refactoring.introduce.inplace.InplaceVariableIntroducer; import com.intellij.refactoring.introduceParameter.AbstractJavaInplaceIntroducer; -import com.intellij.refactoring.rename.inplace.ResolveSnapshotProvider; +import com.intellij.refactoring.rename.ResolveSnapshotProvider; import com.intellij.refactoring.rename.inplace.VariableInplaceRenamer; import com.intellij.refactoring.ui.TypeSelectorManagerImpl; import com.intellij.ui.NonFocusableCheckBox; diff --git a/java/java-impl/src/com/intellij/refactoring/rename/inplace/JavaResolveSnapshot.java b/java/java-impl/src/com/intellij/refactoring/rename/inplace/JavaResolveSnapshot.java index bd1c657d813f..2eb97dac7918 100644 --- a/java/java-impl/src/com/intellij/refactoring/rename/inplace/JavaResolveSnapshot.java +++ b/java/java-impl/src/com/intellij/refactoring/rename/inplace/JavaResolveSnapshot.java @@ -19,12 +19,9 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.project.Project; import com.intellij.psi.*; -import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.rename.RenameJavaMemberProcessor; -import com.intellij.refactoring.util.RefactoringUtil; -import com.intellij.util.IncorrectOperationException; +import com.intellij.refactoring.rename.ResolveSnapshotProvider; import com.intellij.util.containers.HashMap; -import org.jetbrains.annotations.NonNls; import java.util.Map; diff --git a/java/java-impl/src/com/intellij/refactoring/rename/inplace/JavaResolveSnapshotProvider.java b/java/java-impl/src/com/intellij/refactoring/rename/inplace/JavaResolveSnapshotProvider.java index 47b9c22e77c9..edb185b966bf 100644 --- a/java/java-impl/src/com/intellij/refactoring/rename/inplace/JavaResolveSnapshotProvider.java +++ b/java/java-impl/src/com/intellij/refactoring/rename/inplace/JavaResolveSnapshotProvider.java @@ -16,6 +16,7 @@ package com.intellij.refactoring.rename.inplace; import com.intellij.psi.PsiElement; +import com.intellij.refactoring.rename.ResolveSnapshotProvider; /** * User: Maxim.Mossienko diff --git a/java/java-tests/testData/refactoring/changeSignature/ParamNameSameAsFieldName.java b/java/java-tests/testData/refactoring/changeSignature/ParamNameSameAsFieldName.java new file mode 100644 index 000000000000..f064d1a03120 --- /dev/null +++ b/java/java-tests/testData/refactoring/changeSignature/ParamNameSameAsFieldName.java @@ -0,0 +1,13 @@ +class Test { + int fieldName; + + void foo(int name) { + fieldName = name; + } +} + +class TestImpl extends Test { + void foo(int name) { + fieldName = name; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/changeSignature/ParamNameSameAsFieldName_after.java b/java/java-tests/testData/refactoring/changeSignature/ParamNameSameAsFieldName_after.java new file mode 100644 index 000000000000..4a7a1ac744a0 --- /dev/null +++ b/java/java-tests/testData/refactoring/changeSignature/ParamNameSameAsFieldName_after.java @@ -0,0 +1,13 @@ +class Test { + int fieldName; + + void foo(int fieldName) { + this.fieldName = fieldName; + } +} + +class TestImpl extends Test { + void foo(int fieldName) { + this.fieldName = fieldName; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignatureTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignatureTest.java index b2ae1b19db2f..6519401d4092 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignatureTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignatureTest.java @@ -135,6 +135,12 @@ public class ChangeSignatureTest extends LightRefactoringTestCase { }, false); } + public void testParamNameSameAsFieldName() throws Exception { + doTest(null, new ParameterInfoImpl[] { + new ParameterInfoImpl(0, "fieldName", PsiType.INT) + }, false); + } + public void testParamNameNoConflict() throws Exception { doTest(null, new ParameterInfoImpl[]{ new ParameterInfoImpl(0), diff --git a/platform/lang-api/src/com/intellij/refactoring/changeSignature/ChangeSignatureUsageProcessor.java b/platform/lang-api/src/com/intellij/refactoring/changeSignature/ChangeSignatureUsageProcessor.java index 99fd6956efe8..d0db3a9bf87c 100644 --- a/platform/lang-api/src/com/intellij/refactoring/changeSignature/ChangeSignatureUsageProcessor.java +++ b/platform/lang-api/src/com/intellij/refactoring/changeSignature/ChangeSignatureUsageProcessor.java @@ -19,8 +19,12 @@ import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Ref; import com.intellij.psi.PsiElement; +import com.intellij.refactoring.rename.ResolveSnapshotProvider; import com.intellij.usageView.UsageInfo; import com.intellij.util.containers.MultiMap; +import org.jetbrains.annotations.NotNull; + +import java.util.List; /** * @author Maxim.Medvedev @@ -40,4 +44,9 @@ public interface ChangeSignatureUsageProcessor { boolean shouldPreviewUsages(ChangeInfo changeInfo, UsageInfo[] usages); boolean setupDefaultValues(ChangeInfo changeInfo, Ref refUsages, Project project); + + void registerConflictResolvers(List snapshots, + @NotNull ResolveSnapshotProvider resolveSnapshotProvider, + UsageInfo[] usages, + ChangeInfo changeInfo); } diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/ResolveSnapshotProvider.java b/platform/lang-api/src/com/intellij/refactoring/rename/ResolveSnapshotProvider.java similarity index 94% rename from platform/lang-impl/src/com/intellij/refactoring/rename/inplace/ResolveSnapshotProvider.java rename to platform/lang-api/src/com/intellij/refactoring/rename/ResolveSnapshotProvider.java index 427bd9b8c114..b421a91b3387 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/ResolveSnapshotProvider.java +++ b/platform/lang-api/src/com/intellij/refactoring/rename/ResolveSnapshotProvider.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.intellij.refactoring.rename.inplace; +package com.intellij.refactoring.rename; import com.intellij.psi.PsiElement; diff --git a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureProcessorBase.java b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureProcessorBase.java index 3291a03c571e..8956458d4eb0 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureProcessorBase.java +++ b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureProcessorBase.java @@ -28,6 +28,8 @@ import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.listeners.RefactoringElementListener; import com.intellij.refactoring.listeners.UndoRefactoringElementListener; import com.intellij.refactoring.listeners.impl.RefactoringTransaction; +import com.intellij.refactoring.rename.ResolveSnapshotProvider; +import com.intellij.refactoring.rename.inplace.VariableInplaceRenamer; import com.intellij.refactoring.util.MoveRenameUsageInfo; import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageViewUtil; @@ -131,13 +133,24 @@ public abstract class ChangeSignatureProcessorBase extends BaseRefactoringProces try { final ChangeSignatureUsageProcessor[] processors = ChangeSignatureUsageProcessor.EP_NAME.getExtensions(); + final PsiElement method = myChangeInfo.getMethod(); + final ResolveSnapshotProvider resolveSnapshotProvider = myChangeInfo.isParameterNamesChanged() + ? VariableInplaceRenamer.INSTANCE.forLanguage(method.getLanguage()) + : null; + final List snapshots = new ArrayList(); + for (ChangeSignatureUsageProcessor processor : processors) { + if (resolveSnapshotProvider != null) { + processor.registerConflictResolvers(snapshots, resolveSnapshotProvider, usages, myChangeInfo); + } + } + for (UsageInfo usage : usages) { for (ChangeSignatureUsageProcessor processor : processors) { if (processor.processUsage(myChangeInfo, usage, true, usages)) break; } } - LOG.assertTrue(myChangeInfo.getMethod().isValid()); + LOG.assertTrue(method.isValid()); for (ChangeSignatureUsageProcessor processor : processors) { if (processor.processPrimaryMethod(myChangeInfo)) break; } @@ -148,7 +161,13 @@ public abstract class ChangeSignatureProcessorBase extends BaseRefactoringProces } } - final PsiElement method = myChangeInfo.getMethod(); + if (!snapshots.isEmpty()) { + for (ParameterInfo parameterInfo : myChangeInfo.getNewParameters()) { + for (ResolveSnapshotProvider.ResolveSnapshot snapshot : snapshots) { + snapshot.apply(parameterInfo.getName()); + } + } + } LOG.assertTrue(method.isValid()); if (elementListener != null && myChangeInfo.isNameChanged()) { elementListener.elementRenamed(method); diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/VariableInplaceRenamer.java b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/VariableInplaceRenamer.java index 296020503f4e..d1a8c94f1064 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/VariableInplaceRenamer.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/VariableInplaceRenamer.java @@ -38,10 +38,7 @@ import com.intellij.psi.util.PsiUtilCore; import com.intellij.refactoring.RefactoringActionHandler; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.listeners.RefactoringElementListener; -import com.intellij.refactoring.rename.AutomaticRenamingDialog; -import com.intellij.refactoring.rename.RenameHandlerRegistry; -import com.intellij.refactoring.rename.RenameProcessor; -import com.intellij.refactoring.rename.RenameUtil; +import com.intellij.refactoring.rename.*; import com.intellij.refactoring.rename.naming.AutomaticRenamer; import com.intellij.refactoring.rename.naming.AutomaticRenamerFactory; import com.intellij.refactoring.util.CommonRefactoringUtil; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrChangeSignatureUsageProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrChangeSignatureUsageProcessor.java index 9b05f52f589f..d2ad65f1c072 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrChangeSignatureUsageProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrChangeSignatureUsageProcessor.java @@ -28,6 +28,7 @@ import com.intellij.psi.impl.source.tree.SharedImplUtil; import com.intellij.psi.scope.processor.VariablesProcessor; import com.intellij.psi.util.*; import com.intellij.refactoring.changeSignature.*; +import com.intellij.refactoring.rename.ResolveSnapshotProvider; import com.intellij.refactoring.util.CanonicalTypes; import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.refactoring.util.usageInfo.DefaultConstructorImplicitUsageInfo; @@ -169,6 +170,12 @@ public class GrChangeSignatureUsageProcessor implements ChangeSignatureUsageProc return true; } + @Override + public void registerConflictResolvers(List snapshots, + @NotNull ResolveSnapshotProvider resolveSnapshotProvider, + UsageInfo[] usages, ChangeInfo changeInfo) { + } + private static boolean generateDelegate(GrChangeInfoImpl grInfo) { final GrMethod method = grInfo.getMethod(); final PsiClass psiClass = method.getContainingClass(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/rename/inplace/GroovyResolveSnapshot.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/rename/inplace/GroovyResolveSnapshot.java index 4501063da4bf..c38bb9d7b9b9 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/rename/inplace/GroovyResolveSnapshot.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/rename/inplace/GroovyResolveSnapshot.java @@ -22,7 +22,7 @@ import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.SmartPointerManager; import com.intellij.psi.SmartPsiElementPointer; -import com.intellij.refactoring.rename.inplace.ResolveSnapshotProvider; +import com.intellij.refactoring.rename.ResolveSnapshotProvider; import com.intellij.util.containers.HashMap; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementVisitor; import org.jetbrains.plugins.groovy.lang.psi.GroovyRecursiveElementVisitor; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/rename/inplace/GroovyResolveSnapshotProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/rename/inplace/GroovyResolveSnapshotProvider.java index f836181cdc47..155224659f48 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/rename/inplace/GroovyResolveSnapshotProvider.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/rename/inplace/GroovyResolveSnapshotProvider.java @@ -16,7 +16,7 @@ package org.jetbrains.plugins.groovy.refactoring.rename.inplace; import com.intellij.psi.PsiElement; -import com.intellij.refactoring.rename.inplace.ResolveSnapshotProvider; +import com.intellij.refactoring.rename.ResolveSnapshotProvider; /** * @author Maxim.Medvedev