create enum from usage: do not insert extends Enum list; disable create class from usage when class should extend final or enum (IDEA-103480)

(cherry picked from commit b2baa7ff649c365d6d57bf873e9fd015ccc32809)
This commit is contained in:
anna
2013-03-20 20:18:00 +01:00
parent 09f8a6ca2c
commit 8f5515b2d6
5 changed files with 32 additions and 1 deletions

View File

@@ -23,6 +23,7 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.PsiUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -113,6 +114,12 @@ public abstract class CreateClassFromUsageBaseFix extends BaseIntentionAction {
PsiElement parent = element.getParent();
if (parent instanceof PsiExpression && !(parent instanceof PsiReferenceExpression)) return false;
if (!isAvailableInContext(element)) return false;
final String superClassName = getSuperClassName(element);
if (superClassName != null) {
if (superClassName.equals(CommonClassNames.JAVA_LANG_ENUM) && myKind != CreateClassKind.ENUM) return false;
final PsiClass psiClass = JavaPsiFacade.getInstance(project).findClass(superClassName, GlobalSearchScope.allScope(project));
if (psiClass != null && psiClass.hasModifierProperty(PsiModifier.FINAL)) return false;
}
final int offset = editor.getCaretModel().getOffset();
if (CreateFromUsageUtils.shouldShowTag(offset, nameElement, element)) {
setText(getText(nameElement.getText()));

View File

@@ -447,7 +447,7 @@ public class CreateFromUsageUtils {
targetClass = (PsiClass) sourceFile.add(aClass);
}
if (superClassName != null) {
if (superClassName != null && (classKind != CreateClassKind.ENUM || !superClassName.equals(CommonClassNames.JAVA_LANG_ENUM))) {
final PsiClass superClass =
facade.findClass(superClassName, targetClass.getResolveScope());
final PsiJavaCodeReferenceElement superClassReference = factory.createReferenceElementByFQClassName(superClassName, targetClass.getResolveScope());

View File

@@ -0,0 +1,9 @@
// "Create Enum 'Foo'" "true"
public class Test {
void f(Class<? extends Enum> e) {}
{
f(Foo.class);
}
}
public enum Foo {}

View File

@@ -0,0 +1,7 @@
// "Create Enum 'Foo'" "true"
public class Test {
void f(Class<? extends Enum> e) {}
{
f(Fo<caret>o.class);
}
}

View File

@@ -0,0 +1,8 @@
// "Create Class 'Abc'" "false"
public class Test {
void foo(Class<? extends A> cl){}
{
foo(A<caret>bc.class);
}
}
final class A {}