String (@NotNull String pattern, int exactPrefixLen, boolean allowToUpper, boolean allowToLower, boolean lowerCaseWords, boolean forCompletion) { final int eol = pattern.indexOf('\n'); if (eol != -1) { pattern = pattern.substring(0, eol); } if (pattern.length() >= MAX_LENGTH) { pattern = pattern.substring(0, MAX_LENGTH); } final @NonNls StringBuilder buffer = new StringBuilder(); final boolean endsWithSpace = !forCompletion && Strings.endsWithChar(pattern, ' '); if (!forCompletion) { pattern = pattern.trim(); } exactPrefixLen = Math.min(exactPrefixLen, pattern.length()); /*final boolean uppercaseOnly = containsOnlyUppercaseLetters(pattern.substring(exactPrefixLen)); if (uppercaseOnly) { allowToLower = false; }*/ boolean prevIsUppercase = false; if (exactPrefixLen > 0) { char c = pattern.charAt(exactPrefixLen - 1); prevIsUppercase = Character.isUpperCase(c) || Character.isDigit(c); } for (int i = 0; i != exactPrefixLen; ++i) { final char c = pattern.charAt(i); if (Character.isLetterOrDigit(c)) { buffer.append(c); } else { // for standard RegExp engine // buffer.append("\\u"); // buffer.append(Integer.toHexString(c + 0x20000).substring(1)); // for OROMATCHER RegExp engine buffer.append("\\").append(c); //buffer.append(Integer.toHexString(c + 0x20000).substring(2)); } } if (exactPrefixLen == 0) { buffer.append("_*"); // ignore leading underscores } boolean firstIdentifierLetter = exactPrefixLen == 0; boolean lastIsUppercase = false; for (int i = exactPrefixLen; i < pattern.length(); i++) { final char c = pattern.charAt(i); lastIsUppercase = false; if (Character.isLetterOrDigit(c)) { prevIsUppercase = false; // This logic allows to use uppercase letters only to catch the name like PDM for PsiDocumentManager if (Character.isUpperCase(c) || Character.isDigit(c)) { prevIsUppercase = true; lastIsUppercase = true; buffer.append('('); if (!firstIdentifierLetter) { buffer.append("[a-z\\s0-9\\$]*"); } buffer.append(c); if (allowToLower) { buffer.append('|'); buffer.append(Character.toLowerCase(c)); } if (!firstIdentifierLetter) { buffer.append("|[A-Za-z\\s0-9\\$]*[_-]+["); buffer.append(c); buffer.append(Character.toLowerCase(c)); buffer.append("]"); } buffer.append(')'); } else if (Character.isLowerCase(c) && allowToUpper) { buffer.append('['); buffer.append(c); buffer.append(Character.toUpperCase(c)); buffer.append(']'); if (lowerCaseWords) { buffer.append("([a-z\\s0-9\\$]*[-_]+)?"); } } else { buffer.append(c); } firstIdentifierLetter = false; } else if (c == '*') { buffer.append(".*"); firstIdentifierLetter = true; } else if (c == '.') { if (!firstIdentifierLetter) { buffer.append("[a-z\\s0-9\\$]*\\."); } else { buffer.append("\\."); } firstIdentifierLetter = true; } else if (c == ' ') { buffer.append("([a-z\\s0-9\\$_-]*[\\ _-]+)+"); firstIdentifierLetter = true; } else { if (c == ':' || prevIsUppercase) { buffer.append("[A-Za-z\\s0-9\\$]*"); } firstIdentifierLetter = true; // for standard RegExp engine // buffer.append("\\u"); // buffer.append(Integer.toHexString(c + 0x20000).substring(1)); // for OROMATCHER RegExp engine buffer.append("\\").append(c); //buffer.append(Integer.toHexString(c + 0x20000).substring(3)); } } if (!endsWithSpace) { buffer.append(".*"); } else if (lastIsUppercase) { buffer.append("[a-z\\s0-9\\$]*"); } //System.out.println("rx = " + buffer.toString()); return buffer.toString(); }