View | Details | Raw Unified | Return to bug 183062 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/jdt/core/tests/performance/FullSourceWorkspaceSearchTests.java (-2 / +4 lines)
Lines 628-634 Link Here
628
	/**
628
	/**
629
	 * Performance tests for search: Package Declarations.
629
	 * Performance tests for search: Package Declarations.
630
	 */
630
	 */
631
	public void testSearchPackageDeclarations() throws CoreException {
631
	public void testONLY_SearchPackageDeclarations() throws CoreException {
632
		tagAsSummary("Search package declarations", true); // put in fingerprint
632
		tagAsSummary("Search package declarations", true); // put in fingerprint
633
633
634
		// Wait for indexing end
634
		// Wait for indexing end
Lines 650-656 Link Here
650
			cleanCategoryTableCache(false, scope, resultCollector);
650
			cleanCategoryTableCache(false, scope, resultCollector);
651
			runGc();
651
			runGc();
652
			startMeasuring();
652
			startMeasuring();
653
			search(name, PACKAGE, DECLARATIONS, scope, resultCollector);
653
			// TODO (frederic) increase time for this test in next version as bug 183062 fix make its time around 2ms!
654
//			for (int j=0; j<20; j++)
655
				search(name, PACKAGE, DECLARATIONS, scope, resultCollector);
654
			stopMeasuring();
656
			stopMeasuring();
655
		}
657
		}
656
		
658
		
(-)search/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java (-30 / +25 lines)
Lines 1235-1276 Link Here
1235
			return;
1235
			return;
1236
		}
1236
		}
1237
		PackageDeclarationPattern pkgPattern = (PackageDeclarationPattern) searchPattern;
1237
		PackageDeclarationPattern pkgPattern = (PackageDeclarationPattern) searchPattern;
1238
		IPath[] scopeProjectsAndJars = this.scope.enclosingProjectsAndJars();
1239
		int scopeLength = scopeProjectsAndJars.length;
1238
		IJavaProject[] projects = JavaModelManager.getJavaModelManager().getJavaModel().getJavaProjects();
1240
		IJavaProject[] projects = JavaModelManager.getJavaModelManager().getJavaModel().getJavaProjects();
1239
		for (int i = 0, length = projects.length; i < length; i++) {
1241
		for (int i = 0, length = projects.length; i < length; i++) {
1240
			IJavaProject javaProject = projects[i];
1242
			IJavaProject javaProject = projects[i];
1241
			IPackageFragmentRoot[] roots = null;
1243
			// Verify that project belongs to the scope
1242
			try {
1244
			boolean found = false;
1243
				roots = javaProject.getPackageFragmentRoots();
1245
			for (int j=0; j<scopeLength; j++) {
1244
			} catch (JavaModelException e) {
1246
				if (projects[i].getPath().equals(scopeProjectsAndJars[j])) {
1245
				// java project doesn't exist -> continue with next project (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=75561)
1247
					found = true;
1246
				continue;
1248
					break;
1249
				}
1247
			}
1250
			}
1248
			for (int j = 0, rootsLength = roots.length; j < rootsLength; j++) {
1251
			if (!found) continue;
1249
				IJavaElement[] pkgs = null;
1252
			this.nameLookup = ((JavaProject) projects[i]).newNameLookup(this.workingCopies);
1253
			IPackageFragment[] packageFragments = this.nameLookup.findPackageFragments(new String(pkgPattern.pkgName), true, true);
1254
			int pLength = packageFragments == null ? 0 : packageFragments.length;
1255
			for (int p=0; p<pLength; p++) {
1256
				IPackageFragment fragment = packageFragments[p];
1257
				IResource resource = fragment.getResource();
1258
				if (resource == null) // case of a file in an external jar
1259
					resource = javaProject.getProject();
1250
				try {
1260
				try {
1251
					pkgs = roots[j].getChildren();
1261
					if (encloses(fragment)) {
1252
				} catch (JavaModelException e) {
1262
						SearchMatch match = new PackageDeclarationMatch(fragment, SearchMatch.A_ACCURATE, -1, -1, participant, resource);
1253
					// pkg fragment root doesn't exist -> continue with next root (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=75561)
1263
						report(match);
1254
					continue;
1255
				}
1256
				for (int k = 0, pksLength = pkgs.length; k < pksLength; k++) {
1257
					IPackageFragment pkg = (IPackageFragment) pkgs[k];
1258
					if (!pkg.exists()) continue; // package doesn't exist -> continue with next package (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=75561)
1259
					if (pkgPattern.matchesName(pkgPattern.pkgName, pkg.getElementName().toCharArray())) {
1260
						IResource resource = pkg.getResource();
1261
						if (resource == null) // case of a file in an external jar
1262
							resource = javaProject.getProject();
1263
						try {
1264
							if (encloses(pkg)) {
1265
								SearchMatch match = new PackageDeclarationMatch(pkg, SearchMatch.A_ACCURATE, -1, -1, participant, resource);
1266
								report(match);
1267
							}
1268
						} catch (JavaModelException e) {
1269
							throw e;
1270
						} catch (CoreException e) {
1271
							throw new JavaModelException(e);
1272
						}
1273
					}
1264
					}
1265
				} catch (JavaModelException e) {
1266
					throw e;
1267
				} catch (CoreException e) {
1268
					throw new JavaModelException(e);
1274
				}
1269
				}
1275
			}
1270
			}
1276
		}
1271
		}
(-)model/org/eclipse/jdt/internal/core/util/Util.java (+24 lines)
Lines 1945-1950 Link Here
1945
		return compoundName[prefixLength-1].toLowerCase().startsWith(prefix[prefixLength-1].toLowerCase());
1945
		return compoundName[prefixLength-1].toLowerCase().startsWith(prefix[prefixLength-1].toLowerCase());
1946
	}
1946
	}
1947
1947
1948
	/*
1949
	 * Returns whether the given compound name matches the given pattern.
1950
	 */
1951
	public static boolean matchesWithIgnoreCase(String[] compoundName, String pattern) {
1952
		if (pattern.equals("*")) return true; //$NON-NLS-1$
1953
		int nameLength = compoundName.length;
1954
		if (pattern.length() == 0) return nameLength == 0;
1955
		if (nameLength == 0) return false;
1956
		int length = nameLength-1;
1957
		for (int i=0; i<nameLength; i++) {
1958
			length += compoundName[i].length();
1959
		}
1960
		char[] compoundChars = new char[length];
1961
		int pos = 0;
1962
		for (int i=0; i<nameLength; i++) {
1963
			if (pos > 0) compoundChars[pos++] = '.';
1964
			char[] array = compoundName[i].toCharArray();
1965
			int size = array.length;
1966
			System.arraycopy(array, 0, compoundChars, pos, size);
1967
			pos += size;
1968
		}
1969
		return CharOperation.match(pattern.toCharArray(), compoundChars, false);
1970
	}
1971
1948
	/**
1972
	/**
1949
	 * Converts a String[] to char[][].
1973
	 * Converts a String[] to char[][].
1950
	 */
1974
	 */
(-)model/org/eclipse/jdt/internal/core/NameLookup.java (-21 / +47 lines)
Lines 454-490 Link Here
454
	 * (qualified) name, or <code>null</code> if none exist.
454
	 * (qualified) name, or <code>null</code> if none exist.
455
	 *
455
	 *
456
	 * The name can be:
456
	 * The name can be:
457
	 *	- empty: ""
457
	 * <ul>
458
	 *	- qualified: "pack.pack1.pack2"
458
	 *		<li>empty: ""</li>
459
	 *		<li>qualified: "pack.pack1.pack2"</li>
460
	 * </ul>
459
	 * @param partialMatch partial name matches qualify when <code>true</code>,
461
	 * @param partialMatch partial name matches qualify when <code>true</code>,
460
	 *	only exact name matches qualify when <code>false</code>
462
	 *	only exact name matches qualify when <code>false</code>
461
	 */
463
	 */
462
	public IPackageFragment[] findPackageFragments(String name, boolean partialMatch) {
464
	public IPackageFragment[] findPackageFragments(String name, boolean partialMatch) {
463
		if (partialMatch) {
465
		return findPackageFragments(name, partialMatch, false);
466
	}
467
468
	/**
469
	 * Returns the package fragments whose name matches the given
470
	 * (qualified) name or pattern, or <code>null</code> if none exist.
471
	 *
472
	 * The name can be:
473
	 * <ul>
474
	 *		<li>empty: ""</li>
475
	 *		<li>qualified: "pack.pack1.pack2"</li>
476
	 * 	<li>a pattern: "pack.*.util"</li>
477
	 * </ul>
478
	 * @param partialMatch partial name matches qualify when <code>true</code>,
479
	 * @param patternMatch <code>true</code> when the given name might be a pattern,
480
	 *		<code>false</code> otherwise.
481
	 */
482
	public IPackageFragment[] findPackageFragments(String name, boolean partialMatch, boolean patternMatch) {
483
		boolean hasPatternChars = patternMatch && (name.indexOf('*') >= 0 || name.indexOf('?') >= 0);
484
		if (partialMatch || hasPatternChars) {
464
			String[] splittedName = Util.splitOn('.', name, 0, name.length());
485
			String[] splittedName = Util.splitOn('.', name, 0, name.length());
465
			IPackageFragment[] oneFragment = null;
486
			IPackageFragment[] oneFragment = null;
466
			ArrayList pkgs = null;
487
			ArrayList pkgs = null;
467
			Object[][] keys = this.packageFragments.keyTable;
488
			Object[][] keys = this.packageFragments.keyTable;
468
			for (int i = 0, length = keys.length; i < length; i++) {
489
			for (int i = 0, length = keys.length; i < length; i++) {
469
				String[] pkgName = (String[]) keys[i];
490
				String[] pkgName = (String[]) keys[i];
470
				if (pkgName != null && Util.startsWithIgnoreCase(pkgName, splittedName)) {
491
				if (pkgName != null) {
471
					Object value = this.packageFragments.valueTable[i];
492
					boolean match = hasPatternChars
472
					if (value instanceof PackageFragmentRoot) {
493
						? Util.matchesWithIgnoreCase(pkgName, name)
473
						IPackageFragment pkg = ((PackageFragmentRoot) value).getPackageFragment(pkgName);
494
						: Util.startsWithIgnoreCase(pkgName, splittedName);
474
						if (oneFragment == null) {
495
					if (match) {
475
							oneFragment = new IPackageFragment[] {pkg};
496
						Object value = this.packageFragments.valueTable[i];
476
						} else {
497
						if (value instanceof PackageFragmentRoot) {
477
							if (pkgs == null) {
498
							IPackageFragment pkg = ((PackageFragmentRoot) value).getPackageFragment(pkgName);
478
								pkgs = new ArrayList();
479
								pkgs.add(oneFragment[0]);
480
							}
481
							pkgs.add(pkg);
482
						}
483
					} else {
484
						IPackageFragmentRoot[] roots = (IPackageFragmentRoot[]) value;
485
						for (int j = 0, length2 = roots.length; j < length2; j++) {
486
							PackageFragmentRoot root = (PackageFragmentRoot) roots[j];
487
							IPackageFragment pkg = root.getPackageFragment(pkgName);
488
							if (oneFragment == null) {
499
							if (oneFragment == null) {
489
								oneFragment = new IPackageFragment[] {pkg};
500
								oneFragment = new IPackageFragment[] {pkg};
490
							} else {
501
							} else {
Lines 494-499 Link Here
494
								}
505
								}
495
								pkgs.add(pkg);
506
								pkgs.add(pkg);
496
							}
507
							}
508
						} else {
509
							IPackageFragmentRoot[] roots = (IPackageFragmentRoot[]) value;
510
							for (int j = 0, length2 = roots.length; j < length2; j++) {
511
								PackageFragmentRoot root = (PackageFragmentRoot) roots[j];
512
								IPackageFragment pkg = root.getPackageFragment(pkgName);
513
								if (oneFragment == null) {
514
									oneFragment = new IPackageFragment[] {pkg};
515
								} else {
516
									if (pkgs == null) {
517
										pkgs = new ArrayList();
518
										pkgs.add(oneFragment[0]);
519
									}
520
									pkgs.add(pkg);
521
								}
522
							}
497
						}
523
						}
498
					}
524
					}
499
				}
525
				}
(-)src/org/eclipse/jdt/core/tests/model/JavaSearchTests.java (-11 / +86 lines)
Lines 453-462 Link Here
453
	IPackageFragment pkg = getPackageFragment("JavaSearch", "src", "r7");
453
	IPackageFragment pkg = getPackageFragment("JavaSearch", "src", "r7");
454
	JavaSearchResultCollector result = new JavaSearchResultCollector() {
454
	JavaSearchResultCollector result = new JavaSearchResultCollector() {
455
	    public void beginReporting() {
455
	    public void beginReporting() {
456
	        results.append("Starting search...");
456
	        addLine("Starting search...");
457
        }
457
        }
458
	    public void endReporting() {
458
	    public void endReporting() {
459
	        results.append("\nDone searching.");
459
	        addLine("Done searching.");
460
        }
460
        }
461
	};
461
	};
462
	searchDeclarationsOfReferencedTypes(
462
	searchDeclarationsOfReferencedTypes(
Lines 478-487 Link Here
478
	ICompilationUnit cu = getCompilationUnit("JavaSearch15/src/p3/X.java");
478
	ICompilationUnit cu = getCompilationUnit("JavaSearch15/src/p3/X.java");
479
	JavaSearchResultCollector result = new JavaSearchResultCollector() {
479
	JavaSearchResultCollector result = new JavaSearchResultCollector() {
480
	    public void beginReporting() {
480
	    public void beginReporting() {
481
	        results.append("Starting search...");
481
	        addLine("Starting search...");
482
        }
482
        }
483
	    public void endReporting() {
483
	    public void endReporting() {
484
	        results.append("\nDone searching.");
484
	        addLine("Done searching.");
485
        }
485
        }
486
	};
486
	};
487
	searchDeclarationsOfReferencedTypes(
487
	searchDeclarationsOfReferencedTypes(
Lines 1608-1625 Link Here
1608
 * Various package declarations test.
1608
 * Various package declarations test.
1609
 */
1609
 */
1610
public void testPackageDeclaration2() throws CoreException { // was testVariousPackageDeclarations
1610
public void testPackageDeclaration2() throws CoreException { // was testVariousPackageDeclarations
1611
1611
	JavaSearchResultCollector packageCollector = new JavaSearchResultCollector(true);
1612
	search(
1612
	search(
1613
		"p3*", 
1613
		"p3*", 
1614
		PACKAGE,
1614
		PACKAGE,
1615
		DECLARATIONS, 
1615
		DECLARATIONS, 
1616
		getJavaSearchScope(), 
1616
		getJavaSearchScope(), 
1617
		this.resultCollector);
1617
		packageCollector);
1618
	assertSearchResults(
1618
	assertSearchResults(
1619
		"src/p3 p3\n" + 
1619
		"src/p3 p3\n" + 
1620
		"src/p3/p2 p3.p2\n" + 
1620
		"src/p3/p2 p3.p2\n" + 
1621
		"src/p3/p2/p p3.p2.p",
1621
		"src/p3/p2/p p3.p2.p",
1622
		this.resultCollector);
1622
		packageCollector);
1623
}
1623
}
1624
/**
1624
/**
1625
 * Package declaration test.
1625
 * Package declaration test.
Lines 1651-1660 Link Here
1651
		System.arraycopy(originalCP, 0, newCP, 0, cpLength);
1651
		System.arraycopy(originalCP, 0, newCP, 0, cpLength);
1652
		newCP[cpLength] = JavaCore.newLibraryEntry(new Path("/JavaSearch/corrupt.jar"), null, null);
1652
		newCP[cpLength] = JavaCore.newLibraryEntry(new Path("/JavaSearch/corrupt.jar"), null, null);
1653
		project.setRawClasspath(newCP, null);
1653
		project.setRawClasspath(newCP, null);
1654
		
1654
		search("r9",
1655
1656
		search(
1657
			"r9",
1658
			PACKAGE,
1655
			PACKAGE,
1659
			DECLARATIONS, 
1656
			DECLARATIONS, 
1660
			getJavaSearchScope(), 
1657
			getJavaSearchScope(), 
Lines 1705-1710 Link Here
1705
		}
1702
		}
1706
	}
1703
	}
1707
}
1704
}
1705
public void testPackageDeclarationBug183062a() throws CoreException {
1706
	JavaSearchResultCollector packageCollector = new JavaSearchResultCollector(true);
1707
	search("j?",
1708
		PACKAGE,
1709
		DECLARATIONS, 
1710
		getJavaSearchScope(), 
1711
		packageCollector);
1712
	assertSearchResults(
1713
		"src/j1 j1\n" + 
1714
		"src/j2 j2\n" + 
1715
		"src/j3 j3\n" + 
1716
		"src/j4 j4\n" + 
1717
		"src/j5 j5\n" + 
1718
		"src/j6 j6\n" + 
1719
		"src/j7 j7\n" + 
1720
		"test47909.jar j3 [No source]",
1721
		packageCollector);
1722
}
1723
public void testPackageDeclarationBug183062b() throws CoreException {
1724
	JavaSearchResultCollector packageCollector = new JavaSearchResultCollector(true);
1725
	search("j*",
1726
		PACKAGE,
1727
		DECLARATIONS, 
1728
		getJavaSearchScope(), 
1729
		packageCollector);
1730
	assertSearchResults(
1731
		""+ getExternalJCLPathString() + " java\n" + 
1732
		""+ getExternalJCLPathString() + " java.io\n" + 
1733
		""+ getExternalJCLPathString() + " java.lang\n" + 
1734
		"src/j1 j1\n" + 
1735
		"src/j2 j2\n" + 
1736
		"src/j3 j3\n" + 
1737
		"src/j4 j4\n" + 
1738
		"src/j5 j5\n" + 
1739
		"src/j6 j6\n" + 
1740
		"src/j7 j7\n" + 
1741
		"src/j7/qua j7.qua\n" + 
1742
		"src/j7/qua/li j7.qua.li\n" + 
1743
		"src/j7/qua/li/fied j7.qua.li.fied\n" + 
1744
		"test47909.jar j3 [No source]",
1745
		packageCollector);
1746
}
1747
public void testPackageDeclarationBug183062c() throws CoreException {
1748
	JavaSearchResultCollector packageCollector = new JavaSearchResultCollector(true);
1749
	search("j7.*",
1750
		PACKAGE,
1751
		DECLARATIONS, 
1752
		getJavaSearchScope(), 
1753
		packageCollector);
1754
	assertSearchResults(
1755
		"src/j7/qua j7.qua\n" + 
1756
		"src/j7/qua/li j7.qua.li\n" + 
1757
		"src/j7/qua/li/fied j7.qua.li.fied",
1758
		packageCollector);
1759
}
1760
public void testPackageDeclarationBug183062d() throws CoreException {
1761
	JavaSearchResultCollector packageCollector = new JavaSearchResultCollector(true);
1762
	search("j7.*.*",
1763
		PACKAGE,
1764
		DECLARATIONS, 
1765
		getJavaSearchScope(), 
1766
		packageCollector);
1767
	assertSearchResults(
1768
		"src/j7/qua/li j7.qua.li\n" + 
1769
		"src/j7/qua/li/fied j7.qua.li.fied",
1770
		packageCollector);
1771
}
1772
public void testPackageDeclarationBug183062e() throws CoreException {
1773
	JavaSearchResultCollector packageCollector = new JavaSearchResultCollector(true);
1774
	search("????.????",
1775
		PACKAGE,
1776
		DECLARATIONS, 
1777
		getJavaSearchScope(), 
1778
		packageCollector);
1779
	assertSearchResults(
1780
		""+ getExternalJCLPathString() + " java.lang",
1781
		packageCollector);
1782
}
1708
/**
1783
/**
1709
 * Package reference test.
1784
 * Package reference test.
1710
 * (regression test for PR 1GK90H4: ITPJCORE:WIN2000 - search: missing package reference)
1785
 * (regression test for PR 1GK90H4: ITPJCORE:WIN2000 - search: missing package reference)
(-)src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java (-2 / +2 lines)
Lines 200-209 Link Here
200
public void testBug71279() throws CoreException {
200
public void testBug71279() throws CoreException {
201
	JavaSearchResultCollector result = new JavaSearchResultCollector() {
201
	JavaSearchResultCollector result = new JavaSearchResultCollector() {
202
	    public void beginReporting() {
202
	    public void beginReporting() {
203
	        results.append("Starting search...");
203
	    	addLine("Starting search...");
204
        }
204
        }
205
	    public void endReporting() {
205
	    public void endReporting() {
206
	        results.append("\nDone searching.");
206
	        addLine("Done searching.");
207
        }
207
        }
208
	};
208
	};
209
	workingCopies = new ICompilationUnit[1];
209
	workingCopies = new ICompilationUnit[1];
(-)src/org/eclipse/jdt/core/tests/model/AbstractJavaSearchTests.java (-12 / +33 lines)
Lines 14-19 Link Here
14
import java.io.IOException;
14
import java.io.IOException;
15
import java.util.ArrayList;
15
import java.util.ArrayList;
16
import java.util.Arrays;
16
import java.util.Arrays;
17
import java.util.Collections;
18
import java.util.Comparator;
17
import java.util.List;
19
import java.util.List;
18
20
19
import org.eclipse.core.resources.*;
21
import org.eclipse.core.resources.*;
Lines 59-77 Link Here
59
		public boolean showSynthetic;
61
		public boolean showSynthetic;
60
		public int showFlavors = 0;
62
		public int showFlavors = 0;
61
		public int count = 0;
63
		public int count = 0;
64
		List lines = new ArrayList();
65
		boolean sorted;
66
		public JavaSearchResultCollector() {
67
			this(false);
68
		}
69
		public JavaSearchResultCollector(boolean sorted) {
70
			this.sorted = sorted;
71
		}
62
		public void acceptSearchMatch(SearchMatch searchMatch) throws CoreException {
72
		public void acceptSearchMatch(SearchMatch searchMatch) throws CoreException {
63
			count++;
73
			this.count++;
64
			this.match = searchMatch;
74
			this.match = searchMatch;
65
			writeLine();
75
			writeLine();
66
			if (line != null) {
76
			if (this.line != null && (match.getAccuracy() == SearchMatch.A_ACCURATE || showPotential)) {
67
				writeLineToResult();
77
				this.lines.add(this.line);
68
			}
78
			}
69
		}
79
		}
70
		protected void writeLineToResult() {
80
		protected void addLine(String text) {
71
			if (match.getAccuracy() == SearchMatch.A_ACCURATE || showPotential) {
81
			this.lines.add(text);
72
				if (results.length() > 0) results.append("\n");
73
				results.append(line);
74
			}
75
		}
82
		}
76
		protected void writeLine() throws CoreException {
83
		protected void writeLine() throws CoreException {
77
			try {
84
			try {
Lines 225-232 Link Here
225
					}
232
					}
226
				}
233
				}
227
			} catch (JavaModelException e) {
234
			} catch (JavaModelException e) {
228
				results.append("\n");
235
				this.line.append("\n");
229
				results.append(e.toString());
236
				this.line.append(e.toString());
230
			}
237
			}
231
		}
238
		}
232
		private boolean showSuperInvocation() {
239
		private boolean showSuperInvocation() {
Lines 384-391 Link Here
384
			return contents;
391
			return contents;
385
		}
392
		}
386
		public String toString() {
393
		public String toString() {
387
			return results.toString();
394
	    	StringBuffer buffer = new StringBuffer();
388
		}
395
	    	List displayedLines = new ArrayList(this.lines);
396
	    	if (this.sorted) {
397
	    		Collections.sort(displayedLines, new Comparator() {
398
					public int compare(Object o1, Object o2) {
399
						return o1.toString().compareTo(o2.toString());
400
				    }
401
				});
402
	    	}
403
	    	int size = displayedLines.size();
404
	    	for (int i=0; i<size; i++) {
405
	    		if (i > 0) buffer.append('\n');
406
	    		buffer.append(displayedLines.get(i).toString());
407
	    	}
408
	        return buffer.toString();
409
	    }
389
	}
410
	}
390
	
411
	
391
	static class TypeNameMatchCollector extends TypeNameMatchRequestor {
412
	static class TypeNameMatchCollector extends TypeNameMatchRequestor {

Return to bug 183062