IDEA-90882 (do not pre-select extension methods for implementation)

This commit is contained in:
Roman Shevchenko
2012-09-13 17:13:17 +04:00
parent 569084582d
commit 7c944d2a7a
4 changed files with 61 additions and 4 deletions

View File

@@ -533,7 +533,19 @@ public class OverrideImplementUtil {
ApplicationManager.getApplication().assertReadAccessAllowed();
Collection<CandidateInfo> candidates = getMethodsToOverrideImplement(aClass, toImplement);
Collection<CandidateInfo> secondary = toImplement || aClass.isInterface() ? Collections.<CandidateInfo>emptyList() : getMethodsToOverrideImplement(aClass, true);
Collection<CandidateInfo> secondary = toImplement || aClass.isInterface() ?
ContainerUtil.<CandidateInfo>newArrayList() : getMethodsToOverrideImplement(aClass, true);
if (toImplement && PsiUtil.isLanguageLevel8OrHigher(aClass)) {
for (Iterator<CandidateInfo> iterator = candidates.iterator(); iterator.hasNext(); ) {
CandidateInfo candidate = iterator.next();
PsiElement element = candidate.getElement();
if (element instanceof PsiMethod && PsiUtil.isExtensionMethod((PsiMethod)element)) {
iterator.remove();
secondary.add(candidate);
}
}
}
final MemberChooser<PsiMethodMember> chooser = showOverrideImplementChooser(editor, aClass, toImplement, candidates, secondary);
if (chooser == null) return;
@@ -563,7 +575,7 @@ public class OverrideImplementUtil {
final Ref<Boolean> merge = Ref.create(PropertiesComponent.getInstance(project).isTrueValue(PROP_COMBINED_OVERRIDE_IMPLEMENT));
final MemberChooser<PsiMethodMember> chooser =
new MemberChooser<PsiMethodMember>(merge.get() ? all : onlyPrimary, false, true, project, PsiUtil.isLanguageLevel5OrHigher(aClass)) {
new MemberChooser<PsiMethodMember>(toImplement || merge.get() ? all : onlyPrimary, false, true, project, PsiUtil.isLanguageLevel5OrHigher(aClass)) {
@Override
protected void fillToolbarActions(DefaultActionGroup group) {
super.fillToolbarActions(group);
@@ -597,11 +609,13 @@ public class OverrideImplementUtil {
chooser.setCopyJavadocVisible(true);
if (toImplement) {
chooser.selectElements((boolean)merge.get() ? all : onlyPrimary);
chooser.selectElements(onlyPrimary);
}
if (ApplicationManager.getApplication().isUnitTestMode()) {
chooser.selectElements(all);
if (!toImplement) {
chooser.selectElements(all);
}
chooser.close(DialogWrapper.OK_EXIT_CODE);
return chooser;
}

View File

@@ -0,0 +1,17 @@
class Test {
interface A<T> {
void m1(T t);
void m2();
}
interface B<T> extends A<T> {
void m1(T t) default { }
}
class MyClass<T> implements B<T> {
@Override
public void m2() {
<selection>//To change body of implemented methods use File | Settings | File Templates.</selection>
}
}
}

View File

@@ -0,0 +1,14 @@
class Test {
interface A<T> {
void m1(T t);
void m2();
}
interface B<T> extends A<T> {
void m1(T t) default { }
}
class MyClass<T> implements B<T> {
<caret>
}
}

View File

@@ -120,6 +120,18 @@ public class OverrideImplementTest extends LightCodeInsightTestCase {
checkResultByFile(BASE_DIR + "after" + name + ".java");
}
public void testImplementExtensionMethods() {
setLanguageLevel(LanguageLevel.JDK_1_8);
String name = getTestName(false);
configureByFile(BASE_DIR + "before" + name + ".java");
int offset = getEditor().getCaretModel().getOffset();
PsiElement context = getFile().findElementAt(offset);
PsiClass psiClass = PsiTreeUtil.getParentOfType(context, PsiClass.class);
assert psiClass != null;
OverrideImplementUtil.chooseAndOverrideOrImplementMethods(getProject(), getEditor(), psiClass, true);
checkResultByFile(BASE_DIR + "after" + name + ".java");
}
private void doTest(boolean copyJavadoc) {
String name = getTestName(false);
configureByFile(BASE_DIR + "before" + name + ".java");