Move Nested Class to Upper Level: Do not show directory selection dialog twice

#KT-13906 Fixed
This commit is contained in:
Alexey Sedunov
2016-09-19 16:21:33 +03:00
parent 6366383b31
commit 65a1ecc464
2 changed files with 20 additions and 16 deletions
+1
View File
@@ -131,6 +131,7 @@ These artifacts include extensions for the types available in the latter JDKs, s
- [`KT-13759`](https://youtrack.jetbrains.com/issue/KT-13759) Rename: Process object-wrapping alias references - [`KT-13759`](https://youtrack.jetbrains.com/issue/KT-13759) Rename: Process object-wrapping alias references
- [`KT-13903`](https://youtrack.jetbrains.com/issue/KT-13903) Move: Remove companion object which becomes empty after the move - [`KT-13903`](https://youtrack.jetbrains.com/issue/KT-13903) Move: Remove companion object which becomes empty after the move
- [`KT-13916`](https://youtrack.jetbrains.com/issue/KT-13916) Move: Report visibility conflicts in import directives - [`KT-13916`](https://youtrack.jetbrains.com/issue/KT-13916) Move: Report visibility conflicts in import directives
- [`KT-13906`](https://youtrack.jetbrains.com/issue/KT-13906) Move Nested Class to Upper Level: Do not show directory selection dialog twice
##### New features ##### New features
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.ui; package org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.ui;
import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.JavaProjectRootsUtil; import com.intellij.openapi.roots.JavaProjectRootsUtil;
import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.roots.ProjectRootManager;
@@ -299,16 +300,16 @@ public class MoveKotlinNestedClassesToUpperLevelDialog extends MoveDialogBase {
} }
@Nullable @Nullable
private String getErrorMessageIfAny() { private PsiElement getTargetContainerWithValidation() throws ConfigurationException {
String className = getClassName(); String className = getClassName();
String parameterName = getParameterName(); String parameterName = getParameterName();
if (className != null && className.isEmpty()) return RefactoringBundle.message("no.class.name.specified"); if (className != null && className.isEmpty()) throw new ConfigurationException(RefactoringBundle.message("no.class.name.specified"));
if (!KotlinNameSuggester.INSTANCE.isIdentifier(className)) return RefactoringMessageUtil.getIncorrectIdentifierMessage(className); if (!KotlinNameSuggester.INSTANCE.isIdentifier(className)) throw new ConfigurationException(RefactoringMessageUtil.getIncorrectIdentifierMessage(className));
if (passOuterClassCheckBox.isSelected()) { if (passOuterClassCheckBox.isSelected()) {
if (parameterName != null && parameterName.isEmpty()) return RefactoringBundle.message("no.parameter.name.specified"); if (parameterName != null && parameterName.isEmpty()) throw new ConfigurationException(RefactoringBundle.message("no.parameter.name.specified"));
if (!KotlinNameSuggester.INSTANCE.isIdentifier(parameterName)) return RefactoringMessageUtil.getIncorrectIdentifierMessage(parameterName); if (!KotlinNameSuggester.INSTANCE.isIdentifier(parameterName)) throw new ConfigurationException(RefactoringMessageUtil.getIncorrectIdentifierMessage(parameterName));
} }
PsiElement targetContainer = getTargetContainer(); PsiElement targetContainer = getTargetContainer();
@@ -317,14 +318,14 @@ public class MoveKotlinNestedClassesToUpperLevelDialog extends MoveDialogBase {
KtClassOrObject targetClass = (KtClassOrObject) targetContainer; KtClassOrObject targetClass = (KtClassOrObject) targetContainer;
for (KtDeclaration member : targetClass.getDeclarations()) { for (KtDeclaration member : targetClass.getDeclarations()) {
if (member instanceof KtClassOrObject && className != null && className.equals(member.getName())) { if (member instanceof KtClassOrObject && className != null && className.equals(member.getName())) {
return RefactoringBundle.message("inner.class.exists", className, targetClass.getName()); throw new ConfigurationException(RefactoringBundle.message("inner.class.exists", className, targetClass.getName()));
} }
} }
} }
if (targetContainer instanceof PsiDirectory || targetContainer instanceof KtFile) { if (targetContainer instanceof PsiDirectory || targetContainer instanceof KtFile) {
FqName targetPackageFqName = getTargetPackageFqName(); FqName targetPackageFqName = getTargetPackageFqName();
if (targetPackageFqName == null) return "No package corresponds to this directory"; if (targetPackageFqName == null) throw new ConfigurationException("No package corresponds to this directory");
//noinspection ConstantConditions //noinspection ConstantConditions
ClassifierDescriptor existingClass = DescriptorUtils ClassifierDescriptor existingClass = DescriptorUtils
@@ -332,28 +333,30 @@ public class MoveKotlinNestedClassesToUpperLevelDialog extends MoveDialogBase {
.getPackage(targetPackageFqName) .getPackage(targetPackageFqName)
.getMemberScope() .getMemberScope()
.getContributedClassifier(Name.identifier(className), NoLookupLocation.FROM_IDE); .getContributedClassifier(Name.identifier(className), NoLookupLocation.FROM_IDE);
if (existingClass != null) return "Class " + className + " already exists in package " + targetPackageFqName; if (existingClass != null) throw new ConfigurationException("Class " + className + " already exists in package " + targetPackageFqName);
PsiDirectory targetDir = targetContainer instanceof PsiDirectory PsiDirectory targetDir = targetContainer instanceof PsiDirectory
? (PsiDirectory) targetContainer ? (PsiDirectory) targetContainer
: targetContainer.getContainingFile().getContainingDirectory(); : targetContainer.getContainingFile().getContainingDirectory();
return RefactoringMessageUtil.checkCanCreateFile(targetDir, className + ".kt"); String message = RefactoringMessageUtil.checkCanCreateFile(targetDir, className + ".kt");
if (message != null) throw new ConfigurationException(message);
} }
return null; return targetContainer;
} }
@Override @Override
protected void doAction() { protected void doAction() {
String errorMessage = getErrorMessageIfAny(); PsiElement target;
if (errorMessage != null) { try {
CommonRefactoringUtil.showErrorMessage(MoveInnerImpl.REFACTORING_NAME, errorMessage, HelpID.MOVE_INNER_UPPER, project); target = getTargetContainerWithValidation();
if (target == null) return;
}
catch (ConfigurationException e) {
CommonRefactoringUtil.showErrorMessage(MoveInnerImpl.REFACTORING_NAME, e.getMessage(), HelpID.MOVE_INNER_UPPER, project);
return; return;
} }
PsiElement target = getTargetContainer();
if (target == null) return;
KotlinMoveTarget moveTarget; KotlinMoveTarget moveTarget;
if (target instanceof PsiDirectory) { if (target instanceof PsiDirectory) {
final PsiDirectory targetDir = (PsiDirectory) target; final PsiDirectory targetDir = (PsiDirectory) target;