move static to interface (IDEA-105844)

This commit is contained in:
anna
2013-04-22 13:05:50 +02:00
parent 45706e2b3d
commit 599a28d446
7 changed files with 44 additions and 3 deletions

View File

@@ -32,6 +32,7 @@ import com.intellij.openapi.util.Ref;
import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.refactoring.HelpID;
import com.intellij.refactoring.JavaRefactoringSettings;
import com.intellij.refactoring.RefactoringBundle;
@@ -411,7 +412,7 @@ public class MoveMembersDialog extends RefactoringDialog implements MoveMembersO
}
public boolean isMemberEnabled(MemberInfo member) {
if(myTargetClass != null && myTargetClass.isInterface()) {
if(myTargetClass != null && myTargetClass.isInterface() && !PsiUtil.isLanguageLevel8OrHigher(myTargetClass)) {
return !(member.getMember() instanceof PsiMethod);
}
return super.isMemberEnabled(member);

View File

@@ -26,6 +26,7 @@ import com.intellij.psi.impl.source.tree.*;
import com.intellij.psi.tree.ChildRoleBase;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.TokenSet;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.CharTable;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -134,12 +135,17 @@ public class ClassElement extends CompositeElement implements Constants {
}
}
else if (psiClass.isInterface()) {
final boolean level8OrHigher = PsiUtil.isLanguageLevel8OrHigher(psiClass);
for (ASTNode child = first; child != afterLast; child = next) {
next = child.getTreeNext();
if (child.getElementType() == JavaElementType.METHOD || child.getElementType() == JavaElementType.FIELD) {
final IElementType childElementType = child.getElementType();
if (childElementType == JavaElementType.METHOD || childElementType == JavaElementType.FIELD) {
CompositeElement modifierList = (CompositeElement)((CompositeElement)child).findChildByRole(ChildRole.MODIFIER_LIST);
final TokenSet removeModifiersBitSet = level8OrHigher && childElementType == JavaElementType.METHOD
? MODIFIERS_TO_REMOVE_IN_INTERFACE_BIT_SET_18_METHOD
: MODIFIERS_TO_REMOVE_IN_INTERFACE_BIT_SET;
while (true) {
ASTNode modifier = modifierList.findChildByType(MODIFIERS_TO_REMOVE_IN_INTERFACE_BIT_SET);
ASTNode modifier = modifierList.findChildByType(removeModifiersBitSet);
if (modifier == null) break;
modifierList.deleteChildInternal(modifier);
}
@@ -233,6 +239,12 @@ public class ClassElement extends CompositeElement implements Constants {
NATIVE_KEYWORD
);
private static final TokenSet MODIFIERS_TO_REMOVE_IN_INTERFACE_BIT_SET_18_METHOD = TokenSet.create(
PUBLIC_KEYWORD, ABSTRACT_KEYWORD,
FINAL_KEYWORD,
NATIVE_KEYWORD
);
private static final TokenSet MODIFIERS_TO_REMOVE_IN_ENUM_BIT_SET = TokenSet.create(
PUBLIC_KEYWORD, FINAL_KEYWORD
);

View File

@@ -0,0 +1,2 @@
public class A {
}

View File

@@ -0,0 +1,5 @@
public interface B {
static void foo() {
System.out.println("Hello");
}
}

View File

@@ -0,0 +1,5 @@
public class A {
public static void foo() {
System.out.println("Hello");
}
}

View File

@@ -0,0 +1,2 @@
public interface B {
}

View File

@@ -2,7 +2,9 @@ package com.intellij.refactoring;
import com.intellij.JavaTestUtil;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.roots.LanguageLevelProjectExtension;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiMember;
@@ -126,6 +128,18 @@ public class MoveMembersTest extends MultiFileTestCase {
public void testInnerToInterface() throws Exception {
doTest("A", "B", 0);
}
public void testStaticToInterface() throws Exception {
final LanguageLevelProjectExtension levelProjectExtension = LanguageLevelProjectExtension.getInstance(getProject());
final LanguageLevel level = levelProjectExtension.getLanguageLevel();
try {
levelProjectExtension.setLanguageLevel(LanguageLevel.JDK_1_8);
doTest("A", "B", 0);
}
finally {
levelProjectExtension.setLanguageLevel(level);
}
}
public void testEscalateVisibility1() throws Exception {
doTest("A", "B", true, VisibilityUtil.ESCALATE_VISIBILITY, 0);