diff options
author | Andrey Loskutov | 2020-03-02 07:18:35 +0000 |
---|---|---|
committer | Andrey Loskutov | 2020-03-14 20:13:42 +0000 |
commit | b7564aa1baedc14b7ca0b8204cb34aa2e3585c3c (patch) | |
tree | 040083ad4323692a2cca7fe95d2c2f3dd6228a1c | |
parent | 4c5f597747ad676c4d5700bf686e52a6f17c090f (diff) | |
download | eclipse.jdt.ui-b7564aa1baedc14b7ca0b8204cb34aa2e3585c3c.tar.gz eclipse.jdt.ui-b7564aa1baedc14b7ca0b8204cb34aa2e3585c3c.tar.xz eclipse.jdt.ui-b7564aa1baedc14b7ca0b8204cb34aa2e3585c3c.zip |
Bug 551676 - get rid of duplicated code in working set actionsI20200314-1800
Preparation for original fix - lot of duplicated code makes it hard to
refactor.
Change-Id: Id512969fa3bf740acd82925d03167c4b047bdd67
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
4 files changed, 59 insertions, 66 deletions
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/FindAction.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/FindAction.java index 9f10664d7c..9c32493d98 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/FindAction.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/FindAction.java @@ -17,6 +17,7 @@ import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.concurrent.atomic.AtomicReference; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IStatus; @@ -29,6 +30,7 @@ import org.eclipse.jface.window.Window; import org.eclipse.jface.text.ITextSelection; import org.eclipse.ui.IWorkbenchSite; +import org.eclipse.ui.IWorkingSet; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.ElementListSelectionDialog; import org.eclipse.ui.progress.IProgressService; @@ -358,12 +360,47 @@ public abstract class FindAction extends SelectionDispatchAction { * @throws InterruptedException thrown when the user interrupted the query selection */ QuerySpecification createQuery(IJavaElement element) throws JavaModelException, InterruptedException { + return createDefaultQuery(element); + } + + QuerySpecification createDefaultQuery(IJavaElement element) { JavaSearchScopeFactory factory= JavaSearchScopeFactory.getInstance(); IJavaSearchScope scope= factory.createWorkspaceScope(true); String description= factory.getWorkspaceScopeDescription(true); return new ElementQuerySpecification(element, getLimitTo(), scope, description); } + /** + * @param element non null + * @param action non null + * @param toUpdate working sets array reference that will be updated in this method + * @return {@link QuerySpecification} for given object and action, that depends on action state + * @throws InterruptedException if working sets query fail + */ + static QuerySpecification createQueryWithWorkingSets(IJavaElement element, FindAction action, AtomicReference<IWorkingSet[]> toUpdate) throws InterruptedException { + JavaSearchScopeFactory factory= JavaSearchScopeFactory.getInstance(); + + final IWorkingSet[] workingSets; + if (toUpdate.get() == null && action.isFirstElement()) { + workingSets= factory.queryWorkingSets(); + if (workingSets == null) { + return action.createDefaultQuery(element); // workspace + } + if (action.isMultiSelect()) { + toUpdate.set(workingSets); + } + } else if (action.isMultiSelect() && action.isLastElement()) { + workingSets = toUpdate.get(); + toUpdate.set(null); + } else { + workingSets = toUpdate.get(); + } + SearchUtil.updateLRUWorkingSets(workingSets); + IJavaSearchScope scope= factory.createJavaSearchScope(workingSets, JavaSearchScopeFactory.NO_PROJ); + String description= factory.getWorkingSetScopeDescription(workingSets, JavaSearchScopeFactory.NO_PROJ); + return new ElementQuerySpecification(element, action.getLimitTo(), scope, description); + } + abstract int getLimitTo(); IType getType(IJavaElement element) { diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/FindDeclarationsInWorkingSetAction.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/FindDeclarationsInWorkingSetAction.java index a302fb3274..d3181ffddd 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/FindDeclarationsInWorkingSetAction.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/FindDeclarationsInWorkingSetAction.java @@ -13,23 +13,21 @@ *******************************************************************************/ package org.eclipse.jdt.ui.actions; +import java.util.concurrent.atomic.AtomicReference; + import org.eclipse.ui.IWorkbenchSite; import org.eclipse.ui.IWorkingSet; import org.eclipse.ui.PlatformUI; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.JavaModelException; -import org.eclipse.jdt.core.search.IJavaSearchScope; -import org.eclipse.jdt.ui.search.ElementQuerySpecification; import org.eclipse.jdt.ui.search.QuerySpecification; import org.eclipse.jdt.internal.ui.IJavaHelpContextIds; import org.eclipse.jdt.internal.ui.JavaPluginImages; import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor; -import org.eclipse.jdt.internal.ui.search.JavaSearchScopeFactory; import org.eclipse.jdt.internal.ui.search.SearchMessages; -import org.eclipse.jdt.internal.ui.search.SearchUtil; /** * Finds declarations of the selected element in working sets. @@ -45,7 +43,7 @@ import org.eclipse.jdt.internal.ui.search.SearchUtil; */ public class FindDeclarationsInWorkingSetAction extends FindDeclarationsAction { - private IWorkingSet[] fWorkingSet; + private IWorkingSet[] fWorkingSets; /** * Creates a new <code>FindDeclarationsInWorkingSetAction</code>. The action @@ -69,7 +67,7 @@ public class FindDeclarationsInWorkingSetAction extends FindDeclarationsAction { */ public FindDeclarationsInWorkingSetAction(IWorkbenchSite site, IWorkingSet[] workingSets) { super(site); - fWorkingSet= workingSets; + fWorkingSets= workingSets; } /** @@ -92,7 +90,7 @@ public class FindDeclarationsInWorkingSetAction extends FindDeclarationsAction { */ public FindDeclarationsInWorkingSetAction(JavaEditor editor, IWorkingSet[] workingSets) { super(editor); - fWorkingSet= workingSets; + fWorkingSets= workingSets; } @Override @@ -103,25 +101,13 @@ public class FindDeclarationsInWorkingSetAction extends FindDeclarationsAction { PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IJavaHelpContextIds.FIND_DECLARATIONS_IN_WORKING_SET_ACTION); } + @Override QuerySpecification createQuery(IJavaElement element) throws JavaModelException, InterruptedException { - JavaSearchScopeFactory factory= JavaSearchScopeFactory.getInstance(); - - IWorkingSet[] workingSets= fWorkingSet; - if (fWorkingSet == null && isFirstElement()) { - workingSets= factory.queryWorkingSets(); - if (workingSets == null) - return super.createQuery(element); // in workspace - if (isMultiSelect()) { - fWorkingSet= workingSets; - } - } else if (isMultiSelect() && isLastElement()) { - fWorkingSet= null; - } - SearchUtil.updateLRUWorkingSets(workingSets); - IJavaSearchScope scope= factory.createJavaSearchScope(workingSets, JavaSearchScopeFactory.NO_PROJ); - String description= factory.getWorkingSetScopeDescription(workingSets, JavaSearchScopeFactory.NO_PROJ); - return new ElementQuerySpecification(element, getLimitTo(), scope, description); + AtomicReference<IWorkingSet[]> toUpdate = new AtomicReference<>(fWorkingSets); + QuerySpecification query = createQueryWithWorkingSets(element, this, toUpdate); + fWorkingSets = toUpdate.get(); + return query; } } diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/FindImplementorsInWorkingSetAction.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/FindImplementorsInWorkingSetAction.java index c1c2163a6a..4e17636301 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/FindImplementorsInWorkingSetAction.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/FindImplementorsInWorkingSetAction.java @@ -13,23 +13,21 @@ *******************************************************************************/ package org.eclipse.jdt.ui.actions; +import java.util.concurrent.atomic.AtomicReference; + import org.eclipse.ui.IWorkbenchSite; import org.eclipse.ui.IWorkingSet; import org.eclipse.ui.PlatformUI; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.JavaModelException; -import org.eclipse.jdt.core.search.IJavaSearchScope; -import org.eclipse.jdt.ui.search.ElementQuerySpecification; import org.eclipse.jdt.ui.search.QuerySpecification; import org.eclipse.jdt.internal.ui.IJavaHelpContextIds; import org.eclipse.jdt.internal.ui.JavaPluginImages; import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor; -import org.eclipse.jdt.internal.ui.search.JavaSearchScopeFactory; import org.eclipse.jdt.internal.ui.search.SearchMessages; -import org.eclipse.jdt.internal.ui.search.SearchUtil; /** * Finds implementors of the selected element in working sets. @@ -104,23 +102,10 @@ public class FindImplementorsInWorkingSetAction extends FindImplementorsAction { @Override QuerySpecification createQuery(IJavaElement element) throws JavaModelException, InterruptedException { - JavaSearchScopeFactory factory= JavaSearchScopeFactory.getInstance(); - - IWorkingSet[] workingSets= fWorkingSets; - if (fWorkingSets == null && isFirstElement()) { - workingSets= factory.queryWorkingSets(); - if (workingSets == null) - return super.createQuery(element); // workspace - if (isMultiSelect()) { - fWorkingSets= workingSets; - } - } else if (isMultiSelect() && isLastElement()) { - fWorkingSets= null; - } - SearchUtil.updateLRUWorkingSets(workingSets); - IJavaSearchScope scope= factory.createJavaSearchScope(workingSets, JavaSearchScopeFactory.NO_PROJ); - String description= factory.getWorkingSetScopeDescription(workingSets, JavaSearchScopeFactory.NO_PROJ); - return new ElementQuerySpecification(element, getLimitTo(), scope, description); + AtomicReference<IWorkingSet[]> toUpdate = new AtomicReference<>(fWorkingSets); + QuerySpecification query = createQueryWithWorkingSets(element, this, toUpdate); + fWorkingSets = toUpdate.get(); + return query; } } diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/FindReferencesInWorkingSetAction.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/FindReferencesInWorkingSetAction.java index ade9d586a4..ee7581a8c4 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/FindReferencesInWorkingSetAction.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/FindReferencesInWorkingSetAction.java @@ -13,23 +13,21 @@ *******************************************************************************/ package org.eclipse.jdt.ui.actions; +import java.util.concurrent.atomic.AtomicReference; + import org.eclipse.ui.IWorkbenchSite; import org.eclipse.ui.IWorkingSet; import org.eclipse.ui.PlatformUI; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.JavaModelException; -import org.eclipse.jdt.core.search.IJavaSearchScope; -import org.eclipse.jdt.ui.search.ElementQuerySpecification; import org.eclipse.jdt.ui.search.QuerySpecification; import org.eclipse.jdt.internal.ui.IJavaHelpContextIds; import org.eclipse.jdt.internal.ui.JavaPluginImages; import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor; -import org.eclipse.jdt.internal.ui.search.JavaSearchScopeFactory; import org.eclipse.jdt.internal.ui.search.SearchMessages; -import org.eclipse.jdt.internal.ui.search.SearchUtil; /** @@ -105,22 +103,9 @@ public class FindReferencesInWorkingSetAction extends FindReferencesAction { @Override QuerySpecification createQuery(IJavaElement element) throws JavaModelException, InterruptedException { - JavaSearchScopeFactory factory= JavaSearchScopeFactory.getInstance(); - - IWorkingSet[] workingSets= fWorkingSets; - if (fWorkingSets == null && isFirstElement()) { - workingSets= factory.queryWorkingSets(); - if (workingSets == null) - return super.createQuery(element); // in workspace - if (isMultiSelect()) { - fWorkingSets= workingSets; - } - } else if (isMultiSelect() && isLastElement()) { - fWorkingSets= null; - } - SearchUtil.updateLRUWorkingSets(workingSets); - IJavaSearchScope scope= factory.createJavaSearchScope(workingSets, JavaSearchScopeFactory.NO_PROJ); - String description= factory.getWorkingSetScopeDescription(workingSets, JavaSearchScopeFactory.NO_PROJ); - return new ElementQuerySpecification(element, getLimitTo(), scope, description); + AtomicReference<IWorkingSet[]> toUpdate = new AtomicReference<>(fWorkingSets); + QuerySpecification query = createQueryWithWorkingSets(element, this, toUpdate); + fWorkingSets = toUpdate.get(); + return query; } } |