private String getCaseCorrectedLookupString(LookupElement item) { String lookupString = item.getLookupString(); if (item.isCaseSensitive()) { return lookupString; } final String prefix = itemPattern(item); final int length = prefix.length(); if (length == 0 || !itemMatcher(item).prefixMatches(prefix)) return lookupString; boolean isAllLower = true; boolean isAllUpper = true; boolean sameCase = true; for (int i = 0; i < length && (isAllLower || isAllUpper || sameCase); i++) { final char c = prefix.charAt(i); boolean isLower = Character.isLowerCase(c); boolean isUpper = Character.isUpperCase(c); // do not take this kind of symbols into account ('_', '@', etc.) if (!isLower && !isUpper) continue; isAllLower = isAllLower && isLower; isAllUpper = isAllUpper && isUpper; sameCase = sameCase && isLower == Character.isLowerCase(lookupString.charAt(i)); } if (sameCase) return lookupString; if (isAllLower) return lookupString.toLowerCase(); if (isAllUpper) return StringUtil.toUpperCase(lookupString); return lookupString; }
public void beforeCompletion(@NotNull CompletionInitializationContext context) { boolean acceptPathSeparator = false; { final int offset = context.getEditor().getCaretModel().getOffset(); PsiElement element = context.getFile().findElementAt(offset); if (element != null) { int prefixLength = offset - element.getTextRange().getStartOffset(); BipartiteString caretBipartiteElementText = splitByPrefixLength(element.getText(), prefixLength); Character separator = extractDirectoryTrailingFileSeparator(caretBipartiteElementText); acceptPathSeparator = separator != null; } } final OffsetMap offsetMap = context.getOffsetMap(); int idEnd = offsetMap.getOffset(CompletionInitializationContext.IDENTIFIER_END_OFFSET); final String text = context.getFile().getText(); while (idEnd < text.length()) { final char ch = text.charAt(idEnd); if (acceptPathSeparator) { if (ch == JstdConfigFileUtils.UNIX_PATH_SEPARATOR || ch == JstdConfigFileUtils.WINDOWS_PATH_SEPARATOR) { idEnd++; break; } } boolean acceptedChar = Character.isJavaIdentifierPart(ch) || IDENTIFIER_END_PATTERN.indexOf(ch) >= 0; if (acceptedChar) { idEnd++; } else { break; } } offsetMap.addOffset(CompletionInitializationContext.IDENTIFIER_END_OFFSET, idEnd); }