root chooser: extract class; introduce parameter object

inaccessible conflicts added
This commit is contained in:
anna
2011-09-20 17:12:29 +02:00
parent 742605e40d
commit e92e60a468
17 changed files with 190 additions and 45 deletions
@@ -111,7 +111,7 @@ public class CreateClassDialog extends DialogWrapper {
}
myTfClassName.setText(myClassName);
myDestinationCB.setData(myProject, getBaseDir(normalizedPackageName), ProjectRootManager.getInstance(myProject).getContentSourceRoots(), new Pass<String>() {
myDestinationCB.setData(myProject, getBaseDir(normalizedPackageName), new Pass<String>() {
@Override
public void pass(String s) {
setErrorText(s);
@@ -72,7 +72,7 @@ class CopyClassDialog extends DialogWrapper{
RefactoringBundle.message("copy.class.copy.0.1", UsageViewUtil.getType(aClass), UsageViewUtil.getLongName(aClass));
myInformationLabel.setText(text);
init();
myDestinationCB.setData(myProject, defaultTargetDirectory, ProjectRootManager.getInstance(myProject).getContentSourceRoots(),
myDestinationCB.setData(myProject, defaultTargetDirectory,
new Pass<String>() {
@Override
public void pass(String s) {
@@ -15,7 +15,6 @@
*/
package com.intellij.refactoring.extractSuperclass;
import com.intellij.ide.util.PackageUtil;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectFileIndex;
@@ -76,7 +75,7 @@ public abstract class JavaExtractSuperBaseDialog extends ExtractSuperBaseDialog<
panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0));
panel.add(new JBLabel(RefactoringBundle.message("target.destination.folder")), BorderLayout.NORTH);
myDestinationFolderComboBox.setData(myProject, myTargetDirectory, sourceRoots, new Pass<String>() {
myDestinationFolderComboBox.setData(myProject, myTargetDirectory, new Pass<String>() {
@Override
public void pass(String s) {
}
@@ -18,20 +18,26 @@ package com.intellij.refactoring.extractclass;
import com.intellij.openapi.help.HelpManager;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Pass;
import com.intellij.psi.*;
import com.intellij.psi.presentation.java.SymbolPresentationUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.refactoring.HelpID;
import com.intellij.refactoring.PackageWrapper;
import com.intellij.refactoring.RefactorJBundle;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.refactoring.classMembers.DelegatingMemberInfoModel;
import com.intellij.refactoring.classMembers.MemberInfoBase;
import com.intellij.refactoring.classMembers.MemberInfoChange;
import com.intellij.refactoring.classMembers.MemberInfoChangeListener;
import com.intellij.refactoring.move.moveClassesOrPackages.DestinationFolderComboBox;
import com.intellij.refactoring.ui.*;
import com.intellij.refactoring.util.classMembers.MemberInfo;
import com.intellij.ui.DocumentAdapter;
import com.intellij.ui.ReferenceEditorComboWithBrowseButton;
import com.intellij.ui.components.JBLabel;
import com.intellij.util.containers.HashMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -52,6 +58,7 @@ class ExtractClassDialog extends RefactoringDialog implements MemberInfoChangeLi
private final List<MemberInfo> memberInfo;
private final JTextField classNameField;
private final ReferenceEditorComboWithBrowseButton packageTextField;
private final DestinationFolderComboBox myDestinationFolderComboBox;
private final JTextField sourceClassTextField;
private JCheckBox myGenerateAccessorsCb;
private final JavaVisibilityPanel myVisibilityPanel;
@@ -80,6 +87,13 @@ class ExtractClassDialog extends RefactoringDialog implements MemberInfoChangeLi
validateButtons();
}
});
myDestinationFolderComboBox = new DestinationFolderComboBox() {
@Override
public String getTargetPackage() {
return getPackageName();
}
};
myDestinationFolderComboBox.setData(myProject, sourceClass.getContainingFile().getContainingDirectory(), packageTextField.getChildComponent());
classNameField.getDocument().addDocumentListener(docListener);
sourceClassTextField = new JTextField();
final MemberInfo.Filter<PsiMember> filter = new MemberInfo.Filter<PsiMember>() {
@@ -129,7 +143,8 @@ class ExtractClassDialog extends RefactoringDialog implements MemberInfoChangeLi
return o1.getMember().getTextOffset() - o2.getMember().getTextOffset();
}
});
final ExtractClassProcessor processor = new ExtractClassProcessor(sourceClass, fields, methods, classes, packageName, newClassName, myVisibilityPanel.getVisibility(), isGenerateAccessors(),
final ExtractClassProcessor processor = new ExtractClassProcessor(sourceClass, fields, methods, classes, packageName, myDestinationFolderComboBox.selectDirectory(new PackageWrapper(PsiManager.getInstance(myProject), packageName), false),
newClassName, myVisibilityPanel.getVisibility(), isGenerateAccessors(),
isExtractAsEnum() ? enumConstants : Collections.<MemberInfo>emptyList());
if (processor.getCreatedClass() == null) {
Messages.showErrorDialog(myVisibilityPanel, "Unable to create class with the given name");
@@ -246,6 +261,14 @@ class ExtractClassDialog extends RefactoringDialog implements MemberInfoChangeLi
packageNamePanel.add(packageTextField, BorderLayout.CENTER);
box.add(packageNamePanel);
if (ProjectRootManager.getInstance(myProject).getContentSourceRoots().length > 1) {
final JPanel panel = new JPanel(new BorderLayout());
panel.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0));
panel.add(new JBLabel(RefactoringBundle.message("target.destination.folder")), BorderLayout.NORTH);
panel.add(myDestinationFolderComboBox, BorderLayout.CENTER);
box.add(panel);
}
box.add(Box.createVerticalStrut(10));
final JPanel panel = new JPanel(new BorderLayout());
panel.add(box, BorderLayout.CENTER);
@@ -17,11 +17,12 @@ package com.intellij.refactoring.extractclass;
import com.intellij.ide.util.PackageUtil;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.text.StringUtil;
@@ -38,13 +39,16 @@ import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.PropertyUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.refactoring.MoveDestination;
import com.intellij.refactoring.RefactorJBundle;
import com.intellij.refactoring.extractclass.usageInfo.*;
import com.intellij.refactoring.move.MoveInstanceMembersUtil;
import com.intellij.refactoring.move.moveClassesOrPackages.DestinationFolderComboBox;
import com.intellij.refactoring.psi.MethodInheritanceUtils;
import com.intellij.refactoring.psi.TypeParametersVisitor;
import com.intellij.refactoring.util.FixableUsageInfo;
import com.intellij.refactoring.util.FixableUsagesRefactoringProcessor;
import com.intellij.refactoring.util.RefactoringUIUtil;
import com.intellij.refactoring.util.RefactoringUtil;
import com.intellij.refactoring.util.classMembers.MemberInfo;
import com.intellij.usageView.UsageInfo;
@@ -68,6 +72,7 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor {
private final Set<PsiClass> innerClassesToMakePublic = new HashSet<PsiClass>();
private final List<PsiTypeParameter> typeParams = new ArrayList<PsiTypeParameter>();
private final String newPackageName;
private final MoveDestination myMoveDestination;
private final String myNewVisibility;
private final boolean myGenerateAccessors;
private final List<PsiField> enumConstants;
@@ -84,7 +89,7 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor {
List<PsiClass> innerClasses,
String newPackageName,
String newClassName) {
this(sourceClass, fields, methods, innerClasses, newPackageName, newClassName, null, false, Collections.<MemberInfo>emptyList());
this(sourceClass, fields, methods, innerClasses, newPackageName, null, newClassName, null, false, Collections.<MemberInfo>emptyList());
}
public ExtractClassProcessor(PsiClass sourceClass,
@@ -92,12 +97,14 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor {
List<PsiMethod> methods,
List<PsiClass> classes,
String packageName,
MoveDestination moveDestination,
String newClassName,
String newVisibility,
boolean generateAccessors, List<MemberInfo> enumConstants) {
super(sourceClass.getProject());
this.sourceClass = sourceClass;
this.newPackageName = packageName;
myMoveDestination = moveDestination;
myNewVisibility = newVisibility;
myGenerateAccessors = generateAccessors;
this.enumConstants = new ArrayList<PsiField>();
@@ -126,13 +133,12 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor {
}
typeParams.addAll(typeParamSet);
}
myClass = ApplicationManager.getApplication().runWriteAction(
new Computable<PsiClass>() {
public PsiClass compute() {
return buildClass();
}
myClass = new WriteCommandAction<PsiClass>(myProject, getCommandName()){
@Override
protected void run(Result<PsiClass> result) throws Throwable {
result.setResult(buildClass());
}
);
}.execute().getResultObject();
myExtractEnumProcessor = new ExtractEnumProcessor(myProject, this.enumConstants, fields, myClass);
}
@@ -144,6 +150,10 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor {
protected boolean preprocessUsages(final Ref<UsageInfo[]> refUsages) {
final MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
myExtractEnumProcessor.findEnumConstantConflicts(refUsages, conflicts);
if (!DestinationFolderComboBox.isAccessible(myProject, sourceClass.getContainingFile().getVirtualFile(),
myClass.getContainingFile().getContainingDirectory().getVirtualFile())) {
conflicts.putValue(sourceClass, "Extracted class won't be accessible in " + RefactoringUIUtil.getDescription(sourceClass, true));
}
ApplicationManager.getApplication().runWriteAction(new Runnable() {
public void run() {
myClass.delete();
@@ -683,11 +693,15 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor {
try {
final PsiFile containingFile = sourceClass.getContainingFile();
final PsiDirectory directory;
final PsiDirectory containingDirectory = containingFile.getContainingDirectory();
final Module module = ModuleUtil.findModuleForPsiElement(containingFile);
assert module != null;
final PsiDirectory directory = PackageUtil.findOrCreateDirectoryForPackage(module, newPackageName, containingDirectory, false, true);
if (myMoveDestination != null) {
directory = myMoveDestination.getTargetDirectory(containingDirectory);
} else {
final Module module = ModuleUtil.findModuleForPsiElement(containingFile);
assert module != null;
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);
@@ -27,12 +27,12 @@ import com.intellij.openapi.wm.IdeFocusManager;
import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.PsiFormatUtil;
import com.intellij.refactoring.HelpID;
import com.intellij.refactoring.RefactorJBundle;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.refactoring.*;
import com.intellij.refactoring.move.moveClassesOrPackages.DestinationFolderComboBox;
import com.intellij.refactoring.ui.PackageNameReferenceEditorCombo;
import com.intellij.refactoring.ui.RefactoringDialog;
import com.intellij.refactoring.util.ParameterTablePanel;
import com.intellij.ui.ComboboxWithBrowseButton;
import com.intellij.ui.DocumentAdapter;
import com.intellij.ui.RecentsManager;
import com.intellij.ui.ReferenceEditorComboWithBrowseButton;
@@ -75,6 +75,7 @@ public class IntroduceParameterObjectDialog extends RefactoringDialog {
private ReferenceEditorComboWithBrowseButton existingClassField;
private JCheckBox myGenerateAccessorsCheckBox;
private JCheckBox myEscalateVisibilityCheckBox;
private ComboboxWithBrowseButton myDestinationCb;
private static final String RECENTS_KEY = "IntroduceParameterObject.RECENTS_KEY";
private static final String EXISTING_KEY = "IntroduceParameterObject.EXISTING_KEY";
@@ -168,7 +169,9 @@ public class IntroduceParameterObjectDialog extends RefactoringDialog {
}
final String newVisibility =
myEscalateVisibilityCheckBox.isEnabled() && myEscalateVisibilityCheckBox.isSelected() ? VisibilityUtil.ESCALATE_VISIBILITY : null;
invokeRefactoring(new IntroduceParameterObjectProcessor(className, packageName, sourceMethod,
final MoveDestination moveDestination = ((DestinationFolderComboBox)myDestinationCb)
.selectDirectory(new PackageWrapper(PsiManager.getInstance(myProject), packageName), false);
invokeRefactoring(new IntroduceParameterObjectProcessor(className, packageName, moveDestination, sourceMethod,
parameters.toArray(new ParameterTablePanel.VariableData[parameters.size()]),
keepMethod, useExistingClass,
createInnerClass, newVisibility, myGenerateAccessorsCheckBox.isSelected()));
@@ -312,6 +315,13 @@ public class IntroduceParameterObjectDialog extends RefactoringDialog {
enableGenerateAccessors();
}
});
myDestinationCb = new DestinationFolderComboBox() {
@Override
public String getTargetPackage() {
return getPackageName();
}
};
((DestinationFolderComboBox)myDestinationCb).setData(myProject, sourceMethod.getContainingFile().getContainingDirectory(), packageTextField.getChildComponent());
}
private void enableGenerateAccessors() {
@@ -3,7 +3,7 @@
<grid id="27dc6" binding="myWholePanel" layout-manager="GridLayoutManager" row-count="3" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<xy x="20" y="20" width="420" height="416"/>
<xy x="20" y="20" width="420" height="440"/>
</constraints>
<properties/>
<clientProperties>
@@ -30,7 +30,7 @@
<text value="&amp;Create new class"/>
</properties>
</component>
<grid id="57543" binding="myCreateNewClassPanel" layout-manager="GridLayoutManager" row-count="2" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<grid id="57543" binding="myCreateNewClassPanel" layout-manager="GridLayoutManager" row-count="4" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="20" bottom="0" right="0"/>
<constraints>
<grid row="1" column="0" row-span="1" col-span="6" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
@@ -70,6 +70,20 @@
</constraints>
<properties/>
</component>
<component id="e7449" class="javax.swing.JLabel">
<constraints>
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Target destination folder"/>
</properties>
</component>
<component id="c2c7f" class="com.intellij.ui.ComboboxWithBrowseButton" binding="myDestinationCb" custom-create="true">
<constraints>
<grid row="3" column="0" row-span="1" col-span="2" vsize-policy="3" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
</component>
</children>
</grid>
<grid id="37fbd" binding="myUseExistingPanel" layout-manager="GridLayoutManager" row-count="3" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
@@ -33,6 +33,7 @@ import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.psi.util.PropertyUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.refactoring.MoveDestination;
import com.intellij.refactoring.RefactorJBundle;
import com.intellij.refactoring.introduceparameterobject.usageInfo.*;
import com.intellij.refactoring.psi.PropertyUtils;
@@ -49,14 +50,12 @@ import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.*;
public class IntroduceParameterObjectProcessor extends FixableUsagesRefactoringProcessor {
private static final Logger logger = Logger.getInstance("com.siyeh.rpp.introduceparameterobject.IntroduceParameterObjectProcessor");
private MoveDestination myMoveDestination;
private final PsiMethod method;
private final String className;
private final String packageName;
@@ -75,12 +74,14 @@ public class IntroduceParameterObjectProcessor extends FixableUsagesRefactoringP
public IntroduceParameterObjectProcessor(String className,
String packageName,
MoveDestination moveDestination,
PsiMethod method,
ParameterTablePanel.VariableData[] parameters, boolean keepMethodAsDelegate, final boolean useExistingClass,
final boolean createInnerClass,
String newVisibility,
boolean generateAccessors) {
super(method.getProject());
myMoveDestination = moveDestination;
this.method = method;
this.className = className;
this.packageName = packageName;
@@ -144,10 +145,17 @@ public class IntroduceParameterObjectProcessor extends FixableUsagesRefactoringP
conflicts.putValue(existingClass, RefactorJBundle.message("cannot.perform.the.refactoring") + "Selected class has no compatible constructors");
}
}
else if (existingClass != null) {
conflicts.putValue(existingClass,
RefactorJBundle.message("cannot.perform.the.refactoring") +
RefactorJBundle.message("there.already.exists.a.class.with.the.chosen.name"));
else {
if (existingClass != null) {
conflicts.putValue(existingClass,
RefactorJBundle.message("cannot.perform.the.refactoring") +
RefactorJBundle.message("there.already.exists.a.class.with.the.chosen.name"));
}
if (myMoveDestination != null) {
if (!myMoveDestination.isTargetAccessible(myProject, method.getContainingFile().getVirtualFile())) {
conflicts.putValue(method, "Created class won't be accessible");
}
}
}
for (UsageInfo usageInfo : refUsages.get()) {
if (usageInfo instanceof FixableUsageInfo) {
@@ -274,8 +282,13 @@ public class IntroduceParameterObjectProcessor extends FixableUsagesRefactoringP
} else {
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, true);
final PsiDirectory directory;
if (myMoveDestination != null) {
directory = myMoveDestination.getTargetDirectory(containingDirectory);
} else {
final Module module = ModuleUtil.findModuleForPsiElement(containingFile);
directory = PackageUtil.findOrCreateDirectoryForPackage(module, packageName, containingDirectory, true, true);
}
if (directory != null) {
@@ -15,11 +15,16 @@
*/
package com.intellij.refactoring.move.moveClassesOrPackages;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiPackage;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.refactoring.PackageWrapper;
import com.intellij.refactoring.util.RefactoringConflictsUtil;
import com.intellij.refactoring.util.RefactoringUtil;
@@ -80,6 +85,18 @@ public class AutocreatingSingleSourceRootMoveDestination extends AutocreatingMov
RefactoringConflictsUtil.analyzeModuleConflicts(getTargetPackage().getManager().getProject(), elements, usages, mySourceRoot, conflicts);
}
@Override
public boolean isTargetAccessible(Project project, VirtualFile place) {
final boolean inTestSourceContent = ProjectRootManager.getInstance(project).getFileIndex().isInTestSourceContent(place);
final Module module = ModuleUtil.findModuleForFile(place, project);
if (mySourceRoot != null &&
module != null &&
!GlobalSearchScope.moduleWithDependenciesAndLibrariesScope(module, inTestSourceContent).contains(mySourceRoot)) {
return false;
}
return true;
}
PsiDirectory myTargetDirectory = null;
private PsiDirectory getDirectory() throws IncorrectOperationException {
if (myTargetDirectory == null) {
@@ -30,6 +30,7 @@ import com.intellij.openapi.util.Pass;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiManager;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.refactoring.MoveDestination;
import com.intellij.refactoring.PackageWrapper;
import com.intellij.ui.*;
@@ -64,12 +65,21 @@ public abstract class DestinationFolderComboBox extends ComboboxWithBrowseButton
return false;
}
public void setData(final Project project,
final PsiDirectory initialTargetDirectory,
final EditorComboBox editorComboBox) {
setData(project, initialTargetDirectory, new Pass<String>() {
@Override
public void pass(String s) {
}
}, editorComboBox);
}
public void setData(final Project project,
final PsiDirectory initialTargetDirectory,
final VirtualFile[] sourceRoots,
final Pass<String> errorMessageUpdater, final EditorComboBox editorComboBox) {
myInitialTargetDirectory = initialTargetDirectory;
mySourceRoots = sourceRoots;
mySourceRoots = ProjectRootManager.getInstance(project).getContentSourceRoots();
new ComboboxSpeedSearch(getComboBox()) {
@Override
protected String getElementText(Object element) {
@@ -111,7 +121,7 @@ public abstract class DestinationFolderComboBox extends ComboboxWithBrowseButton
@Override
public void actionPerformed(ActionEvent e) {
VirtualFile root = MoveClassesOrPackagesUtil
.chooseSourceRoot(new PackageWrapper(PsiManager.getInstance(project), getTargetPackage()), sourceRoots, initialTargetDirectory);
.chooseSourceRoot(new PackageWrapper(PsiManager.getInstance(project), getTargetPackage()), mySourceRoots, initialTargetDirectory);
if (root == null) return;
final ComboBoxModel model = getComboBox().getModel();
for (int i = 0; i < model.getSize(); i++) {
@@ -121,17 +131,17 @@ public abstract class DestinationFolderComboBox extends ComboboxWithBrowseButton
return;
}
}
setComboboxModel(getComboBox(), root, fileIndex, sourceRoots, project, true, errorMessageUpdater);
setComboboxModel(getComboBox(), root, fileIndex, mySourceRoots, project, true, errorMessageUpdater);
}
});
editorComboBox.addDocumentListener(new DocumentAdapter() {
@Override
public void documentChanged(DocumentEvent e) {
setComboboxModel(getComboBox(), initialSourceRoot, fileIndex, sourceRoots, project, false, errorMessageUpdater);
setComboboxModel(getComboBox(), initialSourceRoot, fileIndex, mySourceRoots, project, false, errorMessageUpdater);
}
});
setComboboxModel(getComboBox(), initialSourceRoot, fileIndex, sourceRoots, project, false, errorMessageUpdater);
setComboboxModel(getComboBox(), initialSourceRoot, fileIndex, mySourceRoots, project, false, errorMessageUpdater);
getComboBox().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
@@ -234,4 +244,17 @@ public abstract class DestinationFolderComboBox extends ComboboxWithBrowseButton
}
return true;
}
public static boolean isAccessible(final Project project,
final VirtualFile virtualFile,
final VirtualFile targetVirtualFile) {
final boolean inTestSourceContent = ProjectRootManager.getInstance(project).getFileIndex().isInTestSourceContent(virtualFile);
final Module module = ModuleUtil.findModuleForFile(virtualFile, project);
if (targetVirtualFile != null &&
module != null &&
!GlobalSearchScope.moduleWithDependenciesAndLibrariesScope(module, inTestSourceContent).contains(targetVirtualFile)) {
return false;
}
return true;
}
}
@@ -264,7 +264,7 @@ public class MoveClassesOrPackagesDialog extends RefactoringDialog {
myCbSearchInComments.setSelected(searchInComments);
myCbSearchTextOccurences.setSelected(searchForTextOccurences);
((DestinationFolderComboBox)myDestinationFolderCB).setData(myProject, myInitialTargetDirectory, getSourceRoots(),
((DestinationFolderComboBox)myDestinationFolderCB).setData(myProject, myInitialTargetDirectory,
new Pass<String>() {
@Override
public void pass(String s) {
@@ -16,6 +16,7 @@
package com.intellij.refactoring.move.moveClassesOrPackages;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.refactoring.PackageWrapper;
@@ -95,6 +96,11 @@ public class MultipleRootsMoveDestination extends AutocreatingMoveDestination {
MultiMap<PsiElement,String> conflicts, final UsageInfo[] usages) {
}
@Override
public boolean isTargetAccessible(Project project, VirtualFile place) {
return true;
}
public PsiDirectory getTargetIfExists(PsiDirectory source) {
return findTargetDirectoryForSource(source.getVirtualFile());
}
@@ -16,7 +16,13 @@
package com.intellij.refactoring.move.moveClassesOrPackages;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.refactoring.MoveDestination;
import com.intellij.refactoring.PackageWrapper;
import com.intellij.refactoring.util.RefactoringConflictsUtil;
@@ -73,6 +79,18 @@ public class SingleSourceRootMoveDestination implements MoveDestination {
RefactoringConflictsUtil.analyzeModuleConflicts(myPackage.getManager().getProject(), elements, usages, myTargetDirectory, conflicts);
}
@Override
public boolean isTargetAccessible(Project project, VirtualFile place) {
final boolean inTestSourceContent = ProjectRootManager.getInstance(project).getFileIndex().isInTestSourceContent(place);
final Module module = ModuleUtil.findModuleForFile(place, project);
final VirtualFile targetVirtualFile = myTargetDirectory.getVirtualFile();
if (module != null &&
!GlobalSearchScope.moduleWithDependenciesAndLibrariesScope(module, inTestSourceContent).contains(targetVirtualFile)) {
return false;
}
return true;
}
public PsiDirectory getTargetDirectory(PsiFile source) {
return myTargetDirectory;
}
@@ -145,7 +145,7 @@ public class ExtractClassTest extends MultiFileTestCase{
private static void doTest(final PsiClass aClass, final ArrayList<PsiMethod> methods, final ArrayList<PsiField> fields, final String conflicts,
boolean generateGettersSetters) {
try {
ExtractClassProcessor processor = new ExtractClassProcessor(aClass, fields, methods, new ArrayList<PsiClass>(), "", "Extracted", null, generateGettersSetters, Collections.<MemberInfo>emptyList());
ExtractClassProcessor processor = new ExtractClassProcessor(aClass, fields, methods, new ArrayList<PsiClass>(), "", null, "Extracted", null, generateGettersSetters, Collections.<MemberInfo>emptyList());
processor.run();
LocalFileSystem.getInstance().refresh(false);
FileDocumentManager.getInstance().saveAllDocuments();
@@ -266,7 +266,7 @@ public class ExtractClassTest extends MultiFileTestCase{
fields.add(aClass.findFieldByName("myT", false));
final ExtractClassProcessor processor =
new ExtractClassProcessor(aClass, fields, methods, new ArrayList<PsiClass>(), "", "Extracted", PsiModifier.PUBLIC, false, Collections.<MemberInfo>emptyList());
new ExtractClassProcessor(aClass, fields, methods, new ArrayList<PsiClass>(), "", null, "Extracted", PsiModifier.PUBLIC, false, Collections.<MemberInfo>emptyList());
processor.run();
LocalFileSystem.getInstance().refresh(false);
FileDocumentManager.getInstance().saveAllDocuments();
@@ -158,7 +158,7 @@ public class ExtractEnumTest extends MultiFileTestCase {
}
try {
final ExtractClassProcessor processor =
new ExtractClassProcessor(aClass, fields, methods, new ArrayList<PsiClass>(), "", "EEnum",
new ExtractClassProcessor(aClass, fields, methods, new ArrayList<PsiClass>(), "", null, "EEnum",
null, generateAccessors, enumConstants);
processor.run();
@@ -51,7 +51,7 @@ public class IntroduceParameterObjectTest extends MultiFileTestCase{
final PsiMethod method = aClass.findMethodsByName("foo", false)[0];
final ParameterTablePanel.VariableData[] datas = function.fun(method);
IntroduceParameterObjectProcessor processor = new IntroduceParameterObjectProcessor("Param", "", method, datas, delegate, false,
IntroduceParameterObjectProcessor processor = new IntroduceParameterObjectProcessor("Param", "", null, method, datas, delegate, false,
createInner, null, false);
processor.run();
}
@@ -172,7 +172,7 @@ public class IntroduceParameterObjectTest extends MultiFileTestCase{
assertNotNull("Class Test not found", aClass);
final PsiMethod method = aClass.findMethodsByName("foo", false)[0];
IntroduceParameterObjectProcessor processor = new IntroduceParameterObjectProcessor(existingClassName, existingClassPackage, method,
IntroduceParameterObjectProcessor processor = new IntroduceParameterObjectProcessor(existingClassName, existingClassPackage, null, method,
generateParams(method), false, true,
false, newVisibility, generateAccessors);
processor.run();
@@ -15,10 +15,16 @@
*/
package com.intellij.refactoring;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiPackage;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.usageView.UsageInfo;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.containers.MultiMap;
@@ -63,4 +69,6 @@ public interface MoveDestination {
String verify(PsiPackage source);
void analyzeModuleConflicts(final Collection<PsiElement> elements, MultiMap<PsiElement,String> conflicts, final UsageInfo[] usages);
boolean isTargetAccessible(Project project, VirtualFile place);
}