Skip to content

Commit f316384

Browse files
Add Filter Mechanism for Target in Move Refactoring - with caching (eclipse-jdt#2034)
* Add Filter Mechanism for Target in Move Refactoring eclipse-jdt#1337 - Text Search added to search withing the tree while moving (refactoring) the file to different package - use caching to improve performance - fixes eclipse-jdt#1337 --------- Co-authored-by: shahzaib.ibrahim <[email protected]>
1 parent bd7b2b5 commit f316384

File tree

2 files changed

+34
-14
lines changed

2 files changed

+34
-14
lines changed

org.eclipse.jdt.ui/ui refactoring/org/eclipse/jdt/internal/ui/refactoring/reorg/DestinationContentProvider.java

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@
1414
package org.eclipse.jdt.internal.ui.refactoring.reorg;
1515

1616
import java.util.ArrayList;
17+
import java.util.Collections;
18+
import java.util.HashMap;
1719
import java.util.HashSet;
1820
import java.util.List;
21+
import java.util.Map;
1922
import java.util.Set;
2023

2124
import org.eclipse.core.runtime.CoreException;
@@ -44,6 +47,7 @@
4447
public final class DestinationContentProvider extends StandardJavaElementContentProvider {
4548

4649
private IReorgDestinationValidator fValidator;
50+
private final Map<IPath, Set<IPath>> classPathRoots = new HashMap<>();
4751

4852
public DestinationContentProvider(IReorgDestinationValidator validator) {
4953
super(true);
@@ -71,8 +75,8 @@ public boolean hasChildren(Object element) {
7175
@Override
7276
public Object[] getChildren(Object element) {
7377
try {
74-
if (element instanceof IJavaModel) {
75-
return concatenate(getJavaProjects((IJavaModel)element), getOpenNonJavaProjects((IJavaModel)element));
78+
if (element instanceof IJavaModel javaModel) {
79+
return concatenate(getJavaProjects(javaModel), getOpenNonJavaProjects(javaModel));
7680
} else {
7781
Object[] children= doGetChildren(element);
7882
ArrayList<Object> result= new ArrayList<>(children.length);
@@ -91,8 +95,7 @@ public Object[] getChildren(Object element) {
9195
}
9296

9397
private Object[] doGetChildren(Object parentElement) {
94-
if (parentElement instanceof IContainer) {
95-
final IContainer container= (IContainer) parentElement;
98+
if (parentElement instanceof IContainer container) {
9699
return getResources(container);
97100
}
98101
return super.getChildren(parentElement);
@@ -103,17 +106,12 @@ private Object[] getResources(IContainer container) {
103106
try {
104107
IResource[] members= container.members();
105108
IJavaProject javaProject= JavaCore.create(container.getProject());
106-
if (javaProject == null || !javaProject.exists())
109+
if (javaProject == null || !javaProject.exists()) {
107110
return members;
111+
}
108112
boolean isFolderOnClasspath = javaProject.isOnClasspath(container);
113+
Set<IPath> classRootPaths= getClassPathRoots(javaProject);
109114
List<IResource> nonJavaResources= new ArrayList<>();
110-
Set<IPath> classRootPaths= new HashSet<>();
111-
for (IPackageFragmentRoot classpathRoot : javaProject.getAllPackageFragmentRoots()) {
112-
IPath classRootPath= classpathRoot.getPath();
113-
if (classRootPath != null) {
114-
classRootPaths.add(classRootPath);
115-
}
116-
}
117115
// Can be on classpath but as a member of non-java resource folder
118116
for (IResource member : members) {
119117
// A resource can also be a java element
@@ -134,6 +132,24 @@ private Object[] getResources(IContainer container) {
134132
}
135133
}
136134

135+
private synchronized Set<IPath> getClassPathRoots(IJavaProject javaProject) {
136+
return classPathRoots.computeIfAbsent(javaProject.getPath(), key -> {
137+
Set<IPath> classRootPaths= new HashSet<>();
138+
try {
139+
for (IPackageFragmentRoot classpathRoot : javaProject.getAllPackageFragmentRoots()) {
140+
IPath classRootPath= classpathRoot.getPath();
141+
if (classRootPath != null) {
142+
classRootPaths.add(classRootPath);
143+
}
144+
}
145+
return classRootPaths;
146+
} catch(JavaModelException e) {
147+
// Nothing else to do, this was the original behavior too.
148+
return Collections.emptySet();
149+
}
150+
});
151+
}
152+
137153
private static Object[] getOpenNonJavaProjects(IJavaModel model) throws JavaModelException {
138154
Object[] nonJavaProjects= model.getNonJavaResources();
139155
ArrayList<IProject> result= new ArrayList<>(nonJavaProjects.length);

org.eclipse.jdt.ui/ui refactoring/org/eclipse/jdt/internal/ui/refactoring/reorg/ReorgUserInputPage.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,17 @@
3434
import org.eclipse.jface.viewers.StructuredSelection;
3535
import org.eclipse.jface.viewers.TreeViewer;
3636

37+
import org.eclipse.ui.dialogs.FilteredTree;
38+
import org.eclipse.ui.dialogs.PatternFilter;
39+
3740
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
3841
import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
3942

4043
import org.eclipse.jdt.core.IJavaElement;
4144
import org.eclipse.jdt.core.JavaCore;
4245
import org.eclipse.jdt.core.JavaModelException;
4346

47+
import org.eclipse.jdt.internal.core.manipulation.util.BasicElementLabels;
4448
import org.eclipse.jdt.internal.corext.refactoring.reorg.IReorgDestinationValidator;
4549
import org.eclipse.jdt.internal.corext.util.Messages;
4650

@@ -49,7 +53,6 @@
4953
import org.eclipse.jdt.ui.JavaElementLabels;
5054

5155
import org.eclipse.jdt.internal.ui.JavaPlugin;
52-
import org.eclipse.jdt.internal.core.manipulation.util.BasicElementLabels;
5356

5457

5558
abstract class ReorgUserInputPage extends UserInputWizardPage{
@@ -143,7 +146,8 @@ private final void verifyDestination(Object selected, boolean initialVerificatio
143146
}
144147

145148
private TreeViewer createViewer(Composite parent) {
146-
TreeViewer treeViewer= new TreeViewer(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
149+
FilteredTree filteredTree = new FilteredTree(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.BORDER, new PatternFilter(), true, true, 500);
150+
TreeViewer treeViewer = filteredTree.getViewer();
147151
GridData gd= new GridData(GridData.FILL_BOTH);
148152
gd.widthHint= convertWidthInCharsToPixels(40);
149153
gd.heightHint= convertHeightInCharsToPixels(15);

0 commit comments

Comments
 (0)