allow to create inner class on qualifier (IDEA-129663)

This commit is contained in:
Anna Kozlova
2018-06-26 18:42:24 +03:00
parent a66fc1c678
commit 2e22f09d37
5 changed files with 33 additions and 3 deletions
@@ -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);
}
@@ -305,6 +305,7 @@ public abstract class CreateFromUsageBaseFix extends BaseIntentionAction {
}
}
}
qualifier = newExpression.getQualifier();
}
else if (element instanceof PsiReferenceExpression) {
qualifier = ((PsiReferenceExpression)element).getQualifierExpression();
@@ -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);
@@ -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 {
}
}
}
@@ -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();