restore create subclass for decompiled classes (IDEA-163147)

This commit is contained in:
Anna.Kozlova
2016-10-26 19:13:17 +02:00
parent bf0d218fc6
commit 6d2b61eb19
2 changed files with 17 additions and 5 deletions
@@ -39,6 +39,7 @@ import com.intellij.refactoring.MoveDestination;
import com.intellij.refactoring.PackageWrapper;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.refactoring.move.moveClassesOrPackages.DestinationFolderComboBox;
import com.intellij.refactoring.move.moveClassesOrPackages.MultipleRootsMoveDestination;
import com.intellij.refactoring.ui.PackageNameReferenceEditorCombo;
import com.intellij.refactoring.util.RefactoringMessageUtil;
import com.intellij.ui.DocumentAdapter;
@@ -248,11 +249,15 @@ public class CreateClassDialog extends DialogWrapper {
myTargetDirectory = ApplicationManager.getApplication().runWriteAction(new Computable<PsiDirectory>() {
@Override
public PsiDirectory compute() {
return destination.getTargetDirectory(getBaseDir(packageName));
PsiDirectory baseDir = getBaseDir(packageName);
if (baseDir == null && destination instanceof MultipleRootsMoveDestination) {
errorString[0] = "Destination not found for package '" + packageName + "'";
return null;
}
return destination.getTargetDirectory(baseDir);
}
});
if (myTargetDirectory == null) {
errorString[0] = ""; // message already reported by PackageUtil
return;
}
errorString[0] = RefactoringMessageUtil.checkCanCreateClass(myTargetDirectory, getClassName());
@@ -36,6 +36,7 @@ import com.intellij.codeInsight.template.Template;
import com.intellij.codeInsight.template.TemplateBuilderFactory;
import com.intellij.codeInsight.template.TemplateBuilderImpl;
import com.intellij.codeInsight.template.TemplateEditingAdapter;
import com.intellij.ide.scratch.ScratchFileType;
import com.intellij.lang.java.JavaLanguage;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.Result;
@@ -51,9 +52,11 @@ import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NonNls;
@@ -87,7 +90,11 @@ public class CreateSubclassAction extends BaseIntentionAction {
PsiElement element = file.findElementAt(position);
PsiClass psiClass = PsiTreeUtil.getParentOfType(element, PsiClass.class);
if (psiClass == null || psiClass.isAnnotationType() || psiClass.isEnum() || psiClass instanceof PsiAnonymousClass ||
psiClass.hasModifierProperty(PsiModifier.FINAL) || psiClass.getContainingFile().getContainingDirectory() == null) {
psiClass.hasModifierProperty(PsiModifier.FINAL)) {
return false;
}
VirtualFile virtualFile = PsiUtilCore.getVirtualFile(psiClass);
if (virtualFile == null || virtualFile.getFileType() == ScratchFileType.INSTANCE) {
return false;
}
if (!isSupportedLanguage(psiClass)) return false;
@@ -170,7 +177,7 @@ public class CreateSubclassAction extends BaseIntentionAction {
public static CreateClassDialog chooseSubclassToCreate(PsiClass psiClass) {
final PsiDirectory sourceDir = psiClass.getContainingFile().getContainingDirectory();
ProjectFileIndex fileIndex = ProjectRootManager.getInstance(psiClass.getProject()).getFileIndex();
final PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage(sourceDir);
final PsiPackage aPackage = sourceDir != null ? JavaDirectoryService.getInstance().getPackage(sourceDir) : null;
final CreateClassDialog dialog = new CreateClassDialog(
psiClass.getProject(), getTitle(psiClass),
psiClass.getName() + IMPL_SUFFIX,
@@ -178,7 +185,7 @@ public class CreateSubclassAction extends BaseIntentionAction {
CreateClassKind.CLASS, true, ModuleUtilCore.findModuleForPsiElement(psiClass)) {
@Override
protected PsiDirectory getBaseDir(String packageName) {
return fileIndex.getSourceRootForFile(sourceDir.getVirtualFile()) != null ? sourceDir : super.getBaseDir(packageName);
return sourceDir != null && fileIndex.getSourceRootForFile(sourceDir.getVirtualFile()) != null ? sourceDir : super.getBaseDir(packageName);
}
@Override