Java: rename method correctly if the name conflicts with javadoc reference (IDEA-355643)

GitOrigin-RevId: c1ae53780e8ec3a56834dd32ecd9bc19cfd222fb
This commit is contained in:
Bas Leijdekkers
2024-09-12 13:06:30 +02:00
committed by intellij-monorepo-bot
parent eb3403c62f
commit c40e983f98
7 changed files with 67 additions and 20 deletions

View File

@@ -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<? extends MemberHidesOuterMemberUsageInfo> 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));
}
}

View File

@@ -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)) {

View File

@@ -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)) {

View File

@@ -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;

View File

@@ -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<OptionalLong> add<caret>(long a);
static void x() {
set(1);
}
}
}
}

View File

@@ -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<OptionalLong> set(long a);
static void x() {
Add.set(1);
}
}
}
}

View File

@@ -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");
}