### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core 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 11:54:24 -0000 @@ -283,59 +283,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 } - 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 11:54:26 -0000 @@ -234,8 +234,9 @@ return true; // null pattern is equivalent to '*' if (name == null) return false; // null name cannot match - - return camelCaseMatch(pattern, 0, pattern.length(), name, 0, name.length()); + char[] patternChars = pattern.toCharArray(); + char nameChars[] = name.toCharArray(); + return CharOperation.camelCaseMatch(patternChars, 0, patternChars.length, nameChars, 0, nameChars.length); } /** @@ -297,69 +298,7 @@ return false; // null name cannot match if (pattern == null) return true; // null pattern is equivalent to '*' - if (patternEnd < 0) patternEnd = pattern.length(); - if (nameEnd < 0) nameEnd = name.length(); - - if (patternEnd <= patternStart) return nameEnd <= nameStart; - if (nameEnd <= nameStart) return false; - // check first pattern char - if (name.charAt(nameStart) != pattern.charAt(patternStart)) { - // 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) { - if ((ScannerHelper.OBVIOUS_IDENT_CHAR_NATURES[patternChar] & ScannerHelper.C_UPPER_LETTER) == 0) { - // end of camelCase part of pattern - break nextPatternChar; - } - // 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 - iName++; - continue nextNameChar; - } - // mismatch, either uppercase in name or non case char ('/' etc)--> reject - 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; - } - iPattern++; - iName++; - } - return iPattern == patternEnd; + return CharOperation.camelCaseMatch(pattern.toCharArray(), patternStart, patternEnd, name.toCharArray(), nameStart, nameEnd); } /** @@ -1805,22 +1744,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