mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
root chooser: extract class; introduce parameter object
inaccessible conflicts added
This commit is contained in:
@@ -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) {
|
||||
|
||||
+1
-2
@@ -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);
|
||||
|
||||
+26
-12
@@ -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);
|
||||
|
||||
+14
-4
@@ -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() {
|
||||
|
||||
+16
-2
@@ -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="&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">
|
||||
|
||||
+23
-10
@@ -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) {
|
||||
|
||||
|
||||
+17
@@ -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) {
|
||||
|
||||
+29
-6
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -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) {
|
||||
|
||||
+6
@@ -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());
|
||||
}
|
||||
|
||||
+18
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user