From a3b2a7eddaa4f3467378aefd459f1548a0c673f3 Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 20 Sep 2011 16:19:52 +0200 Subject: [PATCH] root chooser: wrap return value --- .../wrapreturnvalue/WrapReturnValueDialog.java | 15 ++++++++++++++- .../wrapreturnvalue/WrapReturnValueForm.form | 18 ++++++++++++++++-- .../WrapReturnValueProcessor.java | 17 ++++++++++++++--- .../refactoring/WrapReturnValueTest.java | 5 ++--- 4 files changed, 46 insertions(+), 9 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/wrapreturnvalue/WrapReturnValueDialog.java b/java/java-impl/src/com/intellij/refactoring/wrapreturnvalue/WrapReturnValueDialog.java index 281acc42c674..ba2eeb564db0 100644 --- a/java/java-impl/src/com/intellij/refactoring/wrapreturnvalue/WrapReturnValueDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/wrapreturnvalue/WrapReturnValueDialog.java @@ -28,10 +28,13 @@ import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.TypeConversionUtil; import com.intellij.refactoring.HelpID; +import com.intellij.refactoring.PackageWrapper; import com.intellij.refactoring.RefactorJBundle; import com.intellij.refactoring.RefactoringBundle; +import com.intellij.refactoring.move.moveClassesOrPackages.DestinationFolderComboBox; import com.intellij.refactoring.ui.PackageNameReferenceEditorCombo; import com.intellij.refactoring.ui.RefactoringDialog; +import com.intellij.ui.ComboboxWithBrowseButton; import com.intellij.ui.DocumentAdapter; import com.intellij.ui.ReferenceEditorComboWithBrowseButton; import com.intellij.util.ui.UIUtil; @@ -64,6 +67,7 @@ class WrapReturnValueDialog extends RefactoringDialog { private JRadioButton myCreateInnerClassButton; private JTextField myInnerClassNameTextField; private JPanel myCreateInnerPanel; + private ComboboxWithBrowseButton myDestinationCb; private static final String RECENT_KEYS = "WrapReturnValue.RECENT_KEYS"; WrapReturnValueDialog(PsiMethod sourceMethod) { @@ -96,7 +100,8 @@ class WrapReturnValueDialog extends RefactoringDialog { packageName = getPackageName(); } invokeRefactoring( - new WrapReturnValueProcessor(className, packageName, sourceMethod, useExistingClass, createInnerClass, (PsiField)myFieldsCombo.getSelectedItem())); + new WrapReturnValueProcessor(className, packageName, ((DestinationFolderComboBox)myDestinationCb).selectDirectory(new PackageWrapper(sourceMethod.getManager(), packageName), false), + sourceMethod, useExistingClass, createInnerClass, (PsiField)myFieldsCombo.getSelectedItem())); } @Override @@ -278,5 +283,13 @@ class WrapReturnValueDialog extends RefactoringDialog { } }, "", PsiManager.getInstance(myProject), true, RECENT_KEYS); existingClassField.getChildComponent().getDocument().addDocumentListener(adapter); + + myDestinationCb = new DestinationFolderComboBox() { + @Override + public String getTargetPackage() { + return getPackageName(); + } + }; + ((DestinationFolderComboBox)myDestinationCb).setData(myProject, sourceMethod.getContainingFile().getContainingDirectory(), packageTextField.getChildComponent()); } } diff --git a/java/java-impl/src/com/intellij/refactoring/wrapreturnvalue/WrapReturnValueForm.form b/java/java-impl/src/com/intellij/refactoring/wrapreturnvalue/WrapReturnValueForm.form index 66d6a9aa9630..3bfb6d334eb6 100644 --- a/java/java-impl/src/com/intellij/refactoring/wrapreturnvalue/WrapReturnValueForm.form +++ b/java/java-impl/src/com/intellij/refactoring/wrapreturnvalue/WrapReturnValueForm.form @@ -3,7 +3,7 @@ - + @@ -24,7 +24,7 @@ - + @@ -63,6 +63,20 @@ + + + + + + + + + + + + + + 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 8df928b61013..5c991c6b2ac9 100644 --- a/java/java-impl/src/com/intellij/refactoring/wrapreturnvalue/WrapReturnValueProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/wrapreturnvalue/WrapReturnValueProcessor.java @@ -31,6 +31,7 @@ import com.intellij.psi.search.searches.OverridingMethodsSearch; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.TypeConversionUtil; +import com.intellij.refactoring.MoveDestination; import com.intellij.refactoring.RefactorJBundle; import com.intellij.refactoring.psi.PropertyUtils; import com.intellij.refactoring.psi.TypeParametersVisitor; @@ -58,6 +59,7 @@ public class WrapReturnValueProcessor extends FixableUsagesRefactoringProcessor private static final Logger LOG = Logger.getInstance("com.siyeh.rpp.wrapreturnvalue.WrapReturnValueProcessor"); + private MoveDestination myMoveDestination; private final PsiMethod method; private final String className; private final String packageName; @@ -71,10 +73,11 @@ public class WrapReturnValueProcessor extends FixableUsagesRefactoringProcessor public WrapReturnValueProcessor(String className, String packageName, - PsiMethod method, + MoveDestination moveDestination, PsiMethod method, boolean useExistingClass, final boolean createInnerClass, PsiField delegateField) { super(method.getProject()); + myMoveDestination = moveDestination; this.method = method; this.className = className; this.packageName = packageName; @@ -227,6 +230,9 @@ public class WrapReturnValueProcessor extends FixableUsagesRefactoringProcessor if (existingClass != null) { conflicts.putValue(existingClass, RefactorJBundle.message("there.already.exists.a.class.with.the.selected.name")); } + if (myMoveDestination != null && !myMoveDestination.isTargetAccessible(myProject, method.getContainingFile().getVirtualFile())) { + conflicts.putValue(method, "Created class won't be accessible in the call place"); + } } return showConflicts(conflicts, refUsages.get()); } @@ -268,8 +274,13 @@ public class WrapReturnValueProcessor extends FixableUsagesRefactoringProcessor 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) { final PsiElement shortenedFile = JavaCodeStyleManager.getInstance(project).shortenClassReferences(psiFile); diff --git a/java/java-tests/testSrc/com/intellij/refactoring/WrapReturnValueTest.java b/java/java-tests/testSrc/com/intellij/refactoring/WrapReturnValueTest.java index 37e312545086..4d69c1ea4633 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/WrapReturnValueTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/WrapReturnValueTest.java @@ -4,8 +4,6 @@ */ package com.intellij.refactoring; -import com.intellij.openapi.projectRoots.Sdk; -import com.intellij.openapi.projectRoots.impl.JavaSdkImpl; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiField; @@ -53,7 +51,8 @@ public class WrapReturnValueTest extends MultiFileTestCase{ assertTrue(!existing || wrapperClass != null); final PsiField delegateField = existing ? wrapperClass.findFieldByName("myField", false) : null; - WrapReturnValueProcessor processor = new WrapReturnValueProcessor(wrapperClassName, "", method, existing, createInnerClass, + WrapReturnValueProcessor processor = new WrapReturnValueProcessor(wrapperClassName, "", + null, method, existing, createInnerClass, delegateField); processor.run(); /*LocalFileSystem.getInstance().refresh(false);