@Override
  public @Nullable Pair<TextRange, String> getErrorForStringFragment(Pair<TextRange, String> fragment, JsonStringLiteral stringLiteral) {
    if (fragment.getSecond().chars().anyMatch(c -> c <= '\u001F')) { // fragments are cached, string values - aren't; go inside only if we encountered a potentially 'wrong' char
      final String text = stringLiteral.getText();
      if (new TextRange(0, text.length()).contains(fragment.first)) {
        final int startOffset = fragment.first.getStartOffset();
        final String part = text.substring(startOffset, fragment.first.getEndOffset());
        char[] array = part.toCharArray();
        for (int i = 0; i < array.length; i++) {
          char c = array[i];
          if (c <= '\u001F') {
            return Pair.create(new TextRange(startOffset + i, startOffset + i + 1),
                               JsonBundle
                                 .message("syntax.error.control.char.in.string", "\\u" + Integer.toHexString(c | 0x10000).substring(1)));
          }
        }
      }
    }
    final String error = getStringError(fragment.second);
    return error == null ? null : Pair.create(fragment.first, error);
  }
@Override
  public @Nullable Pair<TextRange, String> getErrorForStringFragment(Pair<TextRange, String> fragment, JsonStringLiteral stringLiteral)