List<CompilerMessage> parseMessages(String input) throws IOException {
    if (input.contains("The type groovy.lang.GroovyObject cannot be resolved. It is indirectly referenced from required .class files")) {
      return Collections.singletonList(new CompilerMessage(
        myBuilderName, BuildMessage.Kind.ERROR,
        GroovyJpsBundle.message("no.groovy.library.0", myChunk.representativeTarget().getModule().getName())
      ));
    }

    List<CompilerMessage> parsedMessages = new ArrayList<>();

    String[] msgs = StringUtil.convertLineSeparators(input).split(PROB_SEPARATOR);
    for (String msg : msgs) {
      if (msg.length() > 1) {
        // add the error bean
        CompilerMessage message = parseMessage(msg);
        if (message != null) {
          parsedMessages.add(message);
        }
        else {
          // assume that there are one or more non-normal messages here
          // All messages start with <num>. ERROR or <num>. WARNING
          String[] extraMsgs = msg.split("\n");
          StringBuilder sb = new StringBuilder();
          for (String extraMsg : extraMsgs) {
            if (extraMsg.indexOf(". WARNING") > 0 || extraMsg.indexOf(". ERROR") > 0) {
              handleCurrentMessage(parsedMessages, sb);
              sb = new StringBuilder("\n").append(extraMsg).append("\n");
            }
            else {
              if (!PROB_SEPARATOR.equals(extraMsg)) {
                sb.append(extraMsg).append("\n");
              }
            }
          }
          handleCurrentMessage(parsedMessages, sb);
        }
      }
    }
    return parsedMessages;
  }
List<CompilerMessage> parseMessages(String input)