@Override
  public @Nullable Results doAnnotate(State collectedInfo) {
    if (collectedInfo == null) return null;
    ArrayList<String> options = new ArrayList<>();

    if (!collectedInfo.ignoredErrors.isEmpty()) {
      options.add("--ignore=" + DEFAULT_IGNORED_ERRORS + "," + StringUtil.join(collectedInfo.ignoredErrors, ","));
    }
    if (collectedInfo.hangClosingBrackets) {
      options.add("--hang-closing");
    }
    options.add("--max-line-length=" + collectedInfo.margin);
    options.add("-");

    PythonHelper pycodestyleScript;
    if (collectedInfo.interpreterVersion.isOlderThan(LanguageLevel.PYTHON36)) {
      pycodestyleScript = PythonHelper.PYCODESTYLE_2_8_0;
    }
    else if (collectedInfo.interpreterVersion.isOlderThan(LanguageLevel.PYTHON38)) {
      pycodestyleScript = PythonHelper.PYCODESTYLE_2_10_0;
    }
    else {
      pycodestyleScript = PythonHelper.PYCODESTYLE;
    }
    GeneralCommandLine cmd = pycodestyleScript.newCommandLine(collectedInfo.interpreterPath, options);

    ProcessOutput output = PySdkUtil.getProcessOutput(cmd, new File(collectedInfo.interpreterPath).getParent(),
                                                      ImmutableMap.of("PYTHONBUFFERED", "1"),
                                                      10000,
                                                      collectedInfo.fileText.getBytes(StandardCharsets.UTF_8), false);

    Results results = new Results(collectedInfo.level);
    if (output.isTimeout()) {
      LOG.info("Timeout running pycodestyle.py");
      return results;
    }
    if (!output.getStderr().isEmpty() && ApplicationInfo.getInstance().isEAP()) {
      LOG.info("Error running pycodestyle.py: " + output.getStderr());
    }
    for (String line : output.getStdoutLines()) {
      ContainerUtil.addIfNotNull(results.problems, parseProblem(line));
    }
    return results;
  }
@Override
  public @Nullable Results doAnnotate(State collectedInfo)