diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateClassFromNewFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateClassFromNewFix.java index 34044bf077ed..941b157eca79 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateClassFromNewFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateClassFromNewFix.java @@ -236,7 +236,7 @@ public class CreateClassFromNewFix extends CreateFromUsageBaseFix { @Override protected boolean isAvailableImpl(int offset) { PsiNewExpression expression = getNewExpression(); - if (expression.getQualifier() != null) { + if (rejectQualifier(expression.getQualifier())) { return false; } @@ -255,6 +255,10 @@ public class CreateClassFromNewFix extends CreateFromUsageBaseFix { return false; } + protected boolean rejectQualifier(PsiExpression qualifier) { + return qualifier != null; + } + protected String getText(final String varName) { return QuickFixBundle.message("create.class.from.new.text", varName); } diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java index 0bd2c68c73f5..9a1e5543beb5 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java @@ -305,6 +305,7 @@ public abstract class CreateFromUsageBaseFix extends BaseIntentionAction { } } } + qualifier = newExpression.getQualifier(); } else if (element instanceof PsiReferenceExpression) { qualifier = ((PsiReferenceExpression)element).getQualifierExpression(); diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateInnerClassFromNewFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateInnerClassFromNewFix.java index 1614d415b72a..eb7d794eb36a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateInnerClassFromNewFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateInnerClassFromNewFix.java @@ -42,6 +42,17 @@ public class CreateInnerClassFromNewFix extends CreateClassFromNewFix { return true; } + @Override + protected boolean isValidElement(PsiElement element) { + PsiJavaCodeReferenceElement ref = element instanceof PsiNewExpression ? ((PsiNewExpression)element).getClassOrAnonymousClassReference() : null; + return ref != null && ref.resolve() != null; + } + + @Override + protected boolean rejectQualifier(PsiExpression qualifier) { + return false; + } + @Override protected void invokeImpl(final PsiClass targetClass) { PsiNewExpression newExpression = getNewExpression(); @@ -61,7 +72,9 @@ public class CreateInnerClassFromNewFix extends CreateClassFromNewFix { } } - if (!targetClass.isInterface() && (!PsiTreeUtil.isAncestor(targetClass, newExpression, true) || PsiUtil.getEnclosingStaticElement(newExpression, targetClass) != null || isInThisOrSuperCall(newExpression))) { + if (!targetClass.isInterface() && + newExpression.getQualifier() == null && + (!PsiTreeUtil.isAncestor(targetClass, newExpression, true) || PsiUtil.getEnclosingStaticElement(newExpression, targetClass) != null || isInThisOrSuperCall(newExpression))) { modifierList.setModifierProperty(PsiModifier.STATIC, true); } created = (PsiClass)targetClass.add(created); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/afterQualifiedNew2.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/afterQualifiedNew2.java new file mode 100644 index 000000000000..7d3aee247e74 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/afterQualifiedNew2.java @@ -0,0 +1,12 @@ +// "Create inner class 'ArrayList'" "true" +public class Test { + public static void main() { + Inner q = new Inner(); + q.new ArrayList(); + } + + static class Inner { + public class ArrayList { + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/beforeQualifiedNew2.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/beforeQualifiedNew2.java index 3c0cd0e31883..a16b01f9b31b 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/beforeQualifiedNew2.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/beforeQualifiedNew2.java @@ -1,4 +1,4 @@ -// "Create inner class 'ArrayList'" "false" +// "Create inner class 'ArrayList'" "true" public class Test { public static void main() { Inner q = new Inner();