mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-06 03:21:12 +07:00
Java: correctly qualify method call when it is inlined from static interface method (IDEA-362625)
GitOrigin-RevId: 2f32664c77558fc4507a8a6ecc327f6c91b7d815
This commit is contained in:
committed by
intellij-monorepo-bot
parent
3dbb5b1bb5
commit
f81e59d5d8
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 "";
|
||||
}
|
||||
}
|
||||
@@ -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 "";
|
||||
}
|
||||
}
|
||||
@@ -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(); }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user