@Nullable
  private static ParsedLine parseStackTraceLine(@NotNull String line, boolean searchForRParenOnlyAfterAt) {
    int startIdx = findAtPrefix(line);
    int rParenIdx = findRParenAfterLocation(line, searchForRParenOnlyAfterAt  ? startIdx : 0);
    if (rParenIdx < 0) return null;

    TextRange methodName = findMethodNameCandidateBefore(line, startIdx, rParenIdx);
    if (methodName == null) return null;

    int lParenIdx = methodName.getEndOffset();
    int dotIdx = methodName.getStartOffset() - 1;
    int moduleIdx = line.indexOf('/');
    int classNameIdx;
    if (moduleIdx > -1 && moduleIdx < dotIdx && !line.startsWith("0x", moduleIdx + 1)) {
      classNameIdx = moduleIdx + 1;
      // `//` is used as a separator in an unnamed module with a class loader name
      if (line.charAt(classNameIdx) == '/') {
        classNameIdx++;
      }
    }
    else {
      if (startIdx >= 0) {
        // consider STANDALONE_AT here
        classNameIdx = startIdx + 1 + AT.length() + (line.charAt(startIdx) == 'a' ? 0 : 1);
      } else {
        classNameIdx = 0;
      }
    }

    return ParsedLine.createFromFileAndLine(new TextRange(classNameIdx, handleSpaces(line, dotIdx, -1)),
                                            trimRange(line, methodName),
                                            lParenIdx + 1, rParenIdx, line);
  }
@Nullable
  private static ParsedLine parseStackTraceLine(@NotNull String line, boolean searchForRParenOnlyAfterAt)