public boolean checkConflicts(final ExtractSuperclassDialog dialog) { final MemberInfo[] infos = ArrayUtil.toObjectArray(dialog.getSelectedMemberInfos(), MemberInfo.class); final PsiDirectory targetDirectory = dialog.getTargetDirectory(); final PsiPackage targetPackage; if (targetDirectory != null) { targetPackage = JavaDirectoryService.getInstance().getPackage(targetDirectory); } else { targetPackage = null; } final MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>(); if (!ProgressManager.getInstance() .runProcessWithProgressSynchronously( new Runnable() { public void run() { final PsiClass superClass = mySubclass.getExtendsListTypes().length > 0 ? mySubclass.getSuperClass() : null; conflicts.putAllValues( PullUpConflictsUtil.checkConflicts( infos, mySubclass, superClass, targetPackage, targetDirectory, dialog.getContainmentVerifier(), false)); } }, RefactoringBundle.message("detecting.possible.conflicts"), true, myProject)) return false; ExtractSuperClassUtil.checkSuperAccessible(targetDirectory, conflicts, mySubclass); return ExtractSuperClassUtil.showConflicts(dialog, conflicts, myProject); }
// invoked inside Command and Atomic action private void doRefactoring( final Project project, final PsiClass subclass, final ExtractSuperclassDialog dialog) { final String superclassName = dialog.getExtractedSuperName(); final PsiDirectory targetDirectory = dialog.getTargetDirectory(); final MemberInfo[] selectedMemberInfos = ArrayUtil.toObjectArray(dialog.getSelectedMemberInfos(), MemberInfo.class); final DocCommentPolicy javaDocPolicy = new DocCommentPolicy(dialog.getDocCommentPolicy()); LocalHistoryAction a = LocalHistory.getInstance().startAction(getCommandName(subclass, superclassName)); try { final PsiClass superclass; try { superclass = ExtractSuperClassUtil.extractSuperClass( project, targetDirectory, superclassName, subclass, selectedMemberInfos, javaDocPolicy); } finally { a.finish(); } // ask whether to search references to subclass and turn them into refs to superclass if // possible if (superclass != null) { final SmartPsiElementPointer<PsiClass> classPointer = SmartPointerManager.getInstance(project).createSmartPsiElementPointer(subclass); final SmartPsiElementPointer<PsiClass> interfacePointer = SmartPointerManager.getInstance(project).createSmartPsiElementPointer(superclass); final Runnable turnRefsToSuperRunnable = new Runnable() { public void run() { ExtractClassUtil.askAndTurnRefsToSuper(project, classPointer, interfacePointer); } }; SwingUtilities.invokeLater(turnRefsToSuperRunnable); } } catch (IncorrectOperationException e) { LOG.error(e); } }
public void invoke( @NotNull final Project project, @NotNull PsiElement[] elements, DataContext dataContext) { if (elements.length != 1) return; myProject = project; mySubclass = (PsiClass) elements[0]; if (!CommonRefactoringUtil.checkReadOnlyStatus(project, mySubclass)) return; Editor editor = dataContext != null ? PlatformDataKeys.EDITOR.getData(dataContext) : null; if (mySubclass.isInterface()) { String message = RefactoringBundle.getCannotRefactorMessage( RefactoringBundle.message("superclass.cannot.be.extracted.from.an.interface")); CommonRefactoringUtil.showErrorHint( project, editor, message, REFACTORING_NAME, HelpID.EXTRACT_SUPERCLASS); return; } if (mySubclass.isEnum()) { String message = RefactoringBundle.getCannotRefactorMessage( RefactoringBundle.message("superclass.cannot.be.extracted.from.an.enum")); CommonRefactoringUtil.showErrorHint( project, editor, message, REFACTORING_NAME, HelpID.EXTRACT_SUPERCLASS); return; } final List<MemberInfo> memberInfos = MemberInfo.extractClassMembers( mySubclass, new MemberInfo.Filter<PsiMember>() { public boolean includeMember(PsiMember element) { return true; } }, false); final ExtractSuperclassDialog dialog = new ExtractSuperclassDialog( project, mySubclass, memberInfos, ExtractSuperclassHandler.this); dialog.show(); if (!dialog.isOK() || !dialog.isExtractSuperclass()) return; CommandProcessor.getInstance() .executeCommand( myProject, new Runnable() { public void run() { final Runnable action = new Runnable() { public void run() { doRefactoring(project, mySubclass, dialog); } }; ApplicationManager.getApplication().runWriteAction(action); } }, REFACTORING_NAME, null); }