From b8a579cd9d2abc9b666960aeed8cd21179eef23d Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 19 Sep 2011 16:03:12 +0200 Subject: [PATCH] extract superclass/interface: check super accessible (IDEA-74392) --- .../ExtractInterfaceHandler.java | 10 +++++- .../ExtractSuperClassUtil.java | 32 +++++++++++++++++++ .../ExtractSuperclassHandler.java | 13 ++------ 3 files changed, 43 insertions(+), 12 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/extractInterface/ExtractInterfaceHandler.java b/java/java-impl/src/com/intellij/refactoring/extractInterface/ExtractInterfaceHandler.java index c5cc458c7c68..23aa9299444b 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractInterface/ExtractInterfaceHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/extractInterface/ExtractInterfaceHandler.java @@ -23,8 +23,13 @@ import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.ScrollType; +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.HelpID; import com.intellij.refactoring.RefactoringActionHandler; import com.intellij.refactoring.RefactoringBundle; @@ -37,6 +42,7 @@ import com.intellij.refactoring.util.classMembers.MemberInfo; import com.intellij.usageView.UsageViewUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; public class ExtractInterfaceHandler implements RefactoringActionHandler, ElementsHandler { @@ -83,7 +89,9 @@ public class ExtractInterfaceHandler implements RefactoringActionHandler, Elemen final ExtractInterfaceDialog dialog = new ExtractInterfaceDialog(myProject, myClass); dialog.show(); if (!dialog.isOK() || !dialog.isExtractSuperclass()) return; - + final MultiMap conflicts = new MultiMap(); + ExtractSuperClassUtil.checkSuperAccessible(dialog.getTargetDirectory(), conflicts, myClass); + if (!ExtractSuperClassUtil.showConflicts(dialog, conflicts, myProject)) return; CommandProcessor.getInstance().executeCommand(myProject, new Runnable() { public void run() { ApplicationManager.getApplication().runWriteAction(new Runnable() { diff --git a/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperClassUtil.java b/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperClassUtil.java index 498f3cb4d2f7..b2509d93d804 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperClassUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperClassUtil.java @@ -17,20 +17,28 @@ package com.intellij.refactoring.extractSuperclass; import com.intellij.codeInsight.generation.OverrideImplementUtil; 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.ui.DialogWrapper; import com.intellij.openapi.util.Condition; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; +import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.MethodSignature; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.PsiUtilBase; import com.intellij.psi.util.TypeConversionUtil; import com.intellij.refactoring.memberPullUp.PullUpHelper; +import com.intellij.refactoring.ui.ConflictsDialog; import com.intellij.refactoring.util.DocCommentPolicy; import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.refactoring.util.classMembers.MemberInfo; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.HashMap; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; @@ -203,4 +211,28 @@ public class ExtractSuperClassUtil { return null; } + + public static void checkSuperAccessible(PsiDirectory targetDirectory, MultiMap conflicts, final PsiClass subclass) { + final VirtualFile virtualFile = subclass.getContainingFile().getVirtualFile(); + if (virtualFile != null) { + final boolean inTestSourceContent = ProjectRootManager.getInstance(subclass.getProject()).getFileIndex().isInTestSourceContent(virtualFile); + final Module module = ModuleUtil.findModuleForFile(virtualFile, subclass.getProject()); + if (targetDirectory != null && + module != null && + !GlobalSearchScope.moduleWithDependenciesAndLibrariesScope(module, inTestSourceContent).contains(targetDirectory.getVirtualFile())) { + conflicts.putValue(subclass, "Superclass won't be accessible in subclass"); + } + } + } + + public static boolean showConflicts(DialogWrapper dialog, MultiMap conflicts, final Project project) { + if (!conflicts.isEmpty()) { + ConflictsDialog conflictsDialog = new ConflictsDialog(project, conflicts); + conflictsDialog.show(); + final boolean ok = conflictsDialog.isOK(); + if (!ok && conflictsDialog.isShowConflicts()) dialog.close(DialogWrapper.CANCEL_EXIT_CODE); + return ok; + } + return true; + } } diff --git a/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperclassHandler.java b/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperclassHandler.java index d5e8a6ec2155..058afa876102 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperclassHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperclassHandler.java @@ -31,7 +31,6 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.ScrollType; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.DialogWrapper; import com.intellij.psi.*; import com.intellij.refactoring.HelpID; import com.intellij.refactoring.RefactoringActionHandler; @@ -39,7 +38,6 @@ import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.extractInterface.ExtractClassUtil; import com.intellij.refactoring.lang.ElementsHandler; import com.intellij.refactoring.memberPullUp.PullUpConflictsUtil; -import com.intellij.refactoring.ui.ConflictsDialog; import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.refactoring.util.DocCommentPolicy; import com.intellij.refactoring.util.classMembers.MemberInfo; @@ -142,15 +140,8 @@ public class ExtractSuperclassHandler implements RefactoringActionHandler, Extra conflicts.putAllValues(PullUpConflictsUtil.checkConflicts(infos, mySubclass, superClass, targetPackage, targetDirectory, dialog.getContainmentVerifier(), false)); } }, "Detecting possible conflicts...", true, myProject)) return false; - - if (!conflicts.isEmpty()) { - ConflictsDialog conflictsDialog = new ConflictsDialog(myProject, conflicts); - conflictsDialog.show(); - final boolean ok = conflictsDialog.isOK(); - if (!ok && conflictsDialog.isShowConflicts()) dialog.close(DialogWrapper.CANCEL_EXIT_CODE); - return ok; - } - return true; + ExtractSuperClassUtil.checkSuperAccessible(targetDirectory, conflicts, mySubclass); + return ExtractSuperClassUtil.showConflicts(dialog, conflicts, myProject); } // invoked inside Command and Atomic action