diff --git a/java/java-impl-refactorings/src/com/intellij/refactoring/rename/RenameJavaMemberProcessor.java b/java/java-impl-refactorings/src/com/intellij/refactoring/rename/RenameJavaMemberProcessor.java index 5bd6a0c235a8..3d71a1543f6e 100644 --- a/java/java-impl-refactorings/src/com/intellij/refactoring/rename/RenameJavaMemberProcessor.java +++ b/java/java-impl-refactorings/src/com/intellij/refactoring/rename/RenameJavaMemberProcessor.java @@ -1,9 +1,9 @@ -// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.refactoring.rename; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; +import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.InheritanceUtil; @@ -19,8 +19,6 @@ import java.util.Set; public abstract class RenameJavaMemberProcessor extends RenamePsiElementProcessor { - private static final Logger LOG = Logger.getInstance(RenameJavaMemberProcessor.class); - public static void qualifyMember(PsiMember member, PsiElement occurence, String newName) throws IncorrectOperationException { final PsiClass containingClass = member.getContainingClass(); if (containingClass != null) { @@ -123,10 +121,11 @@ public abstract class RenameJavaMemberProcessor extends RenamePsiElementProcesso protected static void qualifyOuterMemberReferences(final List outerHides) throws IncorrectOperationException { for (MemberHidesOuterMemberUsageInfo usage : outerHides) { final PsiElement element = usage.getElement(); - PsiJavaCodeReferenceElement collidingRef = (PsiJavaCodeReferenceElement)element; + if (element == null) continue; PsiMember member = (PsiMember)usage.getReferencedElement(); - PsiReferenceExpression ref = createMemberReference(member, collidingRef); - collidingRef.replace(ref); + if (member == null) continue; + PsiReference reference = element.getReference(); + if (reference != null) JavaCodeStyleManager.getInstance(element.getProject()).shortenClassReferences(reference.bindToElement(member)); } } diff --git a/java/java-impl-refactorings/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java b/java/java-impl-refactorings/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java index 94f348569e06..bf2a0172aa0c 100644 --- a/java/java-impl-refactorings/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java +++ b/java/java-impl-refactorings/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java @@ -1,4 +1,4 @@ -// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.refactoring.rename; import com.intellij.codeInsight.AnnotationUtil; @@ -70,8 +70,9 @@ public class RenameJavaMethodProcessor extends RenameJavaMemberProcessor { if (usage instanceof MemberHidesStaticImportUsageInfo) { staticImportHides.add((MemberHidesStaticImportUsageInfo)usage); } else if (usage instanceof MemberHidesOuterMemberUsageInfo) { - PsiJavaCodeReferenceElement collidingRef = (PsiJavaCodeReferenceElement)element; - PsiMethod resolved = (PsiMethod)collidingRef.resolve(); + PsiReference reference = element.getReference(); + if (reference == null) continue; + PsiMethod resolved = (PsiMethod)reference.resolve(); outerHides.add(new MemberHidesOuterMemberUsageInfo(element, resolved)); } else if (!(element instanceof PsiMethod overrider)) { diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/javadoc/PsiDocMethodOrFieldRef.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/javadoc/PsiDocMethodOrFieldRef.java index c4d14e17a69b..bcb5ffca3788 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/javadoc/PsiDocMethodOrFieldRef.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/javadoc/PsiDocMethodOrFieldRef.java @@ -335,13 +335,11 @@ public class PsiDocMethodOrFieldRef extends CompositePsiElement implements PsiDo ((PsiJavaCodeReferenceElement)ref).bindToElement(containingClass); } } - else { - if (containingClass != null && !PsiTreeUtil.isAncestor(containingClass, PsiDocMethodOrFieldRef.this, true)) { - PsiDocComment fromText = JavaPsiFacade.getElementFactory(containingClass.getProject()) - .createDocCommentFromText("/**{@link " + containingClass.getQualifiedName() + "#" + newName + "}*/"); - PsiDocMethodOrFieldRef methodOrFieldRefFromText = PsiTreeUtil.findChildOfType(fromText, PsiDocMethodOrFieldRef.class); - addAfter(Objects.requireNonNull(methodOrFieldRefFromText).getFirstChild(), null); - } + else if (containingClass != null && PsiTreeUtil.getParentOfType(PsiDocMethodOrFieldRef.this, PsiClass.class) != containingClass) { + PsiDocComment fromText = JavaPsiFacade.getElementFactory(containingClass.getProject()) + .createDocCommentFromText("/**{@link " + containingClass.getQualifiedName() + "#" + newName + "}*/"); + PsiDocMethodOrFieldRef methodOrFieldRefFromText = PsiTreeUtil.findChildOfType(fromText, PsiDocMethodOrFieldRef.class); + addAfter(Objects.requireNonNull(methodOrFieldRefFromText).getFirstChild(), null); } if (hasSignature || !name.equals(newName)) { diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java index b87907f4faf0..7ab3b9b4e958 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java @@ -671,11 +671,12 @@ public class PsiReferenceExpressionImpl extends ExpressionPsiElement implements getTreeParent().replaceChildInternal(this, (TreeElement)ref.getNode()); return ref; } - else if ((element instanceof PsiField || element instanceof PsiMethod) && ((PsiMember) element).hasModifierProperty(PsiModifier.STATIC)) { + else if ((element instanceof PsiField || element instanceof PsiMethod)) { PsiMember member = (PsiMember) element; PsiClass psiClass = member.getContainingClass(); if (psiClass == null) throw new IncorrectOperationException(); - String qName = psiClass.getQualifiedName() + "." + member.getName(); + boolean isStatic = ((PsiMember)element).hasModifierProperty(PsiModifier.STATIC); + String qName = psiClass.getQualifiedName() + (isStatic ? "." : ".this.") + member.getName(); PsiExpression ref = parserFacade.createExpressionFromText(qName, this); getTreeParent().replaceChildInternal(this, (TreeElement)ref.getNode()); return ref; diff --git a/java/java-tests/testData/refactoring/renameInplace/MethodWithJavadocRef2.java b/java/java-tests/testData/refactoring/renameInplace/MethodWithJavadocRef2.java new file mode 100644 index 000000000000..0d4d3ae7defc --- /dev/null +++ b/java/java-tests/testData/refactoring/renameInplace/MethodWithJavadocRef2.java @@ -0,0 +1,22 @@ +class Main { + public static void main(String[] args) { + + } + + interface Add { + static OptionalLong set(long a) { + return null; + } + + interface Async { + /** + * @see #set(long) + */ + CompletableFuture add(long a); + + static void x() { + set(1); + } + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/renameInplace/MethodWithJavadocRef2_after.java b/java/java-tests/testData/refactoring/renameInplace/MethodWithJavadocRef2_after.java new file mode 100644 index 000000000000..e77ce65ffdfd --- /dev/null +++ b/java/java-tests/testData/refactoring/renameInplace/MethodWithJavadocRef2_after.java @@ -0,0 +1,22 @@ +class Main { + public static void main(String[] args) { + + } + + interface Add { + static OptionalLong set(long a) { + return null; + } + + interface Async { + /** + * @see Add#set(long) + */ + CompletableFuture set(long a); + + static void x() { + Add.set(1); + } + } + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/RenameMembersInplaceTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/RenameMembersInplaceTest.java index 31b1dd83eb64..fdbb1f9b241e 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/RenameMembersInplaceTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/RenameMembersInplaceTest.java @@ -1,4 +1,4 @@ -// Copyright 2000-2019 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-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.java.refactoring; import com.intellij.JavaTestUtil; @@ -74,6 +74,10 @@ public class RenameMembersInplaceTest extends LightJavaCodeInsightTestCase { doTestInplaceRename("bar"); } + public void testMethodWithJavadocRef2() { + doTestInplaceRename("set"); + } + public void testEnumConstructor() { doTestInplaceRename("Bar"); }