diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateClassFromUsageBaseFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateClassFromUsageBaseFix.java index 4960c7b9b43b..3459827e11bc 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateClassFromUsageBaseFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateClassFromUsageBaseFix.java @@ -15,12 +15,15 @@ */ package com.intellij.codeInsight.daemon.impl.quickfix; +import com.intellij.codeInsight.ExpectedTypeInfo; +import com.intellij.codeInsight.ExpectedTypesProvider; import com.intellij.codeInsight.daemon.QuickFixBundle; import com.intellij.codeInsight.intention.impl.BaseIntentionAction; 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.util.PsiUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -123,15 +126,28 @@ public abstract class CreateClassFromUsageBaseFix extends BaseIntentionAction { @Nullable protected static String getSuperClassName(final PsiJavaCodeReferenceElement element) { - final String superClassName; - if (element.getParent().getParent() instanceof PsiMethod) { - PsiMethod method = (PsiMethod)element.getParent().getParent(); + String superClassName = null; + final PsiElement ggParent = element.getParent().getParent(); + if (ggParent instanceof PsiMethod) { + PsiMethod method = (PsiMethod)ggParent; if (method.getThrowsList() == element.getParent()) { superClassName = "java.lang.Exception"; } - else superClassName = null; + } else if (ggParent instanceof PsiClassObjectAccessExpression) { + final ExpectedTypeInfo[] expectedTypes = ExpectedTypesProvider.getExpectedTypes((PsiExpression)ggParent, false); + if (expectedTypes.length == 1) { + final PsiClassType.ClassResolveResult classResolveResult = PsiUtil.resolveGenericsClassInType(expectedTypes[0].getType()); + final PsiClass psiClass = classResolveResult.getElement(); + if (psiClass != null && CommonClassNames.JAVA_LANG_CLASS.equals(psiClass.getQualifiedName())) { + PsiType psiType = classResolveResult.getSubstitutor().substitute(psiClass.getTypeParameters()[0]); + if (psiType instanceof PsiWildcardType && ((PsiWildcardType)psiType).isExtends()) { + psiType = ((PsiWildcardType)psiType).getExtendsBound(); + } + final PsiClass aClass = PsiUtil.resolveClassInType(psiType); + if (aClass != null) return aClass.getQualifiedName(); + } + } } - else superClassName = null; return superClassName; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromUsage/afterClassObjectAccess1.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromUsage/afterClassObjectAccess1.java new file mode 100644 index 000000000000..9cad6012b1c0 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromUsage/afterClassObjectAccess1.java @@ -0,0 +1,10 @@ +// "Create Inner Class 'Foo'" "true" +public class Test { + void foo(Class n){} + void bar() { + foo(Foo.class); + } + + private class Foo extends Number { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromUsage/afterClassObjectAccess2.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromUsage/afterClassObjectAccess2.java new file mode 100644 index 000000000000..dc31b26c5fae --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromUsage/afterClassObjectAccess2.java @@ -0,0 +1,10 @@ +// "Create Inner Class 'Foo'" "true" +public class Test { + void foo(Class n){} + void bar() { + foo(Foo.class); + } + + private class Foo extends Number { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromUsage/afterClassObjectAccess3.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromUsage/afterClassObjectAccess3.java new file mode 100644 index 000000000000..c5777d0c2d0f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromUsage/afterClassObjectAccess3.java @@ -0,0 +1,10 @@ +// "Create Inner Class 'Foo'" "true" +public class Test { + void foo(Class n){} + void bar() { + foo(Foo.class); + } + + private class Foo { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromUsage/afterClassObjectAccess4.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromUsage/afterClassObjectAccess4.java new file mode 100644 index 000000000000..461a1fbc5d3a --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromUsage/afterClassObjectAccess4.java @@ -0,0 +1,10 @@ +// "Create Inner Class 'Foo'" "true" +public class Test { + void foo(Class n){} + void bar() { + foo(Foo); + } + + private class Foo { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromUsage/beforeClassObjectAccess1.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromUsage/beforeClassObjectAccess1.java new file mode 100644 index 000000000000..90c9bce736c9 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromUsage/beforeClassObjectAccess1.java @@ -0,0 +1,7 @@ +// "Create Inner Class 'Foo'" "true" +public class Test { + void foo(Class n){} + void bar() { + foo(Foo.class); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromUsage/beforeClassObjectAccess2.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromUsage/beforeClassObjectAccess2.java new file mode 100644 index 000000000000..285170053792 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromUsage/beforeClassObjectAccess2.java @@ -0,0 +1,7 @@ +// "Create Inner Class 'Foo'" "true" +public class Test { + void foo(Class n){} + void bar() { + foo(Foo.class); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromUsage/beforeClassObjectAccess3.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromUsage/beforeClassObjectAccess3.java new file mode 100644 index 000000000000..e2e93da30fa0 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromUsage/beforeClassObjectAccess3.java @@ -0,0 +1,7 @@ +// "Create Inner Class 'Foo'" "true" +public class Test { + void foo(Class n){} + void bar() { + foo(Foo.class); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromUsage/beforeClassObjectAccess4.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromUsage/beforeClassObjectAccess4.java new file mode 100644 index 000000000000..a7e971f5186c --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromUsage/beforeClassObjectAccess4.java @@ -0,0 +1,7 @@ +// "Create Inner Class 'Foo'" "true" +public class Test { + void foo(Class n){} + void bar() { + foo(Foo); + } +} \ No newline at end of file