Java: correctly qualify method call when it is inlined from static interface method (IDEA-362625)

GitOrigin-RevId: 2f32664c77558fc4507a8a6ecc327f6c91b7d815
This commit is contained in:
Bas Leijdekkers
2024-11-08 10:56:56 +01:00
committed by intellij-monorepo-bot
parent 3dbb5b1bb5
commit f81e59d5d8
4 changed files with 46 additions and 6 deletions

View File

@@ -194,22 +194,23 @@ public final class ChangeContextUtil {
private static PsiReferenceExpression decodeReferenceExpression(@NotNull PsiReferenceExpression refExpr,
PsiExpression thisAccessExpr,
PsiClass thisClass) throws IncorrectOperationException {
PsiClass thisClass) {
PsiManager manager = refExpr.getManager();
PsiElementFactory factory = JavaPsiFacade.getElementFactory(manager.getProject());
PsiExpression qualifier = refExpr.getQualifierExpression();
if (qualifier == null){
if (qualifier == null) {
PsiMember refMember = refExpr.getCopyableUserData(REF_MEMBER_KEY);
refExpr.putCopyableUserData(REF_MEMBER_KEY, null);
if (refMember != null && refMember.isValid()){
if (refMember != null && refMember.isValid()) {
PsiClass containingClass = refMember.getContainingClass();
if (containingClass != null && containingClass.isValid() && refMember.hasModifierProperty(PsiModifier.STATIC)){
if (containingClass != null && containingClass.isValid() && refMember.hasModifierProperty(PsiModifier.STATIC)) {
PsiElement refElement = refExpr.resolve();
if (!manager.areElementsEquivalent(refMember, refElement)){
if (!manager.areElementsEquivalent(refMember, refElement) || containingClass.isInterface()) {
final PsiClass currentClass = PsiTreeUtil.getParentOfType(refExpr, PsiClass.class);
if (currentClass == null || !InheritanceUtil.isInheritorOrSelf(currentClass, containingClass, true)) {
if (!InheritanceUtil.isInheritorOrSelf(currentClass, containingClass, true) ||
containingClass.isInterface() && containingClass != currentClass) {
refExpr.setQualifierExpression(factory.createReferenceExpression(containingClass));
}
}

View File

@@ -0,0 +1,21 @@
interface AccountModule {
static void createAccount(String a, String b) {
}
default void createAccount(String a) {
createAccount(a, getB());
}
String getB();
}
class UseModule implements AccountModule {
public void createSome() {
<caret>createAccount("");
}
@Override
public String getB() {
return "";
}
}

View File

@@ -0,0 +1,17 @@
interface AccountModule {
static void createAccount(String a, String b) {
}
String getB();
}
class UseModule implements AccountModule {
public void createSome() {
AccountModule.createAccount("", getB());
}
@Override
public String getB() {
return "";
}
}

View File

@@ -82,6 +82,7 @@ public class InlineMethodTest extends LightRefactoringTestCase {
public void testGenericArrayCreation() { doTest(); }
public void testNoRedundantCast() { doTest(); }
public void testFieldInitializer() { doTest(); }
public void testStaticInterfaceMethod() { doTest(); }
public void testMethodCallInOtherAnonymousOrInner() { doTest(); }