[java] extract super: check conflicting abstract methods when super would be indeed used as target class (IDEA-207561)

GitOrigin-RevId: 8904c3532a12ad15d3758ba0c19d6c0ee8024384
This commit is contained in:
Anna Kozlova
2021-09-20 18:50:41 +02:00
committed by intellij-monorepo-bot
parent d19e2011be
commit 849d3eef74
5 changed files with 53 additions and 4 deletions

View File

@@ -1,4 +1,4 @@
// Copyright 2000-2020 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-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.refactoring.memberPullUp;
@@ -78,7 +78,7 @@ public final class PullUpConflictsUtil {
}
final MultiMap<PsiElement, String> conflicts = new MultiMap<>();
final Set<PsiMethod> abstrMethods = new HashSet<>(abstractMethods);
if (superClass != null) {
if (superClass != null && movedMembers2Super) {
for (PsiMethod method : subclass.getMethods()) {
if (!movedMembers.contains(method) && !method.hasModifierProperty(PsiModifier.PRIVATE)) {
if (method.findSuperMethods(superClass).length > 0) {

View File

@@ -0,0 +1,3 @@
public abstract class Test extends X {
abstract boolean y();
}

View File

@@ -0,0 +1,21 @@
class TestSubclass extends Test {
@Override
boolean x() {
return false;
}
@Override
boolean y() {
return true;
}
}
abstract class X {
abstract boolean x();
}
class Y extends X {
@Override
boolean x() {
return true;
}
}

View File

@@ -0,0 +1,20 @@
class Test extends X {
@Override
boolean x() {
return false;
}
boolean y() {
return true;
}
}
abstract class X {
abstract boolean x();
}
class Y extends X {
@Override
boolean x() {
return true;
}
}

View File

@@ -114,6 +114,11 @@ public class ExtractSuperClassTest extends LightMultiFileTestCase {
new RefactoringTestUtil.MemberDescriptor("a", PsiField.class));
}
public void testAbstractInSuper() {
doTest("Test", "TestSubclass",
new RefactoringTestUtil.MemberDescriptor("y", PsiMethod.class, true));
}
public void testSameTypeParameterName() {
doTest("Test", "TestSubclass", new RefactoringTestUtil.MemberDescriptor("A", PsiClass.class), new RefactoringTestUtil.MemberDescriptor("B", PsiClass.class));
}
@@ -216,14 +221,14 @@ public class ExtractSuperClassTest extends LightMultiFileTestCase {
}
final HashSet<String> expectedConflicts = new HashSet<>(Arrays.asList(conflicts));
final HashSet<String> actualConflicts = new HashSet<>(conflictsMap.values());
assertEquals(expectedConflicts.size(), actualConflicts.size());
assertEquals(actualConflicts.toString(), expectedConflicts.size(), actualConflicts.size());
for (String actualConflict : actualConflicts) {
if (!expectedConflicts.contains(actualConflict)) {
fail("Unexpected conflict: " + actualConflict);
}
}
} else if (!conflictsMap.isEmpty()) {
fail("Unexpected conflicts!!!");
fail("Unexpected conflicts!!!" + conflictsMap.toString());
}
processor.run();
}