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);
 }