diff options
Diffstat (limited to 'java/java-impl/src/com/intellij/refactoring')
17 files changed, 285 insertions, 114 deletions
diff --git a/java/java-impl/src/com/intellij/refactoring/copy/CopyClassesHandler.java b/java/java-impl/src/com/intellij/refactoring/copy/CopyClassesHandler.java index b551616c93dc..49064514be38 100644 --- a/java/java-impl/src/com/intellij/refactoring/copy/CopyClassesHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/copy/CopyClassesHandler.java @@ -332,7 +332,7 @@ public class CopyClassesHandler extends CopyHandlerDelegateBase { for (final PsiClass[] psiClasses : fileToClasses.values()) { if (psiClasses != null) { for (PsiClass aClass : psiClasses) { - if (aClass instanceof SyntheticElement) { + if (isSynthetic(aClass)) { continue; } oldToNewMap.put(aClass, null); @@ -349,7 +349,7 @@ public class CopyClassesHandler extends CopyHandlerDelegateBase { final PsiFile createdFile = copy(psiFile, targetDirectory, copyClassName, map == null ? null : map.get(psiFile), choice); if (createdFile == null) return null; for (final PsiClass destination : ((PsiClassOwner)createdFile).getClasses()) { - if (destination instanceof SyntheticElement) { + if (isSynthetic(destination)) { continue; } PsiClass source = findByName(sources, destination.getName()); @@ -408,6 +408,10 @@ public class CopyClassesHandler extends CopyHandlerDelegateBase { return newElement != null ? newElement : createdFiles.size() > 0 ? createdFiles.get(0) : null; } + protected static boolean isSynthetic(PsiClass aClass) { + return aClass instanceof SyntheticElement || !aClass.isPhysical(); + } + private static PsiFile copy(@NotNull PsiFile file, PsiDirectory directory, String name, String relativePath, int[] choice) { final String fileName = getNewFileName(file, name); if (relativePath != null && !relativePath.isEmpty()) { @@ -420,9 +424,10 @@ public class CopyClassesHandler extends CopyHandlerDelegateBase { private static String getNewFileName(PsiFile file, String name) { if (name != null) { if (file instanceof PsiClassOwner) { - final PsiClass[] classes = ((PsiClassOwner)file).getClasses(); - if (classes.length > 0 && !(classes[0] instanceof SyntheticElement)) { - return name + "." + file.getViewProvider().getVirtualFile().getExtension(); + for (final PsiClass psiClass : ((PsiClassOwner)file).getClasses()) { + if (!isSynthetic(psiClass)) { + return name + "." + file.getViewProvider().getVirtualFile().getExtension(); + } } } return name; @@ -530,15 +535,14 @@ public class CopyClassesHandler extends CopyHandlerDelegateBase { if (element instanceof PsiCompiledElement) return null; if (element instanceof PsiClassOwner) { PsiClass[] classes = ((PsiClassOwner)element).getClasses(); - if (classes.length > 0) { - for (final PsiClass aClass : classes) { - if (aClass instanceof SyntheticElement) { - return null; - } + ArrayList<PsiClass> buffer = new ArrayList<PsiClass>(); + for (final PsiClass aClass : classes) { + if (isSynthetic(aClass)) { + return null; } - - return classes; + buffer.add(aClass); } + return buffer.toArray(new PsiClass[buffer.size()]); } return element instanceof PsiClass ? new PsiClass[]{(PsiClass)element} : null; } 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 b8f24bc16f1f..b3e43eb93938 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperclassHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperclassHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -59,6 +59,7 @@ public class ExtractSuperclassHandler implements RefactoringActionHandler, Extra private Project myProject; + @Override public void invoke(@NotNull Project project, Editor editor, PsiFile file, DataContext dataContext) { editor.getScrollingModel().scrollToCaret(ScrollType.MAKE_VISIBLE); int offset = editor.getCaretModel().getOffset(); @@ -77,6 +78,7 @@ public class ExtractSuperclassHandler implements RefactoringActionHandler, Extra } } + @Override public void invoke(@NotNull final Project project, @NotNull PsiElement[] elements, DataContext dataContext) { if (elements.length != 1) return; @@ -101,6 +103,7 @@ public class ExtractSuperclassHandler implements RefactoringActionHandler, Extra final List<MemberInfo> memberInfos = MemberInfo.extractClassMembers(mySubclass, new MemberInfo.Filter<PsiMember>() { + @Override public boolean includeMember(PsiMember element) { return true; } @@ -112,8 +115,10 @@ public class ExtractSuperclassHandler implements RefactoringActionHandler, Extra if (!dialog.isOK() || !dialog.isExtractSuperclass()) return; CommandProcessor.getInstance().executeCommand(myProject, new Runnable() { + @Override public void run() { final Runnable action = new Runnable() { + @Override public void run() { doRefactoring(project, mySubclass, dialog); } @@ -124,6 +129,7 @@ public class ExtractSuperclassHandler implements RefactoringActionHandler, Extra } + @Override public boolean checkConflicts(final ExtractSuperclassDialog dialog) { final MemberInfo[] infos = ArrayUtil.toObjectArray(dialog.getSelectedMemberInfos(), MemberInfo.class); final PsiDirectory targetDirectory = dialog.getTargetDirectory(); @@ -136,9 +142,17 @@ public class ExtractSuperclassHandler implements RefactoringActionHandler, Extra } final MultiMap<PsiElement,String> conflicts = new MultiMap<PsiElement, String>(); if (!ProgressManager.getInstance().runProcessWithProgressSynchronously(new Runnable() { + @Override public void run() { - final PsiClass superClass = mySubclass.getExtendsListTypes().length > 0 || mySubclass instanceof PsiAnonymousClass ? mySubclass.getSuperClass() : null; - conflicts.putAllValues(PullUpConflictsUtil.checkConflicts(infos, mySubclass, superClass, targetPackage, targetDirectory, dialog.getContainmentVerifier(), false)); + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + final PsiClass superClass = + mySubclass.getExtendsListTypes().length > 0 || mySubclass instanceof PsiAnonymousClass ? 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); @@ -168,6 +182,7 @@ public class ExtractSuperclassHandler implements RefactoringActionHandler, Extra final SmartPsiElementPointer<PsiClass> classPointer = SmartPointerManager.getInstance(project).createSmartPsiElementPointer(subclass); final SmartPsiElementPointer<PsiClass> interfacePointer = SmartPointerManager.getInstance(project).createSmartPsiElementPointer(superclass); final Runnable turnRefsToSuperRunnable = new Runnable() { + @Override public void run() { ExtractClassUtil.askAndTurnRefsToSuper(project, classPointer, interfacePointer); } @@ -185,6 +200,7 @@ public class ExtractSuperclassHandler implements RefactoringActionHandler, Extra return RefactoringBundle.message("extract.superclass.command.name", newName, DescriptiveNameUtil.getDescriptiveName(subclass)); } + @Override public boolean isEnabledOnElements(PsiElement[] elements) { return elements.length == 1 && elements[0] instanceof PsiClass && !((PsiClass) elements[0]).isInterface() &&!((PsiClass)elements[0]).isEnum(); diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineConstantFieldHandler.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineConstantFieldHandler.java index b82953534b8c..ddfb057460ab 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineConstantFieldHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineConstantFieldHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ package com.intellij.refactoring.inline; import com.intellij.codeInsight.TargetElementUtilBase; import com.intellij.lang.StdLanguages; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; @@ -35,10 +36,12 @@ import com.intellij.refactoring.util.CommonRefactoringUtil; public class InlineConstantFieldHandler extends JavaInlineActionHandler { private static final String REFACTORING_NAME = RefactoringBundle.message("inline.field.title"); + @Override public boolean canInlineElement(PsiElement element) { return element instanceof PsiField && StdLanguages.JAVA.equals(element.getLanguage()); } + @Override public void inlineElement(Project project, Editor editor, PsiElement element) { final PsiElement navigationElement = element.getNavigationElement(); final PsiField field = (PsiField)(navigationElement instanceof PsiField ? navigationElement : element); @@ -66,13 +69,18 @@ public class InlineConstantFieldHandler extends JavaInlineActionHandler { if (!ProgressManager.getInstance().runProcessWithProgressSynchronously(new Runnable() { @Override public void run() { - for (PsiReference reference : ReferencesSearch.search(field)) { - final PsiElement referenceElement = reference.getElement(); - if (!(referenceElement instanceof PsiExpression && PsiUtil.isAccessedForReading((PsiExpression)referenceElement))) { - hasWriteUsages.set(true); - break; + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + for (PsiReference reference : ReferencesSearch.search(field)) { + final PsiElement referenceElement = reference.getElement(); + if (!(referenceElement instanceof PsiExpression && PsiUtil.isAccessedForReading((PsiExpression)referenceElement))) { + hasWriteUsages.set(true); + break; + } + } } - } + }); } }, "Check if inline is possible...", true, project)) { return; diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterHandler.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterHandler.java index 2b285553bc24..b8097d7376f6 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterHandler.java @@ -200,7 +200,7 @@ public class InlineParameterHandler extends JavaInlineActionHandler { } if (!ApplicationManager.getApplication().isUnitTestMode()) { - String occurencesString = RefactoringBundle.message("occurences.string", occurrences.size()); + String occurencesString = RefactoringBundle.message("occurrences.string", occurrences.size()); String question = RefactoringBundle.message("inline.parameter.confirmation", psiParameter.getName(), constantExpression.getText()) + " " + occurencesString; RefactoringMessageDialog dialog = new RefactoringMessageDialog( diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineToAnonymousClassHandler.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineToAnonymousClassHandler.java index e17326844249..8d7995fbf1b0 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineToAnonymousClassHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineToAnonymousClassHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -91,7 +91,7 @@ public class InlineToAnonymousClassHandler extends JavaInlineActionHandler { }); } }, "Searching for class \"" + element.getQualifiedName() + "\" inheritors ...", true, element.getProject())) return false; - return inheritors.size() == 0; + return inheritors.isEmpty(); } @Override @@ -124,7 +124,12 @@ public class InlineToAnonymousClassHandler extends JavaInlineActionHandler { if (!ProgressManager.getInstance().runProcessWithProgressSynchronously(new Runnable(){ @Override public void run() { - errorMessage.set(getCannotInlineMessage(psiClass)); + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + errorMessage.set(getCannotInlineMessage(psiClass)); + } + }); } }, "Check if inline is possible...", true, project)) return; if (errorMessage.get() != null) { diff --git a/java/java-impl/src/com/intellij/refactoring/makeStatic/MakeMethodStaticProcessor.java b/java/java-impl/src/com/intellij/refactoring/makeStatic/MakeMethodStaticProcessor.java index de5efa573d8a..64afbfa17e84 100644 --- a/java/java-impl/src/com/intellij/refactoring/makeStatic/MakeMethodStaticProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/makeStatic/MakeMethodStaticProcessor.java @@ -27,6 +27,7 @@ import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.refactoring.util.javadoc.MethodJavaDocHelper; import com.intellij.usageView.UsageInfo; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.MultiMap; import java.util.ArrayList; import java.util.List; @@ -41,6 +42,20 @@ public class MakeMethodStaticProcessor extends MakeMethodOrClassStaticProcessor< super(project, method, settings); } + @Override + protected MultiMap<PsiElement, String> getConflictDescriptions(UsageInfo[] usages) { + MultiMap<PsiElement, String> descriptions = super.getConflictDescriptions(usages); + if (mySettings.isMakeClassParameter()) { + for (UsageInfo usage : usages) { + PsiElement element = usage.getElement(); + if (element instanceof PsiMethodReferenceExpression) { + descriptions.putValue(element, "Method reference will be corrupted"); + } + } + } + return descriptions; + } + protected void changeSelfUsage(SelfUsageInfo usageInfo) throws IncorrectOperationException { PsiElement parent = usageInfo.getElement().getParent(); LOG.assertTrue(parent instanceof PsiMethodCallExpression); diff --git a/java/java-impl/src/com/intellij/refactoring/memberPullUp/JavaPullUpHandler.java b/java/java-impl/src/com/intellij/refactoring/memberPullUp/JavaPullUpHandler.java index 2cbf7a0adcee..5a21d945fd79 100644 --- a/java/java-impl/src/com/intellij/refactoring/memberPullUp/JavaPullUpHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/memberPullUp/JavaPullUpHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,6 +26,7 @@ package com.intellij.refactoring.memberPullUp; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.ScrollType; @@ -55,6 +56,7 @@ public class JavaPullUpHandler implements RefactoringActionHandler, PullUpDialog private PsiClass mySubclass; private Project myProject; + @Override public void invoke(@NotNull Project project, Editor editor, PsiFile file, DataContext dataContext) { int offset = editor.getCaretModel().getOffset(); editor.getScrollingModel().scrollToCaret(ScrollType.MAKE_VISIBLE); @@ -78,6 +80,7 @@ public class JavaPullUpHandler implements RefactoringActionHandler, PullUpDialog } } + @Override public void invoke(@NotNull final Project project, @NotNull PsiElement[] elements, DataContext dataContext) { if (elements.length != 1) return; myProject = project; @@ -130,6 +133,7 @@ public class JavaPullUpHandler implements RefactoringActionHandler, PullUpDialog mySubclass = aClass; MemberInfoStorage memberInfoStorage = new MemberInfoStorage(mySubclass, new MemberInfo.Filter<PsiMember>() { + @Override public boolean includeMember(PsiMember element) { return true; } @@ -152,6 +156,7 @@ public class JavaPullUpHandler implements RefactoringActionHandler, PullUpDialog + @Override public boolean checkConflicts(final PullUpDialog dialog) { final List<MemberInfo> infos = dialog.getSelectedMemberInfos(); final MemberInfo[] memberInfos = infos.toArray(new MemberInfo[infos.size()]); @@ -159,11 +164,18 @@ public class JavaPullUpHandler implements RefactoringActionHandler, PullUpDialog if (!checkWritable(superClass, memberInfos)) return false; final MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>(); if (!ProgressManager.getInstance().runProcessWithProgressSynchronously(new Runnable() { + @Override public void run() { - final PsiDirectory targetDirectory = superClass.getContainingFile().getContainingDirectory(); - final PsiPackage targetPackage = targetDirectory != null ? JavaDirectoryService.getInstance().getPackage(targetDirectory) : null; - conflicts - .putAllValues(PullUpConflictsUtil.checkConflicts(memberInfos, mySubclass, superClass, targetPackage, targetDirectory, dialog.getContainmentVerifier())); + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + final PsiDirectory targetDirectory = superClass.getContainingFile().getContainingDirectory(); + final PsiPackage targetPackage = targetDirectory != null ? JavaDirectoryService.getInstance().getPackage(targetDirectory) : null; + conflicts + .putAllValues(PullUpConflictsUtil.checkConflicts(memberInfos, mySubclass, superClass, targetPackage, targetDirectory, dialog.getContainmentVerifier())); + } + }); + } }, RefactoringBundle.message("detecting.possible.conflicts"), true, myProject)) return false; if (!conflicts.isEmpty()) { @@ -185,6 +197,7 @@ public class JavaPullUpHandler implements RefactoringActionHandler, PullUpDialog return true; } + @Override public boolean isEnabledOnElements(PsiElement[] elements) { /* if (elements.length == 1) { diff --git a/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpProcessor.java b/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpProcessor.java index 4531e391f838..353898cafe51 100644 --- a/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -68,7 +68,7 @@ public class PullUpProcessor extends BaseRefactoringProcessor implements PullUpD private final DocCommentPolicy myJavaDocPolicy; private Set<PsiMember> myMembersAfterMove = null; private Set<PsiMember> myMovedMembers = null; - private Map<Language, PullUpHelper<MemberInfo>> myProcessors = ContainerUtil.newHashMap(); + private final Map<Language, PullUpHelper<MemberInfo>> myProcessors = ContainerUtil.newHashMap(); public PullUpProcessor(PsiClass sourceClass, PsiClass targetSuperClass, MemberInfo[] membersToMove, DocCommentPolicy javaDocPolicy) { super(sourceClass.getProject()); @@ -78,11 +78,13 @@ public class PullUpProcessor extends BaseRefactoringProcessor implements PullUpD myJavaDocPolicy = javaDocPolicy; } + @Override @NotNull protected UsageViewDescriptor createUsageViewDescriptor(UsageInfo[] usages) { return new PullUpUsageViewDescriptor(); } + @Override @NotNull protected UsageInfo[] findUsages() { final List<UsageInfo> result = new ArrayList<UsageInfo>(); @@ -125,6 +127,7 @@ public class PullUpProcessor extends BaseRefactoringProcessor implements PullUpD return data; } + @Override protected void performRefactoring(UsageInfo[] usages) { moveMembersToBase(); moveFieldInitializations(); @@ -148,29 +151,35 @@ public class PullUpProcessor extends BaseRefactoringProcessor implements PullUpD ProgressManager.getInstance().runProcessWithProgressSynchronously(new Runnable() { @Override public void run() { - final Query<PsiClass> search = ClassInheritorsSearch.search(myTargetSuperClass); - final Set<VirtualFile> hierarchyFiles = new HashSet<VirtualFile>(); - for (PsiClass aClass : search) { - final PsiFile containingFile = aClass.getContainingFile(); - if (containingFile != null) { - final VirtualFile virtualFile = containingFile.getVirtualFile(); - if (virtualFile != null) { - hierarchyFiles.add(virtualFile); + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + final Query<PsiClass> search = ClassInheritorsSearch.search(myTargetSuperClass); + final Set<VirtualFile> hierarchyFiles = new HashSet<VirtualFile>(); + for (PsiClass aClass : search) { + final PsiFile containingFile = aClass.getContainingFile(); + if (containingFile != null) { + final VirtualFile virtualFile = containingFile.getVirtualFile(); + if (virtualFile != null) { + hierarchyFiles.add(virtualFile); + } + } + } + final Set<PsiMember> methodsToSearchDuplicates = new HashSet<PsiMember>(); + for (PsiMember psiMember : myMembersAfterMove) { + if (psiMember instanceof PsiMethod && psiMember.isValid() && ((PsiMethod)psiMember).getBody() != null) { + methodsToSearchDuplicates.add(psiMember); + } } - } - } - final Set<PsiMember> methodsToSearchDuplicates = new HashSet<PsiMember>(); - for (PsiMember psiMember : myMembersAfterMove) { - if (psiMember instanceof PsiMethod && psiMember.isValid() && ((PsiMethod)psiMember).getBody() != null) { - methodsToSearchDuplicates.add(psiMember); - } - } - MethodDuplicatesHandler.invokeOnScope(myProject, methodsToSearchDuplicates, new AnalysisScope(myProject, hierarchyFiles), true); + MethodDuplicatesHandler.invokeOnScope(myProject, methodsToSearchDuplicates, new AnalysisScope(myProject, hierarchyFiles), true); + } + }); } }, MethodDuplicatesHandler.REFACTORING_NAME, true, myProject); } + @Override protected String getCommandName() { return RefactoringBundle.message("pullUp.command", DescriptiveNameUtil.getDescriptiveName(mySourceClass)); } @@ -303,19 +312,23 @@ public class PullUpProcessor extends BaseRefactoringProcessor implements PullUpD } private class PullUpUsageViewDescriptor implements UsageViewDescriptor { + @Override public String getProcessedElementsHeader() { return "Pull up members from"; } + @Override @NotNull public PsiElement[] getElements() { return new PsiElement[]{mySourceClass}; } + @Override public String getCodeReferencesText(int usagesCount, int filesCount) { return "Class to pull up members to \"" + RefactoringUIUtil.getDescription(myTargetSuperClass, true) + "\""; } + @Override public String getCommentReferencesText(int usagesCount, int filesCount) { return null; } diff --git a/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownProcessor.java b/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownProcessor.java index ca3298bc97b2..bb09c69c9fcc 100644 --- a/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ import com.intellij.codeInsight.AnnotationUtil; import com.intellij.codeInsight.ChangeContextUtil; import com.intellij.codeInsight.intention.impl.CreateClassDialog; import com.intellij.codeInsight.intention.impl.CreateSubclassAction; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; @@ -72,10 +73,12 @@ public class PushDownProcessor extends BaseRefactoringProcessor { myJavaDocPolicy = javaDocPolicy; } + @Override protected String getCommandName() { return JavaPushDownHandler.REFACTORING_NAME; } + @Override @NotNull protected UsageViewDescriptor createUsageViewDescriptor(UsageInfo[] usages) { return new PushDownUsageViewDescriptor(myClass); @@ -116,6 +119,7 @@ public class PushDownProcessor extends BaseRefactoringProcessor { return data; } + @Override @NotNull protected UsageInfo[] findUsages() { final PsiClass[] inheritors = ClassInheritorsSearch.search(myClass, false).toArray(PsiClass.EMPTY_ARRAY); @@ -147,6 +151,7 @@ public class PushDownProcessor extends BaseRefactoringProcessor { return false; } + @Override protected boolean preprocessUsages(final Ref<UsageInfo[]> refUsages) { final UsageInfo[] usagesIn = refUsages.get(); final PushDownConflicts pushDownConflicts = new PushDownConflicts(myClass, myMemberInfos); @@ -177,13 +182,19 @@ public class PushDownProcessor extends BaseRefactoringProcessor { } } Runnable runnable = new Runnable() { + @Override public void run() { - for (UsageInfo usage : usagesIn) { - final PsiElement element = usage.getElement(); - if (element instanceof PsiClass) { - pushDownConflicts.checkTargetClassConflicts((PsiClass)element, usagesIn.length > 1, element); + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + for (UsageInfo usage : usagesIn) { + final PsiElement element = usage.getElement(); + if (element instanceof PsiClass) { + pushDownConflicts.checkTargetClassConflicts((PsiClass)element, usagesIn.length > 1, element); + } + } } - } + }); } }; @@ -204,6 +215,7 @@ public class PushDownProcessor extends BaseRefactoringProcessor { return showConflicts(pushDownConflicts.getConflicts(), usagesIn); } + @Override protected void refreshElements(PsiElement[] elements) { if(elements.length == 1 && elements[0] instanceof PsiClass) { myClass = (PsiClass) elements[0]; @@ -213,6 +225,7 @@ public class PushDownProcessor extends BaseRefactoringProcessor { } } + @Override protected void performRefactoring(UsageInfo[] usages) { try { encodeRefs(); @@ -509,6 +522,7 @@ public class PushDownProcessor extends BaseRefactoringProcessor { decodeRefs(newMember, targetClass); //rebind imports first Collections.sort(refsToRebind, new Comparator<PsiReference>() { + @Override public int compare(PsiReference o1, PsiReference o2) { return PsiUtil.BY_POSITION.compare(o1.getElement(), o2.getElement()); } diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesImpl.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesImpl.java index 3e92a19373ab..844eb2dc0611 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesImpl.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -88,7 +88,7 @@ public class MoveClassesOrPackagesImpl { if (element instanceof PsiDirectory) { PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage((PsiDirectory)element); LOG.assertTrue(aPackage != null); - if (aPackage.getQualifiedName().length() == 0) { //is default package + if (aPackage.getQualifiedName().isEmpty()) { //is default package String message = RefactoringBundle.message("move.package.refactoring.cannot.be.applied.to.default.package"); CommonRefactoringUtil.showErrorMessage(RefactoringBundle.message("move.title"), message, HelpID.getMoveHelpID(element), project); return null; @@ -167,7 +167,7 @@ public class MoveClassesOrPackagesImpl { message.append(RefactoringBundle.message("do.you.wish.to.continue")); int ret = Messages.showYesNoDialog(project, message.toString(), RefactoringBundle.message("warning.title"), Messages.getWarningIcon()); - if (ret != 0) { + if (ret != Messages.YES) { return false; } } @@ -323,8 +323,15 @@ public class MoveClassesOrPackagesImpl { if (selectedTarget == null) return; final MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>(); final Runnable analyzeConflicts = new Runnable() { + @Override public void run() { - RefactoringConflictsUtil.analyzeModuleConflicts(project, Arrays.asList(directories), UsageInfo.EMPTY_ARRAY, selectedTarget, conflicts); + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + RefactoringConflictsUtil + .analyzeModuleConflicts(project, Arrays.asList(directories), UsageInfo.EMPTY_ARRAY, selectedTarget, conflicts); + } + }); } }; if (!ProgressManager.getInstance().runProcessWithProgressSynchronously(analyzeConflicts, "Analyze Module Conflicts...", true, project)) { @@ -345,8 +352,10 @@ public class MoveClassesOrPackagesImpl { final Ref<IncorrectOperationException> ex = Ref.create(null); final String commandDescription = RefactoringBundle.message("moving.directories.command"); Runnable runnable = new Runnable() { + @Override public void run() { ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override public void run() { LocalHistoryAction a = LocalHistory.getInstance().startAction(commandDescription); try { diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java index f398dfdd115a..0e02b8f94e28 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java @@ -23,7 +23,6 @@ import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.wm.WindowManager; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.PackageScope; @@ -48,7 +47,6 @@ import com.intellij.refactoring.util.classRefs.ClassReferenceScanner; import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageViewDescriptor; import com.intellij.usageView.UsageViewUtil; -import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.Processor; import com.intellij.util.VisibilityUtil; @@ -472,9 +470,7 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor { } protected boolean isPreviewUsages(UsageInfo[] usages) { - if (UsageViewUtil.hasNonCodeUsages(usages)) { - WindowManager.getInstance().getStatusBar(myProject).setInfo( - RefactoringBundle.message("occurrences.found.in.comments.strings.and.non.java.files")); + if (UsageViewUtil.reportNonRegularUsages(usages, myProject)) { return true; } else { diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerClassJavaUsagesHandler.java b/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerClassJavaUsagesHandler.java new file mode 100644 index 000000000000..0589e6d8e187 --- /dev/null +++ b/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerClassJavaUsagesHandler.java @@ -0,0 +1,58 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.refactoring.move.moveInner; + +import com.intellij.psi.*; +import com.intellij.refactoring.util.RefactoringChangeUtil; +import com.intellij.usageView.UsageInfo; +import org.jetbrains.annotations.NotNull; + +public class MoveInnerClassJavaUsagesHandler implements MoveInnerClassUsagesHandler { + @Override + public void correctInnerClassUsage(@NotNull UsageInfo usage, @NotNull PsiClass outerClass) { + PsiElement refElement = usage.getElement(); + if (refElement == null) return; + + PsiManager manager = refElement.getManager(); + + PsiElement refParent = refElement.getParent(); + if (refParent instanceof PsiNewExpression || refParent instanceof PsiAnonymousClass) { + PsiNewExpression newExpr = refParent instanceof PsiNewExpression + ? (PsiNewExpression)refParent + : (PsiNewExpression)refParent.getParent(); + + PsiExpressionList argList = newExpr.getArgumentList(); + + if (argList != null) { // can happen in incomplete code + if (newExpr.getQualifier() == null) { + PsiThisExpression thisExpr; + PsiClass parentClass = RefactoringChangeUtil.getThisClass(newExpr); + if (outerClass.equals(parentClass)) { + thisExpr = RefactoringChangeUtil.createThisExpression(manager, null); + } + else { + thisExpr = RefactoringChangeUtil.createThisExpression(manager, outerClass); + } + argList.addAfter(thisExpr, null); + } + else { + argList.addAfter(newExpr.getQualifier(), null); + newExpr.getQualifier().delete(); + } + } + } + } +}
\ No newline at end of file diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerClassUsagesHandler.java b/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerClassUsagesHandler.java new file mode 100644 index 000000000000..97946456d6fb --- /dev/null +++ b/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerClassUsagesHandler.java @@ -0,0 +1,28 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.refactoring.move.moveInner; + +import com.intellij.lang.LanguageExtension; +import com.intellij.psi.PsiClass; +import com.intellij.usageView.UsageInfo; +import org.jetbrains.annotations.NotNull; + +public interface MoveInnerClassUsagesHandler { + LanguageExtension<MoveInnerClassUsagesHandler> EP_NAME = + new LanguageExtension<MoveInnerClassUsagesHandler>("com.intellij.refactoring.moveInnerClassUsagesHandler"); + + void correctInnerClassUsage(@NotNull UsageInfo usage, @NotNull PsiClass outerClass); +}
\ No newline at end of file diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerProcessor.java b/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerProcessor.java index d4239e578016..d56b8c02844e 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerProcessor.java @@ -214,35 +214,11 @@ public class MoveInnerProcessor extends BaseRefactoringProcessor { // correct references in usages for (UsageInfo usage : usages) { - if (usage.isNonCodeUsage) continue; - PsiElement refElement = usage.getElement(); - if (myParameterNameOuterClass != null) { // should pass outer as parameter - PsiElement refParent = refElement.getParent(); - if (refParent instanceof PsiNewExpression || refParent instanceof PsiAnonymousClass) { - PsiNewExpression newExpr = refParent instanceof PsiNewExpression - ? (PsiNewExpression)refParent - : (PsiNewExpression)refParent.getParent(); - - PsiExpressionList argList = newExpr.getArgumentList(); - - if (argList != null) { // can happen in incomplete code - if (newExpr.getQualifier() == null) { - PsiThisExpression thisExpr; - PsiClass parentClass = RefactoringChangeUtil.getThisClass(newExpr); - if (myOuterClass.equals(parentClass)) { - thisExpr = RefactoringChangeUtil.createThisExpression(manager, null); - } - else { - thisExpr = RefactoringChangeUtil.createThisExpression(manager, myOuterClass); - } - argList.addAfter(thisExpr, null); - } - else { - argList.addAfter(newExpr.getQualifier(), null); - newExpr.getQualifier().delete(); - } - } - } + if (usage.isNonCodeUsage || myParameterNameOuterClass == null) continue; // should pass outer as parameter + + MoveInnerClassUsagesHandler usagesHandler = MoveInnerClassUsagesHandler.EP_NAME.forLanguage(usage.getElement().getLanguage()); + if (usagesHandler != null) { + usagesHandler.correctInnerClassUsage(usage, myOuterClass); } } @@ -554,4 +530,4 @@ public class MoveInnerProcessor extends BaseRefactoringProcessor { public String getParameterName() { return myParameterNameOuterClass; } -} +}
\ No newline at end of file diff --git a/java/java-impl/src/com/intellij/refactoring/turnRefsToSuper/TurnRefsToSuperProcessorBase.java b/java/java-impl/src/com/intellij/refactoring/turnRefsToSuper/TurnRefsToSuperProcessorBase.java index 1ed6de9ced09..b4142228f01f 100644 --- a/java/java-impl/src/com/intellij/refactoring/turnRefsToSuper/TurnRefsToSuperProcessorBase.java +++ b/java/java-impl/src/com/intellij/refactoring/turnRefsToSuper/TurnRefsToSuperProcessorBase.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -69,6 +69,7 @@ public abstract class TurnRefsToSuperProcessorBase extends BaseRefactoringProces private final String mySuperClassName; private final List<UsageInfo> myVariablesUsages = new ArrayList<UsageInfo>(); + @Override protected boolean preprocessUsages(Ref<UsageInfo[]> refUsages) { UsageInfo[] usages = refUsages.get(); List<UsageInfo> filtered = new ArrayList<UsageInfo>(); @@ -93,8 +94,14 @@ public abstract class TurnRefsToSuperProcessorBase extends BaseRefactoringProces } Runnable runnable = new Runnable() { + @Override public void run() { - myVariableRenamer.findUsages(myVariablesUsages, false, false); + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + myVariableRenamer.findUsages(myVariablesUsages, false, false); + } + }); } }; @@ -338,6 +345,7 @@ public abstract class TurnRefsToSuperProcessorBase extends BaseRefactoringProces if (substitutor == null) return; final LocalSearchScope baseScope = new LocalSearchScope(ownerClass); ReferencesSearch.search(typeParameter, baseScope).forEach(new Processor<PsiReference>() { + @Override public boolean process(final PsiReference ref) { final PsiElement element = ref.getElement(); final PsiElement parent = element.getParent(); @@ -708,6 +716,7 @@ public abstract class TurnRefsToSuperProcessorBase extends BaseRefactoringProces } class Colorer implements OneEndFunctor { + @Override public Mark compute(Mark from, Mark edge, Mark to) { VisitMark mark = new VisitMark((VisitMark)to); @@ -737,6 +746,7 @@ public abstract class TurnRefsToSuperProcessorBase extends BaseRefactoringProces private boolean myVisited; private final PsiElement myElement; + @Override public boolean coincidesWith(Mark x) { return ((VisitMark)x).myVisited == myVisited; } @@ -773,10 +783,12 @@ public abstract class TurnRefsToSuperProcessorBase extends BaseRefactoringProces myMark = new VisitMark(x); } + @Override public Mark getMark() { return myMark; } + @Override public void setMark(Mark x) { myMark = (VisitMark)x; } diff --git a/java/java-impl/src/com/intellij/refactoring/typeMigration/TypeMigrationProcessor.java b/java/java-impl/src/com/intellij/refactoring/typeMigration/TypeMigrationProcessor.java index 609a981b7bf4..2998ec6b0f07 100644 --- a/java/java-impl/src/com/intellij/refactoring/typeMigration/TypeMigrationProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/typeMigration/TypeMigrationProcessor.java @@ -88,28 +88,32 @@ public class TypeMigrationProcessor extends BaseRefactoringProcessor { final Editor editor, final TypeMigrationRules rules, final PsiElement root) { + final PsiFile containingFile = root.getContainingFile(); final TypeMigrationProcessor processor = new TypeMigrationProcessor(project, root, rules) { @Override public void performRefactoring(final UsageInfo[] usages) { super.performRefactoring(usages); - ApplicationManager.getApplication().invokeLater(new Runnable() { - public void run() { - final List<PsiElement> result = new ArrayList<PsiElement>(); - for (UsageInfo usage : usages) { - final PsiElement element = usage.getElement(); - if (element instanceof PsiMethod) { - result.add(((PsiMethod)element).getReturnTypeElement()); - } - else if (element instanceof PsiVariable) { - result.add(((PsiVariable)element).getTypeElement()); - } - else if (element != null) { - result.add(element); + if (editor != null) { + ApplicationManager.getApplication().invokeLater(new Runnable() { + public void run() { + final List<PsiElement> result = new ArrayList<PsiElement>(); + for (UsageInfo usage : usages) { + final PsiElement element = usage.getElement(); + if (element == null || containingFile != element.getContainingFile()) continue; + if (element instanceof PsiMethod) { + result.add(((PsiMethod)element).getReturnTypeElement()); + } + else if (element instanceof PsiVariable) { + result.add(((PsiVariable)element).getTypeElement()); + } + else { + result.add(element); + } } + RefactoringUtil.highlightAllOccurrences(project, PsiUtilCore.toPsiElementArray(result), editor); } - if (editor != null) RefactoringUtil.highlightAllOccurrences(project, PsiUtilCore.toPsiElementArray(result), editor); - } - }); + }); + } } }; processor.run(); diff --git a/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java b/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java index ca01331d3e94..ed08349519a7 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java @@ -677,7 +677,7 @@ public class RefactoringUtil { public static PsiExpression convertInitializerToNormalExpression(PsiExpression expression, PsiType forcedReturnType) throws IncorrectOperationException { - if (expression instanceof PsiArrayInitializerExpression) { + if (expression instanceof PsiArrayInitializerExpression && (forcedReturnType == null || forcedReturnType instanceof PsiArrayType)) { return createNewExpressionFromArrayInitializer((PsiArrayInitializerExpression)expression, forcedReturnType); } return expression; |