### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core Index: search/org/eclipse/jdt/internal/core/search/matching/PatternLocator.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/PatternLocator.java,v retrieving revision 1.56 diff -u -r1.56 PatternLocator.java --- search/org/eclipse/jdt/internal/core/search/matching/PatternLocator.java 29 Mar 2006 03:13:59 -0000 1.56 +++ search/org/eclipse/jdt/internal/core/search/matching/PatternLocator.java 10 Apr 2006 17:28:09 -0000 @@ -270,31 +270,20 @@ } boolean matchFirstChar = !this.isCaseSensitive || pattern[0] == name[0]; boolean sameLength = pattern.length == name.length; - boolean canBePrefix = name.length > pattern.length; + boolean canBePrefix = name.length >= pattern.length; + if (this.isCamelCase && matchFirstChar && CharOperation.camelCaseMatch(pattern, name)) { + return POSSIBLE_MATCH; + } switch (this.matchMode) { case SearchPattern.R_EXACT_MATCH: - if (sameLength && matchFirstChar && CharOperation.equals(pattern, name, this.isCaseSensitive)) { + if (!this.isCamelCase && sameLength && matchFirstChar && CharOperation.equals(pattern, name, this.isCaseSensitive)) { return POSSIBLE_FULL_MATCH; } - if (this.isCamelCase) { - if (canBePrefix && matchFirstChar && CharOperation.prefixEquals(pattern, name, this.isCaseSensitive)) { - return POSSIBLE_PREFIX_MATCH; - } - if (matchFirstChar && CharOperation.camelCaseMatch(pattern, name)) { - return POSSIBLE_CAMELCASE_MATCH; - } - } break; case SearchPattern.R_PREFIX_MATCH: - if (sameLength && matchFirstChar && CharOperation.equals(pattern, name, this.isCaseSensitive)) { - return POSSIBLE_FULL_MATCH; - } if (canBePrefix && matchFirstChar && CharOperation.prefixEquals(pattern, name, this.isCaseSensitive)) { return POSSIBLE_PREFIX_MATCH; } - if (this.isCamelCase && matchFirstChar && CharOperation.camelCaseMatch(pattern, name)) { - return POSSIBLE_CAMELCASE_MATCH; - } break; case SearchPattern.R_PATTERN_MATCH: if (!this.isCaseSensitive) { @@ -702,6 +691,9 @@ return ACCURATE_MATCH; } } + if (this.matchMode == SearchPattern.R_EXACT_MATCH) { + return IMPOSSIBLE_MATCH; + } } boolean matchPattern = CharOperation.match(qualifiedPattern, sourceName, this.isCaseSensitive); return matchPattern ? ACCURATE_MATCH : IMPOSSIBLE_MATCH; Index: buildnotes_jdt-core.html =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/buildnotes_jdt-core.html,v retrieving revision 1.5165 diff -u -r1.5165 buildnotes_jdt-core.html --- buildnotes_jdt-core.html 10 Apr 2006 14:03:51 -0000 1.5165 +++ buildnotes_jdt-core.html 10 Apr 2006 17:28:07 -0000 @@ -52,7 +52,9 @@ What's new in this drop

Problem Reports Fixed

-129330 +130390 +CamelCase algorithm cleanup and improvement +
129330 strange statement recovery
135602 [compiler] Codegen bug for continue statement Index: compiler/org/eclipse/jdt/core/compiler/CharOperation.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/CharOperation.java,v retrieving revision 1.69 diff -u -r1.69 CharOperation.java --- compiler/org/eclipse/jdt/core/compiler/CharOperation.java 28 Mar 2006 20:30:01 -0000 1.69 +++ compiler/org/eclipse/jdt/core/compiler/CharOperation.java 10 Apr 2006 17:28:08 -0000 @@ -7,6 +7,7 @@ * * Contributors: * IBM Corporation - initial API and implementation + * Luiz-Otávio Zorzella - Improve CamelCase algorithm *******************************************************************************/ package org.eclipse.jdt.core.compiler; @@ -283,59 +284,79 @@ // first char must strictly match (upper/lower) return false; } + char patternChar, nameChar; - int iPattern = patternStart+1; - int iName = nameStart+1; - nextPatternChar: while (iPattern < patternEnd) { - // check patternChar, keep camelCasing only if uppercase - if ((patternChar = pattern[iPattern]) < ScannerHelper.MAX_OBVIOUS) { + int iPattern = patternStart; + int iName = nameStart; + + // Main loop is on pattern characters + while (true) { + + iPattern++; + iName++; + + if (iPattern == patternEnd) { + // We have exhausted pattern, so it's a match + return true; + } + + if (iName == nameEnd){ + // We have exhausted name (and not pattern), so it's not a match + return false; + } + + // For as long as we're exactly matching, bring it on (even if it's a lower case character) + if ((patternChar = pattern[iPattern]) == name[iName]) { + continue; + } + + // If character are not the same then return if patternChar is lowercase + if (patternChar < ScannerHelper.MAX_OBVIOUS) { if ((ScannerHelper.OBVIOUS_IDENT_CHAR_NATURES[patternChar] & ScannerHelper.C_UPPER_LETTER) == 0) { - // end of camelCase part of pattern - break nextPatternChar; + return false; } - // still uppercase - } else if (ScannerHelper.isJavaIdentifierPart(patternChar) - && !ScannerHelper.isUpperCase(patternChar)) { - // end of camelCase part of pattern - break nextPatternChar; - } - nextNameChar: while (iName < nameEnd) { - if ((nameChar = name[iName]) != patternChar) { - if (nameChar < ScannerHelper.MAX_OBVIOUS) { - if ((ScannerHelper.OBVIOUS_IDENT_CHAR_NATURES[nameChar] & (ScannerHelper.C_LOWER_LETTER | ScannerHelper.C_SPECIAL | ScannerHelper.C_DIGIT)) != 0) { - // lowercase/digit char is ignored - iName++; - continue nextNameChar; - } - } else if (ScannerHelper.isJavaIdentifierPart(nameChar) - && !ScannerHelper.isUpperCase(nameChar)) { - // lowercase name char is ignored + } + else if (Character.isJavaIdentifierPart(patternChar) && !Character.isUpperCase(patternChar)) { + return false; + } + + // patternChar is uppercase, so let's find the next uppercase in name + while (true) { + if (iName == nameEnd){ + // We have exhausted name (and not pattern), so it's not a match + return false; + } + + nameChar = name[iName]; + + if (nameChar < ScannerHelper.MAX_OBVIOUS) { + if ((ScannerHelper.OBVIOUS_IDENT_CHAR_NATURES[nameChar] & (ScannerHelper.C_LOWER_LETTER | ScannerHelper.C_SPECIAL | ScannerHelper.C_DIGIT)) != 0) { + // nameChar is lowercase iName++; - continue nextNameChar; + // nameChar is uppercase... + } else if (patternChar != nameChar) { + //.. and it does not match patternChar, so it's not a match + return false; + } else { + //.. and it matched patternChar. Back to the big loop + break; } - // mismatch, either uppercase in name or non case char ('/' etc)--> reject + } + else if (Character.isJavaIdentifierPart(nameChar) && !Character.isUpperCase(nameChar)) { + // nameChar is lowercase + iName++; + // nameChar is uppercase... + } else if (patternChar != nameChar) { + //.. and it does not match patternChar, so it's not a match return false; } else { - // pattern char == name char (uppercase) - iName++; - iPattern++; - continue nextPatternChar; - } - } - if (iPattern == patternEnd) return true; - if (iName == nameEnd) return false; - continue nextPatternChar; - } - - // check trailing part in case sensitive way - while (iPattern < patternEnd && iName < nameEnd) { - if (pattern[iPattern] != name[iName]) { - return false; + //.. and it matched patternChar. Back to the big loop + break; + } } - iPattern++; - iName++; + // At this point, either name has been exhausted, or it is at an uppercase letter. + // Since pattern is also at an uppercase letter } - return iPattern == patternEnd; } /** Index: search/org/eclipse/jdt/core/search/SearchPattern.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/SearchPattern.java,v retrieving revision 1.55 diff -u -r1.55 SearchPattern.java --- search/org/eclipse/jdt/core/search/SearchPattern.java 3 Apr 2006 15:31:03 -0000 1.55 +++ search/org/eclipse/jdt/core/search/SearchPattern.java 10 Apr 2006 17:28:09 -0000 @@ -307,59 +307,79 @@ // first char must strictly match (upper/lower) return false; } + char patternChar, nameChar; - int iPattern = patternStart+1; - int iName = nameStart+1; - nextPatternChar: while (iPattern < patternEnd) { - // check patternChar, keep camelCasing only if uppercase - if ((patternChar = pattern.charAt(iPattern)) < ScannerHelper.MAX_OBVIOUS) { + int iPattern = patternStart; + int iName = nameStart; + + // Main loop is on pattern characters + while (true) { + + iPattern++; + iName++; + + if (iPattern == patternEnd) { + // We have exhausted pattern, so it's a match + return true; + } + + if (iName == nameEnd){ + // We have exhausted name (and not pattern), so it's not a match + return false; + } + + // For as long as we're exactly matching, bring it on (even if it's a lower case character) + if ((patternChar = pattern.charAt(iPattern)) == name.charAt(iName)) { + continue; + } + + // If character are not the same then return if patternChar is lowercase + if (patternChar < ScannerHelper.MAX_OBVIOUS) { if ((ScannerHelper.OBVIOUS_IDENT_CHAR_NATURES[patternChar] & ScannerHelper.C_UPPER_LETTER) == 0) { - // end of camelCase part of pattern - break nextPatternChar; + return false; } - // still uppercase - } else if (ScannerHelper.isJavaIdentifierPart(patternChar) - && !ScannerHelper.isUpperCase(patternChar)) { - // end of camelCase part of pattern - break nextPatternChar; - } - nextNameChar: while (iName < nameEnd) { - if ((nameChar = name.charAt(iName)) != patternChar) { - if (nameChar < ScannerHelper.MAX_OBVIOUS) { - if ((ScannerHelper.OBVIOUS_IDENT_CHAR_NATURES[nameChar] & (ScannerHelper.C_LOWER_LETTER|ScannerHelper.C_SPECIAL |ScannerHelper.C_DIGIT)) != 0) { - // lowercase/digit char is ignored - iName++; - continue nextNameChar; - } - } else if (ScannerHelper.isJavaIdentifierPart(nameChar) - && !ScannerHelper.isUpperCase(nameChar)) { - // lowercase name char is ignored + } + else if (Character.isJavaIdentifierPart(patternChar) && !Character.isUpperCase(patternChar)) { + return false; + } + + // patternChar is uppercase, so let's find the next uppercase in name + while (true) { + if (iName == nameEnd){ + // We have exhausted name (and not pattern), so it's not a match + return false; + } + + nameChar = name.charAt(iName); + + if (nameChar < ScannerHelper.MAX_OBVIOUS) { + if ((ScannerHelper.OBVIOUS_IDENT_CHAR_NATURES[nameChar] & (ScannerHelper.C_LOWER_LETTER | ScannerHelper.C_SPECIAL | ScannerHelper.C_DIGIT)) != 0) { + // nameChar is lowercase iName++; - continue nextNameChar; + // nameChar is uppercase... + } else if (patternChar != nameChar) { + //.. and it does not match patternChar, so it's not a match + return false; + } else { + //.. and it matched patternChar. Back to the big loop + break; } - // mismatch, either uppercase in name or non case char ('/' etc)--> reject + } + else if (Character.isJavaIdentifierPart(nameChar) && !Character.isUpperCase(nameChar)) { + // nameChar is lowercase + iName++; + // nameChar is uppercase... + } else if (patternChar != nameChar) { + //.. and it does not match patternChar, so it's not a match return false; } else { - // pattern char == name char (uppercase) - iName++; - iPattern++; - continue nextPatternChar; - } - } - if (iPattern == patternEnd) return true; - if (iName == nameEnd) return false; - continue nextPatternChar; - } - - // check trailing part in case sensitive way - while (iPattern < patternEnd && iName < nameEnd) { - if (pattern.charAt(iPattern) != name.charAt(iName)) { - return false; + //.. and it matched patternChar. Back to the big loop + break; + } } - iPattern++; - iName++; + // At this point, either name has been exhausted, or it is at an uppercase letter. + // Since pattern is also at an uppercase letter } - return iPattern == patternEnd; } /** @@ -1715,6 +1735,8 @@ boolean isCaseSensitive = (this.matchRule & R_CASE_SENSITIVE) != 0; boolean isCamelCase = (this.matchRule & R_CAMELCASE_MATCH) != 0; int matchMode = this.matchRule & MODE_MASK; + boolean sameLength = pattern.length == name.length; + boolean canBePrefix = name.length >= pattern.length; boolean matchFirstChar = !isCaseSensitive || pattern.length == 0 || (name.length > 0 && pattern[0] == name[0]); if (isCamelCase && matchFirstChar && CharOperation.camelCaseMatch(pattern, name)) { return true; @@ -1722,11 +1744,16 @@ switch (matchMode) { case R_EXACT_MATCH : case R_FULL_MATCH : - if (isCamelCase) return false; - return matchFirstChar && CharOperation.equals(pattern, name, isCaseSensitive); + if (!isCamelCase && sameLength && matchFirstChar) { + return CharOperation.equals(pattern, name, isCaseSensitive); + } + break; case R_PREFIX_MATCH : - return matchFirstChar && CharOperation.prefixEquals(pattern, name, isCaseSensitive); + if (canBePrefix && matchFirstChar) { + return CharOperation.prefixEquals(pattern, name, isCaseSensitive); + } + break; case R_PATTERN_MATCH : if (!isCaseSensitive) @@ -1805,22 +1832,10 @@ if ((matchRule & R_CAMELCASE_MATCH) != 0) { // Verify sting pattern validity int length = stringPattern.length(); - boolean validCamelCase = false; - if (length > 1) { - int idx = 0; - char ch = stringPattern.charAt(idx++); - if (ScannerHelper.isJavaIdentifierStart(ch)) { - ch = stringPattern.charAt(idx++); - if (ScannerHelper.isUpperCase(ch)) { - while (idx