diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateClassDialog.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateClassDialog.java index ab7661750498..b943f83a6021 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateClassDialog.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateClassDialog.java @@ -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() { @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()); diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateSubclassAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateSubclassAction.java index 1babd72d0056..5c81b394783a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateSubclassAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateSubclassAction.java @@ -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