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 dbbe7f9a22a1..1dfae7e1bf14 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.ui.ReferenceEditorComboWithBrowseButton; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.event.DocumentEvent; @@ -175,9 +176,8 @@ public class CreateClassDialog extends DialogWrapper { CommandProcessor.getInstance().executeCommand(myProject, new Runnable() { public void run() { try { - final PsiDirectory baseDir = myModule == null? null : PackageUtil.findPossiblePackageDirectoryInModule(myModule, packageName); - myTargetDirectory = myModule == null? PackageUtil.findOrCreateDirectoryForPackage(myProject, packageName, baseDir, true) - : PackageUtil.findOrCreateDirectoryForPackage(myModule, packageName, baseDir, true); + myTargetDirectory = myModule == null? PackageUtil.findOrCreateDirectoryForPackage(myProject, packageName, getBaseDir(packageName), true) + : PackageUtil.findOrCreateDirectoryForPackage(myModule, packageName, getBaseDir(packageName), true, true); if (myTargetDirectory == null) { errorString[0] = ""; // message already reported by PackageUtil return; @@ -199,6 +199,11 @@ public class CreateClassDialog extends DialogWrapper { super.doOKAction(); } + @Nullable + protected PsiDirectory getBaseDir(String packageName) { + return myModule == null? null : PackageUtil.findPossiblePackageDirectoryInModule(myModule, packageName); + } + public String getClassName() { if (myClassNameEditable) { return myTfClassName.getText(); 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 9fa6b411e4cb..6a7b8f519479 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 @@ -26,14 +26,12 @@ package com.intellij.codeInsight.intention.impl; import com.intellij.codeInsight.CodeInsightBundle; import com.intellij.codeInsight.CodeInsightUtil; -import com.intellij.codeInsight.daemon.QuickFixBundle; import com.intellij.codeInsight.daemon.impl.analysis.HighlightNamesUtil; import com.intellij.codeInsight.daemon.impl.quickfix.CreateClassKind; import com.intellij.codeInsight.daemon.impl.quickfix.CreateConstructorMatchingSuperFix; import com.intellij.codeInsight.generation.OverrideImplementUtil; import com.intellij.codeInsight.generation.PsiMethodMember; import com.intellij.codeInsight.intention.PsiElementBaseIntentionAction; -import com.intellij.ide.util.MemberChooser; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; @@ -118,14 +116,19 @@ public class CreateSubclassAction extends PsiElementBaseIntentionAction { @Nullable public static CreateClassDialog chooseSubclassToCreate(PsiClass psiClass) { - PsiDirectory sourceDir = psiClass.getContainingFile().getContainingDirectory(); + final PsiDirectory sourceDir = psiClass.getContainingFile().getContainingDirectory(); final PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage(sourceDir); final CreateClassDialog dialog = new CreateClassDialog( psiClass.getProject(), getTitle(psiClass), psiClass.getName() + IMPL_SUFFIX, aPackage != null ? aPackage.getQualifiedName() : "", - CreateClassKind.CLASS, true, ModuleUtil.findModuleForPsiElement(psiClass)); + CreateClassKind.CLASS, true, ModuleUtil.findModuleForPsiElement(psiClass)){ + @Override + protected PsiDirectory getBaseDir(String packageName) { + return sourceDir; + } + }; dialog.show(); if (!dialog.isOK()) return null; final PsiDirectory targetDirectory = dialog.getTargetDirectory(); diff --git a/java/java-impl/src/com/intellij/ide/util/PackageUtil.java b/java/java-impl/src/com/intellij/ide/util/PackageUtil.java index 15a806d6ace4..a8c2d63fc02c 100644 --- a/java/java-impl/src/com/intellij/ide/util/PackageUtil.java +++ b/java/java-impl/src/com/intellij/ide/util/PackageUtil.java @@ -26,6 +26,8 @@ import com.intellij.openapi.project.ProjectBundle; import com.intellij.openapi.projectRoots.impl.ProjectRootUtil; import com.intellij.openapi.roots.ModulePackageIndex; import com.intellij.openapi.roots.ModuleRootManager; +import com.intellij.openapi.roots.ProjectFileIndex; +import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.roots.ui.configuration.CommonContentEntriesEditor; import com.intellij.openapi.roots.ui.configuration.ProjectSettingsService; import com.intellij.openapi.ui.Messages; @@ -162,6 +164,14 @@ public class PackageUtil { String packageName, PsiDirectory baseDir, boolean askUserToCreate) throws IncorrectOperationException { + return findOrCreateDirectoryForPackage(module, packageName, baseDir, askUserToCreate, false); + } + + public static PsiDirectory findOrCreateDirectoryForPackage(@NotNull Module module, + String packageName, + PsiDirectory baseDir, + boolean askUserToCreate, + boolean filterSourceDirsForBaseTestDirectory) throws IncorrectOperationException { final Project project = module.getProject(); PsiDirectory psiDirectory = null; if (!"".equals(packageName)) { @@ -174,6 +184,9 @@ public class PackageUtil { postfixToShow = File.separatorChar + postfixToShow; } PsiDirectory[] moduleDirectories = getPackageDirectoriesInModule(rootPackage, module); + if (filterSourceDirsForBaseTestDirectory) { + moduleDirectories = filterSourceDirectories(baseDir, project, moduleDirectories); + } psiDirectory = DirectoryChooserUtil.selectDirectory(project, moduleDirectories, baseDir, postfixToShow); if (psiDirectory == null) return null; } @@ -240,6 +253,20 @@ public class PackageUtil { return psiDirectory; } + private static PsiDirectory[] filterSourceDirectories(PsiDirectory baseDir, Project project, PsiDirectory[] moduleDirectories) { + final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex(); + if (fileIndex.isInTestSourceContent(baseDir.getVirtualFile())) { + List result = new ArrayList(); + for (PsiDirectory moduleDirectory : moduleDirectories) { + if (fileIndex.isInTestSourceContent(moduleDirectory.getVirtualFile())) { + result.add(moduleDirectory); + } + } + moduleDirectories = result.toArray(new PsiDirectory[result.size()]); + } + return moduleDirectories; + } + private static PsiDirectory[] getPackageDirectoriesInModule(PsiPackage rootPackage, Module module) { return rootPackage.getDirectories(GlobalSearchScope.moduleScope(module)); } diff --git a/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassProcessor.java b/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassProcessor.java index b163cbbadfb7..f834fb0292b4 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassProcessor.java @@ -689,7 +689,7 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor { final PsiDirectory containingDirectory = containingFile.getContainingDirectory(); final Module module = ModuleUtil.findModuleForPsiElement(containingFile); assert module != null; - final PsiDirectory directory = PackageUtil.findOrCreateDirectoryForPackage(module, newPackageName, containingDirectory, false); + final PsiDirectory directory = PackageUtil.findOrCreateDirectoryForPackage(module, newPackageName, containingDirectory, false, true); if (directory != null) { final PsiFile newFile = PsiFileFactory.getInstance(project).createFileFromText(newClassName + ".java", classString); final PsiElement addedFile = directory.add(newFile); diff --git a/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/IntroduceParameterObjectProcessor.java b/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/IntroduceParameterObjectProcessor.java index 542bcafc8bb8..2b5749a0eef2 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/IntroduceParameterObjectProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/IntroduceParameterObjectProcessor.java @@ -275,7 +275,7 @@ public class IntroduceParameterObjectProcessor extends FixableUsagesRefactoringP final PsiFile containingFile = method.getContainingFile(); final PsiDirectory containingDirectory = containingFile.getContainingDirectory(); final Module module = ModuleUtil.findModuleForPsiElement(containingFile); - final PsiDirectory directory = PackageUtil.findOrCreateDirectoryForPackage(module, packageName, containingDirectory, true); + final PsiDirectory directory = PackageUtil.findOrCreateDirectoryForPackage(module, packageName, containingDirectory, true, true); if (directory != null) { diff --git a/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithBuilder/ReplaceConstructorWithBuilderProcessor.java b/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithBuilder/ReplaceConstructorWithBuilderProcessor.java index f6b4b5e6463e..493e8a5227af 100644 --- a/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithBuilder/ReplaceConstructorWithBuilderProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithBuilder/ReplaceConstructorWithBuilderProcessor.java @@ -110,7 +110,7 @@ public class ReplaceConstructorWithBuilderProcessor extends FixableUsagesRefacto final PsiDirectory containingDirectory = containingFile.getContainingDirectory(); final Module module = ModuleUtil.findModuleForPsiElement(containingFile); assert module != null; - final PsiDirectory directory = PackageUtil.findOrCreateDirectoryForPackage(module, myPackageName, containingDirectory, true); + final PsiDirectory directory = PackageUtil.findOrCreateDirectoryForPackage(module, myPackageName, containingDirectory, true, true); if (directory != null) { diff --git a/java/java-impl/src/com/intellij/refactoring/wrapreturnvalue/WrapReturnValueProcessor.java b/java/java-impl/src/com/intellij/refactoring/wrapreturnvalue/WrapReturnValueProcessor.java index 0b59f205de74..98c39e504645 100644 --- a/java/java-impl/src/com/intellij/refactoring/wrapreturnvalue/WrapReturnValueProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/wrapreturnvalue/WrapReturnValueProcessor.java @@ -269,7 +269,7 @@ public class WrapReturnValueProcessor extends FixableUsagesRefactoringProcessor final PsiDirectory containingDirectory = containingFile.getContainingDirectory(); final Module module = ModuleUtil.findModuleForPsiElement(containingFile); - final PsiDirectory directory = PackageUtil.findOrCreateDirectoryForPackage(module, packageName, containingDirectory, true); + final PsiDirectory directory = PackageUtil.findOrCreateDirectoryForPackage(module, packageName, containingDirectory, true, true); if (directory != null) { final PsiElement shortenedFile = JavaCodeStyleManager.getInstance(project).shortenClassReferences(psiFile);