mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
restore create subclass for decompiled classes (IDEA-163147)
This commit is contained in:
@@ -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());
|
||||
|
||||
+10
-3
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user