From decdde442c7e5bb7dfd7d125e58180de5304ce4d Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Sun, 29 Aug 2010 16:33:39 +0400 Subject: [PATCH] added completion in buildout parts --- .../openapi/util/text/StringUtil.java | 271 ++++++++++++------ 1 file changed, 176 insertions(+), 95 deletions(-) diff --git a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java index 9529e56aa24d..13d9b3ac5b42 100644 --- a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java +++ b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java @@ -15,8 +15,10 @@ */ package com.intellij.openapi.util.text; +import com.google.common.collect.Lists; import com.intellij.CommonBundle; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.TextRange; import com.intellij.util.*; import com.intellij.util.text.CharArrayCharSequence; @@ -96,11 +98,13 @@ public class StringUtil { return newText.toString(); } - @NotNull public static String getShortName(@NotNull String fqName) { + @NotNull + public static String getShortName(@NotNull String fqName) { return getShortName(fqName, '.'); } - @NotNull public static String getShortName(@NotNull Class aClass) { + @NotNull + public static String getShortName(@NotNull Class aClass) { return getShortName(aClass.getName()); } @@ -192,10 +196,11 @@ public class StringUtil { @Nullable public static String toLowerCase(@Nullable final String str) { - return str == null? null : str.toLowerCase(); + return str == null ? null : str.toLowerCase(); } - @NotNull public static String getShortName(@NotNull String fqName, char separator) { + @NotNull + public static String getShortName(@NotNull String fqName, char separator) { int lastPointIdx = fqName.lastIndexOf(separator); if (lastPointIdx >= 0) { return fqName.substring(lastPointIdx + 1); @@ -208,7 +213,8 @@ public class StringUtil { return getPackageName(fqName, '.'); } - @NotNull public static String getPackageName(@NotNull String fqName, char separator) { + @NotNull + public static String getPackageName(@NotNull String fqName, char separator) { int lastPointIdx = fqName.lastIndexOf(separator); if (lastPointIdx >= 0) { return fqName.substring(0, lastPointIdx); @@ -219,15 +225,18 @@ public class StringUtil { /** * Converts line separators to "\n" */ - @NotNull public static String convertLineSeparators(@NotNull String text) { + @NotNull + public static String convertLineSeparators(@NotNull String text) { return convertLineSeparators(text, "\n", null); } - @NotNull public static String convertLineSeparators(@NotNull String text, @NotNull String newSeparator) { + @NotNull + public static String convertLineSeparators(@NotNull String text, @NotNull String newSeparator) { return convertLineSeparators(text, newSeparator, null); } - @NotNull public static String convertLineSeparators(@NotNull String text, @NotNull String newSeparator, @Nullable int[] offsetsToKeep) { + @NotNull + public static String convertLineSeparators(@NotNull String text, @NotNull String newSeparator, @Nullable int[] offsetsToKeep) { StringBuilder buffer = null; int intactLength = 0; final boolean newSeparatorIsSlashN = "\n".equals(newSeparator); @@ -242,8 +251,12 @@ public class StringUtil { buffer.append(newSeparator); shiftOffsets(offsetsToKeep, buffer.length(), 1, newSeparator.length()); } - else if (buffer == null) intactLength++; - else buffer.append(c); + else if (buffer == null) { + intactLength++; + } + else { + buffer.append(c); + } } else if (c == '\r') { if (buffer == null) { @@ -260,8 +273,12 @@ public class StringUtil { } } else { - if (buffer == null) intactLength++; - else buffer.append(c); + if (buffer == null) { + intactLength++; + } + else { + buffer.append(c); + } } } return buffer == null ? text : buffer.toString(); @@ -363,7 +380,8 @@ public class StringUtil { return a[s1.length() - 1][s2.length() - 1]; } - @NotNull public static String wordsToBeginFromUpperCase(@NotNull String s) { + @NotNull + public static String wordsToBeginFromUpperCase(@NotNull String s) { return toTitleCase(s, ourPrepositions); } @@ -435,31 +453,34 @@ public class StringUtil { } @NotNull - public static StringBuilder escapeStringCharacters(int length, @NotNull String str, @Nullable String additionalChars, @NotNull @NonNls StringBuilder buffer) { + public static StringBuilder escapeStringCharacters(int length, + @NotNull String str, + @Nullable String additionalChars, + @NotNull @NonNls StringBuilder buffer) { for (int idx = 0; idx < length; idx++) { char ch = str.charAt(idx); switch (ch) { - case'\b': + case '\b': buffer.append("\\b"); break; - case'\t': + case '\t': buffer.append("\\t"); break; - case'\n': + case '\n': buffer.append("\\n"); break; - case'\f': + case '\f': buffer.append("\\f"); break; - case'\r': + case '\r': buffer.append("\\r"); break; - case'\\': + case '\\': buffer.append("\\\\"); break; @@ -484,20 +505,23 @@ public class StringUtil { return buffer; } - @NotNull public static String escapeStringCharacters(@NotNull String s) { + @NotNull + public static String escapeStringCharacters(@NotNull String s) { StringBuilder buffer = new StringBuilder(); escapeStringCharacters(s.length(), s, buffer); return buffer.toString(); } - @NotNull public static String unescapeStringCharacters(@NotNull String s) { + @NotNull + public static String unescapeStringCharacters(@NotNull String s) { StringBuilder buffer = new StringBuilder(); unescapeStringCharacters(s.length(), s, buffer); return buffer.toString(); } - @NotNull public static String unquoteString( @NotNull String s ) { + @NotNull + public static String unquoteString(@NotNull String s) { if (s.length() <= 1 || s.charAt(0) != '"' || s.charAt(s.length() - 1) != '"') { return s; } @@ -552,39 +576,39 @@ public class StringUtil { } else { switch (ch) { - case'n': + case 'n': buffer.append('\n'); break; - case'r': + case 'r': buffer.append('\r'); break; - case'b': + case 'b': buffer.append('\b'); break; - case't': + case 't': buffer.append('\t'); break; - case'f': + case 'f': buffer.append('\f'); break; - case'\'': + case '\'': buffer.append('\''); break; - case'\"': + case '\"': buffer.append('\"'); break; - case'\\': + case '\\': buffer.append('\\'); break; - case'u': + case 'u': if (idx + 4 < length) { try { int code = Integer.valueOf(s.substring(idx + 1, idx + 5), 16).intValue(); @@ -612,7 +636,8 @@ public class StringUtil { } @SuppressWarnings({"HardCodedStringLiteral"}) - @NotNull public static String pluralize(@NotNull String suggestion) { + @NotNull + public static String pluralize(@NotNull String suggestion) { if (suggestion.endsWith("Child") || suggestion.endsWith("child")) { return suggestion + "ren"; } @@ -629,15 +654,17 @@ public class StringUtil { return suggestion + "s"; } - @NotNull public static String capitalizeWords(@NotNull String text, - boolean allWords) { + @NotNull + public static String capitalizeWords(@NotNull String text, + boolean allWords) { return capitalizeWords(text, " \t\n\r\f", allWords, false); } - @NotNull public static String capitalizeWords(@NotNull String text, - @NotNull String tokenizerDelim, - boolean allWords, - boolean leaveOriginalDelims) { + @NotNull + public static String capitalizeWords(@NotNull String text, + @NotNull String tokenizerDelim, + boolean allWords, + boolean leaveOriginalDelims) { final StringTokenizer tokenizer = new StringTokenizer(text, tokenizerDelim, leaveOriginalDelims); final StringBuilder out = new StringBuilder(); boolean toCapitalize = true; @@ -662,12 +689,13 @@ public class StringUtil { return VOWELS.indexOf(c) >= 0; } - @NotNull public static String capitalize(@NotNull String s) { + @NotNull + public static String capitalize(@NotNull String s) { if (s.length() == 0) return s; if (s.length() == 1) return s.toUpperCase(); // Optimization - if (Character.isUpperCase(s.charAt(0)) ) return s; + if (Character.isUpperCase(s.charAt(0))) return s; return toUpperCase(s.charAt(0)) + s.substring(1); } @@ -735,6 +763,7 @@ public class StringUtil { /** * Equivalent to testee.startsWith(firstPrefix + secondPrefix) but avoids creating an object for concatenation. + * * @param testee * @param firstPrefix * @param secondPrefix @@ -763,7 +792,8 @@ public class StringUtil { return s != null && s.length() != 0 && s.charAt(s.length() - 1) == suffix; } - @NotNull public static String trimStart(@NotNull String s, @NonNls @NotNull String prefix) { + @NotNull + public static String trimStart(@NotNull String s, @NonNls @NotNull String prefix) { if (s.startsWith(prefix)) { return s.substring(prefix.length()); } @@ -777,7 +807,7 @@ public class StringUtil { } public static void repeatSymbol(@NotNull Appendable buffer, char symbol, int times) { - assert times >=0 : times; + assert times >= 0 : times; try { for (int i = 0; i < times; i++) { buffer.append(symbol); @@ -859,12 +889,14 @@ public class StringUtil { } - @NotNull public static List split(@NotNull String s, @NotNull String separator) { + @NotNull + public static List split(@NotNull String s, @NotNull String separator) { return split(s, separator, true); } - @NotNull public static List split(@NotNull String s, @NotNull String separator, - boolean excludeSeparator) { + @NotNull + public static List split(@NotNull String s, @NotNull String separator, + boolean excludeSeparator) { if (separator.length() == 0) { return Collections.singletonList(s); } @@ -950,11 +982,13 @@ public class StringUtil { return result; } - @NotNull public static String join(@NotNull final String[] strings, @NotNull final String separator) { + @NotNull + public static String join(@NotNull final String[] strings, @NotNull final String separator) { return join(strings, 0, strings.length, separator); } - @NotNull public static String join(@NotNull final String[] strings, int startIndex, int endIndex, @NotNull final String separator) { + @NotNull + public static String join(@NotNull final String[] strings, int startIndex, int endIndex, @NotNull final String separator) { final StringBuilder result = new StringBuilder(); for (int i = startIndex; i < endIndex; i++) { if (i > startIndex) result.append(separator); @@ -963,7 +997,8 @@ public class StringUtil { return result.toString(); } - @NotNull public static String[] zip(@NotNull String[] strings1, @NotNull String[] strings2, String separator) { + @NotNull + public static String[] zip(@NotNull String[] strings1, @NotNull String[] strings2, String separator) { if (strings1.length != strings2.length) throw new IllegalArgumentException(); String[] result = ArrayUtil.newStringArray(strings1.length); @@ -1008,7 +1043,8 @@ public class StringUtil { return result.toString(); } - @NotNull public static String join(@NotNull Collection strings, @NotNull final String separator) { + @NotNull + public static String join(@NotNull Collection strings, @NotNull final String separator) { final StringBuilder result = new StringBuilder(); for (String string : strings) { if (string != null && string.length() != 0) { @@ -1019,7 +1055,8 @@ public class StringUtil { return result.toString(); } - @NotNull public static String join(@NotNull final int[] strings, @NotNull final String separator) { + @NotNull + public static String join(@NotNull final int[] strings, @NotNull final String separator) { final StringBuilder result = new StringBuilder(); for (int i = 0; i < strings.length; i++) { if (i > 0) result.append(separator); @@ -1028,7 +1065,8 @@ public class StringUtil { return result.toString(); } - @NotNull public static String stripQuotesAroundValue(@NotNull String text) { + @NotNull + public static String stripQuotesAroundValue(@NotNull String text) { if (startsWithChar(text, '\"') || startsWithChar(text, '\'')) text = text.substring(1); if (endsWithChar(text, '\"') || endsWithChar(text, '\'')) text = text.substring(0, text.length() - 1); return text; @@ -1046,7 +1084,8 @@ public class StringUtil { * @return the size formatted as a string. * @since 5.0.1 */ - @NotNull public static String formatFileSize(final long fileSize) { + @NotNull + public static String formatFileSize(final long fileSize) { if (fileSize < 0x400) { return CommonBundle.message("format.file.size.bytes", fileSize); } @@ -1060,7 +1099,8 @@ public class StringUtil { return CommonBundle.message("format.file.size.mbytes", size); } - @NotNull public static String formatDate(long timestamp, DateFormat format) { + @NotNull + public static String formatDate(long timestamp, DateFormat format) { long minDelta = (new Date().getTime() - timestamp) / (1000 * 60); if (minDelta < 2) { @@ -1146,7 +1186,7 @@ public class StringUtil { } public static boolean containsAnyChar(@NotNull final String value, @NotNull final String chars) { - for (int i = 0; i < chars.length(); i ++) { + for (int i = 0; i < chars.length(); i++) { if (value.indexOf(chars.charAt(i)) != -1) return true; } @@ -1167,11 +1207,13 @@ public class StringUtil { /** * Strip out all characters not accepted by given filter - * @param s e.g. "/n my string " + * + * @param s e.g. "/n my string " * @param filter e.g. {@link CharFilter#NOT_WHITESPACE_FILTER} * @return stripped string e.g. "mystring" */ - @NotNull public static String strip(@NotNull final String s, @NotNull CharFilter filter) { + @NotNull + public static String strip(@NotNull final String s, @NotNull CharFilter filter) { StringBuilder result = new StringBuilder(s.length()); for (int i = 0; i < s.length(); i++) { char ch = s.charAt(i); @@ -1185,7 +1227,7 @@ public class StringUtil { public static List findMatches(String s, Pattern pattern) { List result = new SmartList(); Matcher m = pattern.matcher(s); - while(m.find()) { + while (m.find()) { if (m.groupCount() > 0) { result.add(m.group(1)); } @@ -1195,7 +1237,8 @@ public class StringUtil { /** * Find position of the first charachter accepted by given filter - * @param s the string to search + * + * @param s the string to search * @param filter * @return position of the first charachter accepted or -1 if not found */ @@ -1209,7 +1252,8 @@ public class StringUtil { return -1; } - @NotNull public static String replaceSubstring(@NotNull String string, @NotNull TextRange range, @NotNull String replacement) { + @NotNull + public static String replaceSubstring(@NotNull String string, @NotNull TextRange range, @NotNull String replacement) { return range.replace(string, replacement); } @@ -1224,13 +1268,14 @@ public class StringUtil { return true; } + public static boolean endsWith(@NotNull CharSequence text, @NotNull CharSequence suffix) { int l1 = text.length(); int l2 = suffix.length(); if (l1 < l2) return false; - for (int i = l1-1; i >= l1-l2; i--) { - if (text.charAt(i) != suffix.charAt(i+l2-l1)) return false; + for (int i = l1 - 1; i >= l1 - l2; i--) { + if (text.charAt(i) != suffix.charAt(i + l2 - l1)) return false; } return true; @@ -1259,8 +1304,8 @@ public class StringUtil { public static int commonSuffixLength(@NotNull CharSequence s1, @NotNull CharSequence s2) { if (s1.length() == 0 || s2.length() == 0) return 0; int i; - for (i = 0; i[start; end) interval. * - * @param s target char sequence to check - * @param start start offset to use within the given char sequence (inclusive) - * @param end end offset to use within the given char sequence (exclusive) - * @param c target symbol to check - * @return true if given symbol is contained at the target range of the given char sequence; - * false otherwise + * @param s target char sequence to check + * @param start start offset to use within the given char sequence (inclusive) + * @param end end offset to use within the given char sequence (exclusive) + * @param c target symbol to check + * @return true if given symbol is contained at the target range of the given char sequence; + * false otherwise */ public static boolean contains(CharSequence s, int start, int end, char c) { return indexOf(s, c, start, end) >= 0; @@ -1284,6 +1329,7 @@ public class StringUtil { public static int indexOf(@NotNull CharSequence s, char c) { return indexOf(s, c, 0, s.length()); } + public static int indexOf(@NotNull CharSequence s, char c, int start, int end) { for (int i = start; i < end; i++) { if (s.charAt(i) == c) return i; @@ -1292,14 +1338,14 @@ public class StringUtil { } /** - * Allows to retrieve index of last occurrence of the given symbols at [start; end) sub-sequence of the given text. + * Allows to retrieve index of last occurrence of the given symbols at [start; end) sub-sequence of the given text. * - * @param s target text - * @param c target symbol which last occurrence we want to check - * @param start start offset of the target text (inclusive) - * @param end end offset of the target text (exclusive) - * @return index of the last occurrence of the given symbol at the target sub-sequence of the given text if any; - * -1 otherwise + * @param s target text + * @param c target symbol which last occurrence we want to check + * @param start start offset of the target text (inclusive) + * @param end end offset of the target text (exclusive) + * @return index of the last occurrence of the given symbol at the target sub-sequence of the given text if any; + * -1 otherwise */ public static int lastIndexOf(@NotNull CharSequence s, char c, int start, int end) { for (int i = end - 1; i >= start; i--) { @@ -1312,13 +1358,15 @@ public class StringUtil { public static String first(@NotNull String text, final int length, final boolean appendEllipsis) { return text.length() > length ? text.substring(0, length) + (appendEllipsis ? "..." : "") : text; } + @NotNull public static CharSequence first(@NotNull CharSequence text, final int length, final boolean appendEllipsis) { return text.length() > length ? text.subSequence(0, length) + (appendEllipsis ? "..." : "") : text; } + @NotNull public static CharSequence last(@NotNull CharSequence text, final int length, boolean prependEllipsis) { - return text.length() > length ? (prependEllipsis ? "..." : "") + text.subSequence(text.length()-length, text.length()) : text; + return text.length() > length ? (prependEllipsis ? "..." : "") + text.subSequence(text.length() - length, text.length()) : text; } @NotNull @@ -1416,7 +1464,7 @@ public class StringUtil { public static int countChars(@NotNull CharSequence text, char c) { int count = 0; - for(int i = 0; i < text.length(); ++i) { + for (int i = 0; i < text.length(); ++i) { final char ch = text.charAt(i); if (ch == c) { ++count; @@ -1515,31 +1563,41 @@ public class StringUtil { @NotNull public static String escapeProperty(@NotNull String input, final boolean isKey) { final StringBuilder escaped = new StringBuilder(); - for(int i=0;i> 12) & 0xF, 16)); escaped.append(Character.forDigit((ch >> 8) & 0xF, 16)); @@ -1553,10 +1611,10 @@ public class StringUtil { } public static String getQualifiedName(String packageName, String className) { - if (packageName == null || packageName.length() == 0) { - return className; - } - return packageName + '.' + className; + if (packageName == null || packageName.length() == 0) { + return className; + } + return packageName + '.' + className; } public static int compareVersionNumbers(String v1, String v2) { @@ -1623,7 +1681,8 @@ public class StringUtil { if (i >= 0) { res++; i++; - } else { + } + else { break; } } @@ -1657,7 +1716,7 @@ public class StringUtil { if (s.charAt(i) == '\r') { String context = String.valueOf(last(s.subSequence(0, i), 10, true)) + first(s.subSequence(i, s.length()), 10, true); context = escapeStringCharacters(context); - LOG.error("Wrong line separators: '"+context+"' at offset "+i); + LOG.error("Wrong line separators: '" + context + "' at offset " + i); } } } @@ -1676,4 +1735,26 @@ public class StringUtil { public static String[] splitByLines(final String string) { return EOL_SPLIT_PATTERN.split(string); } + + public static List> getWordsWithOffset(final String s) { + List> res = Lists.newArrayList(); + StringBuilder name = new StringBuilder(); + int startInd = -1; + for (int i = 0; i < s.length(); i++) { + if (Character.isWhitespace(s.charAt(i))) { + if (name.length() > 0) { + res.add(Pair.create(name.toString(), startInd)); + name.setLength(0); + startInd = -1; + } + } + else { + if (startInd == -1) { + startInd = i; + } + name.append(s.charAt(i)); + } + } + return res; + } }