create class from usage: do not show dialog from write action (IDEA-66872)

This commit is contained in:
anna
2011-03-23 21:05:59 +01:00
parent 3736de2e07
commit 516bef4f42
5 changed files with 64 additions and 41 deletions
@@ -48,11 +48,19 @@ public class CreateClassFromNewFix extends CreateFromUsageBaseFix {
protected void invokeImpl(PsiClass targetClass) {
assert ApplicationManager.getApplication().isWriteAccessAllowed();
PsiNewExpression newExpression = getNewExpression();
final PsiNewExpression newExpression = getNewExpression();
PsiJavaCodeReferenceElement referenceElement = getReferenceElement(newExpression);
final PsiClass psiClass = CreateFromUsageUtils.createClass(referenceElement, CreateClassKind.CLASS, null);
setupClassFromNewExpression(psiClass, newExpression);
final PsiJavaCodeReferenceElement referenceElement = getReferenceElement(newExpression);
ApplicationManager.getApplication().invokeLater(new Runnable() {
public void run() {
final PsiClass psiClass = CreateFromUsageUtils.createClass(referenceElement, CreateClassKind.CLASS, null);
ApplicationManager.getApplication().runWriteAction(new Runnable() {
public void run() {
setupClassFromNewExpression(psiClass, newExpression);
}
});
}
});
}
protected static void setupClassFromNewExpression(final PsiClass psiClass, final PsiNewExpression newExpression) {
@@ -41,6 +41,7 @@ import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.Pass;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
@@ -264,6 +265,7 @@ public class CreateFromUsageUtils {
public static PsiClass createClass(final PsiJavaCodeReferenceElement referenceElement,
final CreateClassKind classKind,
final String superClassName) {
assert !ApplicationManager.getApplication().isWriteAccessAllowed();
final String name = referenceElement.getReferenceName();
final PsiElement qualifierElement;
@@ -274,23 +276,7 @@ public class CreateFromUsageUtils {
return ApplicationManager.getApplication().runWriteAction(
new Computable<PsiClass>() {
public PsiClass compute() {
try {
PsiClass psiClass = (PsiClass) qualifierElement;
if (!CodeInsightUtilBase.preparePsiElementForWrite(psiClass)) return null;
PsiManager manager = psiClass.getManager();
PsiElementFactory elementFactory = JavaPsiFacade.getInstance(manager.getProject()).getElementFactory();
PsiClass result = classKind == INTERFACE ? elementFactory.createInterface(name) :
classKind == CLASS ? elementFactory.createClass(name) :
elementFactory.createEnum(name);
CreateFromUsageBaseFix.setupGenericParameters(result, referenceElement);
result = (PsiClass)manager.getCodeStyleManager().reformat(result);
return (PsiClass) psiClass.add(result);
}
catch (IncorrectOperationException e) {
LOG.error(e);
return null;
}
return createClassInQualifier((PsiClass)qualifierElement, classKind, name, referenceElement);
}
});
}
@@ -302,20 +288,7 @@ public class CreateFromUsageUtils {
final PsiManager manager = referenceElement.getManager();
final PsiFile sourceFile = referenceElement.getContainingFile();
final Module module = ModuleUtil.findModuleForPsiElement(sourceFile);
PsiPackage aPackage = null;
if (qualifierElement instanceof PsiPackage) {
aPackage = (PsiPackage)qualifierElement;
}
else {
final PsiDirectory directory = sourceFile.getContainingDirectory();
if (directory != null) {
aPackage = JavaDirectoryService.getInstance().getPackage(directory);
}
if (aPackage == null) {
aPackage = JavaPsiFacade.getInstance(manager.getProject()).findPackage("");
}
}
PsiPackage aPackage = findTargetPackage(qualifierElement, manager, sourceFile);
if (aPackage == null) return null;
final PsiDirectory targetDirectory;
if (!ApplicationManager.getApplication().isUnitTestMode()) {
@@ -335,6 +308,48 @@ public class CreateFromUsageUtils {
return createClass(classKind, targetDirectory, name, manager, referenceElement, sourceFile, superClassName);
}
@Nullable
public static PsiPackage findTargetPackage(PsiElement qualifierElement, PsiManager manager, PsiFile sourceFile) {
PsiPackage aPackage = null;
if (qualifierElement instanceof PsiPackage) {
aPackage = (PsiPackage)qualifierElement;
}
else {
final PsiDirectory directory = sourceFile.getContainingDirectory();
if (directory != null) {
aPackage = JavaDirectoryService.getInstance().getPackage(directory);
}
if (aPackage == null) {
aPackage = JavaPsiFacade.getInstance(manager.getProject()).findPackage("");
}
}
if (aPackage == null) return null;
return aPackage;
}
public static PsiClass createClassInQualifier(PsiClass psiClass,
CreateClassKind classKind,
String name,
PsiJavaCodeReferenceElement referenceElement) {
try {
if (!CodeInsightUtilBase.preparePsiElementForWrite(psiClass)) return null;
PsiManager manager = psiClass.getManager();
PsiElementFactory elementFactory = JavaPsiFacade.getInstance(manager.getProject()).getElementFactory();
PsiClass result = classKind == INTERFACE ? elementFactory.createInterface(name) :
classKind == CLASS ? elementFactory.createClass(name) :
elementFactory.createEnum(name);
CreateFromUsageBaseFix.setupGenericParameters(result, referenceElement);
result = (PsiClass)manager.getCodeStyleManager().reformat(result);
return (PsiClass) psiClass.add(result);
}
catch (IncorrectOperationException e) {
LOG.error(e);
return null;
}
}
public static PsiClass createClass(final CreateClassKind classKind,
final PsiDirectory directory,
final String name,
@@ -3,7 +3,7 @@ public class Test {
public static void main() {
Collection[] cc = new MyCollection[10];
}
}<caret>
}
public class MyCollection {
<caret>public class MyCollection {
}
@@ -6,7 +6,7 @@ public class Test {
public static void main() {
JTable table = new JTable(new MyTableModel());
}
}<caret>
}
public class MyTableModel implements TableModel {
<caret>public class MyTableModel implements TableModel {
}
@@ -3,7 +3,7 @@ class Test {
void foo () {
new Generic<String> ();
}
}<caret>
}
public class Generic<T> {
<caret>public class Generic<T> {
}