do not suggest to create class in source directory if base directory was test one (implement test interface, wrap test method, etc - IDEA-59925)

This commit is contained in:
anna
2010-11-23 17:15:49 +03:00
parent bdd4c5c96b
commit 5ce3e28755
7 changed files with 46 additions and 11 deletions
@@ -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();
@@ -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();
@@ -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<PsiDirectory> result = new ArrayList<PsiDirectory>();
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));
}
@@ -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);
@@ -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) {
@@ -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) {
@@ -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);