### 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