### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core.tests.performance Index: src/org/eclipse/jdt/core/tests/performance/FullSourceWorkspaceSearchTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.performance/src/org/eclipse/jdt/core/tests/performance/FullSourceWorkspaceSearchTests.java,v retrieving revision 1.31 diff -u -r1.31 FullSourceWorkspaceSearchTests.java --- src/org/eclipse/jdt/core/tests/performance/FullSourceWorkspaceSearchTests.java 20 Apr 2007 09:18:01 -0000 1.31 +++ src/org/eclipse/jdt/core/tests/performance/FullSourceWorkspaceSearchTests.java 24 Apr 2007 08:32:32 -0000 @@ -628,7 +628,7 @@ /** * Performance tests for search: Package Declarations. */ - public void testSearchPackageDeclarations() throws CoreException { + public void testONLY_SearchPackageDeclarations() throws CoreException { tagAsSummary("Search package declarations", true); // put in fingerprint // Wait for indexing end @@ -650,7 +650,9 @@ cleanCategoryTableCache(false, scope, resultCollector); runGc(); startMeasuring(); - search(name, PACKAGE, DECLARATIONS, scope, resultCollector); + // TODO (frederic) increase time for this test in next version as bug 183062 fix make its time around 2ms! +// for (int j=0; j<20; j++) + search(name, PACKAGE, DECLARATIONS, scope, resultCollector); stopMeasuring(); } #P org.eclipse.jdt.core Index: search/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java,v retrieving revision 1.289 diff -u -r1.289 MatchLocator.java --- search/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java 26 Mar 2007 11:35:35 -0000 1.289 +++ search/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java 24 Apr 2007 08:32:35 -0000 @@ -1235,42 +1235,37 @@ return; } PackageDeclarationPattern pkgPattern = (PackageDeclarationPattern) searchPattern; + IPath[] scopeProjectsAndJars = this.scope.enclosingProjectsAndJars(); + int scopeLength = scopeProjectsAndJars.length; IJavaProject[] projects = JavaModelManager.getJavaModelManager().getJavaModel().getJavaProjects(); for (int i = 0, length = projects.length; i < length; i++) { IJavaProject javaProject = projects[i]; - IPackageFragmentRoot[] roots = null; - try { - roots = javaProject.getPackageFragmentRoots(); - } catch (JavaModelException e) { - // java project doesn't exist -> continue with next project (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=75561) - continue; + // Verify that project belongs to the scope + boolean found = false; + for (int j=0; j continue with next root (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=75561) - continue; - } - for (int k = 0, pksLength = pkgs.length; k < pksLength; k++) { - IPackageFragment pkg = (IPackageFragment) pkgs[k]; - if (!pkg.exists()) continue; // package doesn't exist -> continue with next package (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=75561) - if (pkgPattern.matchesName(pkgPattern.pkgName, pkg.getElementName().toCharArray())) { - IResource resource = pkg.getResource(); - if (resource == null) // case of a file in an external jar - resource = javaProject.getProject(); - try { - if (encloses(pkg)) { - SearchMatch match = new PackageDeclarationMatch(pkg, SearchMatch.A_ACCURATE, -1, -1, participant, resource); - report(match); - } - } catch (JavaModelException e) { - throw e; - } catch (CoreException e) { - throw new JavaModelException(e); - } + if (encloses(fragment)) { + SearchMatch match = new PackageDeclarationMatch(fragment, SearchMatch.A_ACCURATE, -1, -1, participant, resource); + report(match); } + } catch (JavaModelException e) { + throw e; + } catch (CoreException e) { + throw new JavaModelException(e); } } } Index: model/org/eclipse/jdt/internal/core/util/Util.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/Util.java,v retrieving revision 1.106 diff -u -r1.106 Util.java --- model/org/eclipse/jdt/internal/core/util/Util.java 13 Apr 2007 16:02:15 -0000 1.106 +++ model/org/eclipse/jdt/internal/core/util/Util.java 24 Apr 2007 08:32:35 -0000 @@ -1945,6 +1945,30 @@ return compoundName[prefixLength-1].toLowerCase().startsWith(prefix[prefixLength-1].toLowerCase()); } + /* + * Returns whether the given compound name matches the given pattern. + */ + public static boolean matchesWithIgnoreCase(String[] compoundName, String pattern) { + if (pattern.equals("*")) return true; //$NON-NLS-1$ + int nameLength = compoundName.length; + if (pattern.length() == 0) return nameLength == 0; + if (nameLength == 0) return false; + int length = nameLength-1; + for (int i=0; i 0) compoundChars[pos++] = '.'; + char[] array = compoundName[i].toCharArray(); + int size = array.length; + System.arraycopy(array, 0, compoundChars, pos, size); + pos += size; + } + return CharOperation.match(pattern.toCharArray(), compoundChars, false); + } + /** * Converts a String[] to char[][]. */ Index: model/org/eclipse/jdt/internal/core/NameLookup.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/NameLookup.java,v retrieving revision 1.113 diff -u -r1.113 NameLookup.java --- model/org/eclipse/jdt/internal/core/NameLookup.java 23 Apr 2007 10:52:16 -0000 1.113 +++ model/org/eclipse/jdt/internal/core/NameLookup.java 24 Apr 2007 08:32:34 -0000 @@ -454,37 +454,48 @@ * (qualified) name, or null if none exist. * * The name can be: - * - empty: "" - * - qualified: "pack.pack1.pack2" + * * @param partialMatch partial name matches qualify when true, * only exact name matches qualify when false */ public IPackageFragment[] findPackageFragments(String name, boolean partialMatch) { - if (partialMatch) { + return findPackageFragments(name, partialMatch, false); + } + + /** + * Returns the package fragments whose name matches the given + * (qualified) name or pattern, or null if none exist. + * + * The name can be: + * + * @param partialMatch partial name matches qualify when true, + * @param patternMatch true when the given name might be a pattern, + * false otherwise. + */ + public IPackageFragment[] findPackageFragments(String name, boolean partialMatch, boolean patternMatch) { + boolean hasPatternChars = patternMatch && (name.indexOf('*') >= 0 || name.indexOf('?') >= 0); + if (partialMatch || hasPatternChars) { String[] splittedName = Util.splitOn('.', name, 0, name.length()); IPackageFragment[] oneFragment = null; ArrayList pkgs = null; Object[][] keys = this.packageFragments.keyTable; for (int i = 0, length = keys.length; i < length; i++) { String[] pkgName = (String[]) keys[i]; - if (pkgName != null && Util.startsWithIgnoreCase(pkgName, splittedName)) { - Object value = this.packageFragments.valueTable[i]; - if (value instanceof PackageFragmentRoot) { - IPackageFragment pkg = ((PackageFragmentRoot) value).getPackageFragment(pkgName); - if (oneFragment == null) { - oneFragment = new IPackageFragment[] {pkg}; - } else { - if (pkgs == null) { - pkgs = new ArrayList(); - pkgs.add(oneFragment[0]); - } - pkgs.add(pkg); - } - } else { - IPackageFragmentRoot[] roots = (IPackageFragmentRoot[]) value; - for (int j = 0, length2 = roots.length; j < length2; j++) { - PackageFragmentRoot root = (PackageFragmentRoot) roots[j]; - IPackageFragment pkg = root.getPackageFragment(pkgName); + if (pkgName != null) { + boolean match = hasPatternChars + ? Util.matchesWithIgnoreCase(pkgName, name) + : Util.startsWithIgnoreCase(pkgName, splittedName); + if (match) { + Object value = this.packageFragments.valueTable[i]; + if (value instanceof PackageFragmentRoot) { + IPackageFragment pkg = ((PackageFragmentRoot) value).getPackageFragment(pkgName); if (oneFragment == null) { oneFragment = new IPackageFragment[] {pkg}; } else { @@ -494,6 +505,21 @@ } pkgs.add(pkg); } + } else { + IPackageFragmentRoot[] roots = (IPackageFragmentRoot[]) value; + for (int j = 0, length2 = roots.length; j < length2; j++) { + PackageFragmentRoot root = (PackageFragmentRoot) roots[j]; + IPackageFragment pkg = root.getPackageFragment(pkgName); + if (oneFragment == null) { + oneFragment = new IPackageFragment[] {pkg}; + } else { + if (pkgs == null) { + pkgs = new ArrayList(); + pkgs.add(oneFragment[0]); + } + pkgs.add(pkg); + } + } } } } #P org.eclipse.jdt.core.tests.model Index: src/org/eclipse/jdt/core/tests/model/JavaSearchTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchTests.java,v retrieving revision 1.159 diff -u -r1.159 JavaSearchTests.java --- src/org/eclipse/jdt/core/tests/model/JavaSearchTests.java 6 Mar 2007 04:43:19 -0000 1.159 +++ src/org/eclipse/jdt/core/tests/model/JavaSearchTests.java 24 Apr 2007 08:32:43 -0000 @@ -453,10 +453,10 @@ IPackageFragment pkg = getPackageFragment("JavaSearch", "src", "r7"); JavaSearchResultCollector result = new JavaSearchResultCollector() { public void beginReporting() { - results.append("Starting search..."); + addLine("Starting search..."); } public void endReporting() { - results.append("\nDone searching."); + addLine("Done searching."); } }; searchDeclarationsOfReferencedTypes( @@ -478,10 +478,10 @@ ICompilationUnit cu = getCompilationUnit("JavaSearch15/src/p3/X.java"); JavaSearchResultCollector result = new JavaSearchResultCollector() { public void beginReporting() { - results.append("Starting search..."); + addLine("Starting search..."); } public void endReporting() { - results.append("\nDone searching."); + addLine("Done searching."); } }; searchDeclarationsOfReferencedTypes( @@ -1608,18 +1608,18 @@ * Various package declarations test. */ public void testPackageDeclaration2() throws CoreException { // was testVariousPackageDeclarations - + JavaSearchResultCollector packageCollector = new JavaSearchResultCollector(true); search( "p3*", PACKAGE, DECLARATIONS, getJavaSearchScope(), - this.resultCollector); + packageCollector); assertSearchResults( "src/p3 p3\n" + "src/p3/p2 p3.p2\n" + "src/p3/p2/p p3.p2.p", - this.resultCollector); + packageCollector); } /** * Package declaration test. @@ -1651,10 +1651,7 @@ System.arraycopy(originalCP, 0, newCP, 0, cpLength); newCP[cpLength] = JavaCore.newLibraryEntry(new Path("/JavaSearch/corrupt.jar"), null, null); project.setRawClasspath(newCP, null); - - - search( - "r9", + search("r9", PACKAGE, DECLARATIONS, getJavaSearchScope(), @@ -1705,6 +1702,84 @@ } } } +public void testPackageDeclarationBug183062a() throws CoreException { + JavaSearchResultCollector packageCollector = new JavaSearchResultCollector(true); + search("j?", + PACKAGE, + DECLARATIONS, + getJavaSearchScope(), + packageCollector); + assertSearchResults( + "src/j1 j1\n" + + "src/j2 j2\n" + + "src/j3 j3\n" + + "src/j4 j4\n" + + "src/j5 j5\n" + + "src/j6 j6\n" + + "src/j7 j7\n" + + "test47909.jar j3 [No source]", + packageCollector); +} +public void testPackageDeclarationBug183062b() throws CoreException { + JavaSearchResultCollector packageCollector = new JavaSearchResultCollector(true); + search("j*", + PACKAGE, + DECLARATIONS, + getJavaSearchScope(), + packageCollector); + assertSearchResults( + ""+ getExternalJCLPathString() + " java\n" + + ""+ getExternalJCLPathString() + " java.io\n" + + ""+ getExternalJCLPathString() + " java.lang\n" + + "src/j1 j1\n" + + "src/j2 j2\n" + + "src/j3 j3\n" + + "src/j4 j4\n" + + "src/j5 j5\n" + + "src/j6 j6\n" + + "src/j7 j7\n" + + "src/j7/qua j7.qua\n" + + "src/j7/qua/li j7.qua.li\n" + + "src/j7/qua/li/fied j7.qua.li.fied\n" + + "test47909.jar j3 [No source]", + packageCollector); +} +public void testPackageDeclarationBug183062c() throws CoreException { + JavaSearchResultCollector packageCollector = new JavaSearchResultCollector(true); + search("j7.*", + PACKAGE, + DECLARATIONS, + getJavaSearchScope(), + packageCollector); + assertSearchResults( + "src/j7/qua j7.qua\n" + + "src/j7/qua/li j7.qua.li\n" + + "src/j7/qua/li/fied j7.qua.li.fied", + packageCollector); +} +public void testPackageDeclarationBug183062d() throws CoreException { + JavaSearchResultCollector packageCollector = new JavaSearchResultCollector(true); + search("j7.*.*", + PACKAGE, + DECLARATIONS, + getJavaSearchScope(), + packageCollector); + assertSearchResults( + "src/j7/qua/li j7.qua.li\n" + + "src/j7/qua/li/fied j7.qua.li.fied", + packageCollector); +} +public void testPackageDeclarationBug183062e() throws CoreException { + JavaSearchResultCollector packageCollector = new JavaSearchResultCollector(true); + search("????.????", + PACKAGE, + DECLARATIONS, + getJavaSearchScope(), + packageCollector); + assertSearchResults( + ""+ getExternalJCLPathString() + " java.lang", + packageCollector); +} /** * Package reference test. * (regression test for PR 1GK90H4: ITPJCORE:WIN2000 - search: missing package reference) Index: src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java,v retrieving revision 1.104 diff -u -r1.104 JavaSearchBugsTests.java --- src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java 26 Mar 2007 11:35:31 -0000 1.104 +++ src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java 24 Apr 2007 08:32:43 -0000 @@ -200,10 +200,10 @@ public void testBug71279() throws CoreException { JavaSearchResultCollector result = new JavaSearchResultCollector() { public void beginReporting() { - results.append("Starting search..."); + addLine("Starting search..."); } public void endReporting() { - results.append("\nDone searching."); + addLine("Done searching."); } }; workingCopies = new ICompilationUnit[1]; Index: src/org/eclipse/jdt/core/tests/model/AbstractJavaSearchTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AbstractJavaSearchTests.java,v retrieving revision 1.23 diff -u -r1.23 AbstractJavaSearchTests.java --- src/org/eclipse/jdt/core/tests/model/AbstractJavaSearchTests.java 26 Mar 2007 11:35:31 -0000 1.23 +++ src/org/eclipse/jdt/core/tests/model/AbstractJavaSearchTests.java 24 Apr 2007 08:32:41 -0000 @@ -14,6 +14,8 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; import java.util.List; import org.eclipse.core.resources.*; @@ -59,19 +61,24 @@ public boolean showSynthetic; public int showFlavors = 0; public int count = 0; + List lines = new ArrayList(); + boolean sorted; + public JavaSearchResultCollector() { + this(false); + } + public JavaSearchResultCollector(boolean sorted) { + this.sorted = sorted; + } public void acceptSearchMatch(SearchMatch searchMatch) throws CoreException { - count++; + this.count++; this.match = searchMatch; writeLine(); - if (line != null) { - writeLineToResult(); + if (this.line != null && (match.getAccuracy() == SearchMatch.A_ACCURATE || showPotential)) { + this.lines.add(this.line); } } - protected void writeLineToResult() { - if (match.getAccuracy() == SearchMatch.A_ACCURATE || showPotential) { - if (results.length() > 0) results.append("\n"); - results.append(line); - } + protected void addLine(String text) { + this.lines.add(text); } protected void writeLine() throws CoreException { try { @@ -225,8 +232,8 @@ } } } catch (JavaModelException e) { - results.append("\n"); - results.append(e.toString()); + this.line.append("\n"); + this.line.append(e.toString()); } } private boolean showSuperInvocation() { @@ -384,8 +391,22 @@ return contents; } public String toString() { - return results.toString(); - } + StringBuffer buffer = new StringBuffer(); + List displayedLines = new ArrayList(this.lines); + if (this.sorted) { + Collections.sort(displayedLines, new Comparator() { + public int compare(Object o1, Object o2) { + return o1.toString().compareTo(o2.toString()); + } + }); + } + int size = displayedLines.size(); + for (int i=0; i 0) buffer.append('\n'); + buffer.append(displayedLines.get(i).toString()); + } + return buffer.toString(); + } } static class TypeNameMatchCollector extends TypeNameMatchRequestor {