java create class from new: don't create non-static inner if new expression can't be used afterwards (IDEA-97433)

GitOrigin-RevId: 89616c077ca5141db53b624ae08bc54b04d53cae
This commit is contained in:
Anna Kozlova
2020-12-18 11:04:57 +01:00
committed by intellij-monorepo-bot
parent f535bd830e
commit 1c6857ec2d
7 changed files with 54 additions and 6 deletions

View File

@@ -16,6 +16,7 @@ import com.intellij.openapi.fileEditor.ex.IdeDocumentHistory;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Segment;
import com.intellij.psi.*;
import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.ObjectUtils;
@@ -206,7 +207,7 @@ public class CreateClassFromNewFix extends CreateFromUsageBaseFix {
@Override
protected boolean isAvailableImpl(int offset) {
PsiNewExpression expression = getNewExpression();
if (rejectQualifier(expression.getQualifier())) {
if (rejectContainer(expression)) {
return false;
}
@@ -225,8 +226,20 @@ public class CreateClassFromNewFix extends CreateFromUsageBaseFix {
return false;
}
protected boolean rejectQualifier(PsiExpression qualifier) {
return qualifier != null;
protected boolean rejectContainer(PsiNewExpression expression) {
if (expression.getQualifier() != null) {
return true;
}
PsiJavaCodeReferenceElement classReference = expression.getClassOrAnonymousClassReference();
if (classReference != null && classReference.isQualified()) {
PsiJavaCodeReferenceElement containerReference = ObjectUtils.tryCast(classReference.getQualifier(), PsiJavaCodeReferenceElement.class);
if (containerReference != null) {
PsiElement targetClass = containerReference.resolve();
return !(targetClass instanceof PsiClass) || !InheritanceUtil.hasEnclosingInstanceInScope((PsiClass)targetClass, expression, true, true);
}
return true;
}
return false;
}
protected @IntentionName String getText(final String varName) {

View File

@@ -53,7 +53,7 @@ public class CreateInnerClassFromNewFix extends CreateClassFromNewFix {
}
@Override
protected boolean rejectQualifier(PsiExpression qualifier) {
protected boolean rejectContainer(PsiNewExpression qualifier) {
return false;
}

View File

@@ -2,7 +2,7 @@
import java.util.*;
public class Test {
public static void main() {
public void main() {
Collection c = new Test.MyCollection(1);
}

View File

@@ -0,0 +1,15 @@
// "Create class 'MyCollection'" "true"
import java.util.*;
class Test extends Foo {
public void main() {
Collection c = new Foo.MyCollection(1);
}
}
class Foo {
public class MyCollection implements Collection {
public MyCollection(int i) {
}
}
}

View File

@@ -2,7 +2,7 @@
import java.util.*;
public class Test {
public static void main() {
public void main() {
Collection c = new Test.My<caret>Collection(1);
}
}

View File

@@ -0,0 +1,10 @@
// "Create class 'MyCollection'" "true"
import java.util.*;
class Test extends Foo {
public void main() {
Collection c = new Foo.My<caret>Collection(1);
}
}
class Foo {}

View File

@@ -0,0 +1,10 @@
// "Create class 'MyCollection'" "false"
import java.util.*;
public class Test {
public static void main() {
Collection c = new Foo.My<caret>Collection(1);
}
}
class Foo {}