public boolean submit()

in flutter-idea/src/io/flutter/FlutterErrorReportSubmitter.java [54:208]


  public boolean submit(@NotNull IdeaLoggingEvent[] events,
                        @Nullable String additionalInfo,
                        @NotNull Component parentComponent,
                        @NotNull Consumer<? super SubmittedReportInfo> consumer) {
    if (events.length == 0) {
      // Don't remove the cast until a later version of Android Studio.
      fail(((Consumer<SubmittedReportInfo>)consumer));
      return false;
    }

    String stackTrace = null;
    String errorMessage = null;

    for (IdeaLoggingEvent event : events) {
      String stackTraceText = event.getThrowableText();
      if (stackTraceText.startsWith(COMPLETION_EXCEPTION_PREFIX)) {
        stackTraceText = stackTraceText.substring(COMPLETION_EXCEPTION_PREFIX.length());
        if (stackTraceText.startsWith(DaemonApi.FLUTTER_ERROR_PREFIX)) {
          final String message = stackTraceText.substring(DaemonApi.FLUTTER_ERROR_PREFIX.length());
          final int start = message.indexOf(": ") + 2;
          if (start == 0) continue;
          int end = message.indexOf('\n');
          if (end < 0) end = message.length();
          final String error = message.substring(start, end);
          stackTrace = message.substring(end + 1);
          for (String err : KNOWN_ERRORS) {
            if (error.contains(err)) {
              if (end != message.length()) {
                // Dart stack trace included so extract it and set the issue target to the Flutter repo.
                errorMessage = err;
                final int endOfDartStack = stackTrace.indexOf("\\n\"\n");
                if (endOfDartStack > 0) {
                  // Get only the part between quotes. If the format is wrong just use the whole thing.
                  stackTrace = stackTrace.substring(1, endOfDartStack);
                }
                break;
              }
            }
          }
        }
      }
    }

    final DataContext dataContext = DataManager.getInstance().getDataContext(parentComponent);
    final Project project = PROJECT.getData(dataContext);
    if (project == null) {
      // Don't remove the cast until a later version of Android Studio.
      fail(((Consumer<SubmittedReportInfo>)consumer));
      return false;
    }

    final StringBuilder builder = new StringBuilder();

    builder.append("Please file this bug report at ");
    builder.append("https://github.com/flutter/flutter-intellij/issues/new");
    builder.append(".\n");
    builder.append("\n");
    builder.append("---\n");
    builder.append("\n");

    builder.append("## What happened\n");
    builder.append("\n");
    if (additionalInfo != null) {
      builder.append(additionalInfo.trim()).append("\n");
    }
    else {
      builder.append("(please describe what you were doing when this exception occurred)\n");
    }
    builder.append("\n");

    builder.append("## Version information\n");
    builder.append("\n");

    // IntelliJ version
    final ApplicationInfo info = ApplicationInfo.getInstance();
    builder.append(info.getVersionName()).append(" `").append(info.getFullVersion()).append("`");

    final PluginId pid = FlutterUtils.getPluginId();
    final IdeaPluginDescriptor flutterPlugin = PluginManagerCore.getPlugin(pid);
    //noinspection ConstantConditions
    builder.append(" • Flutter plugin `").append(pid.getIdString()).append(' ').append(flutterPlugin.getVersion()).append("`");

    final IdeaPluginDescriptor dartPlugin = PluginManagerCore.getPlugin(PluginId.getId("Dart"));
    if (dartPlugin != null) {
      builder.append(" • Dart plugin `").append(dartPlugin.getVersion()).append("`");
    }
    builder.append("\n\n");

    final FlutterSdk sdk = FlutterSdk.getFlutterSdk(project);
    if (sdk == null) {
      builder.append("No Flutter sdk configured.\n");
    }
    else {
      final String flutterVersion = getFlutterVersion(sdk);
      if (flutterVersion != null) {
        builder.append(flutterVersion.trim()).append("\n");
      }
      else {
        builder.append("Error getting Flutter sdk information.\n");
      }
    }
    builder.append("\n");

    if (stackTrace == null) {
      for (IdeaLoggingEvent event : events) {
        builder.append("## Exception\n");
        builder.append("\n");
        builder.append(event.getMessage()).append("\n");
        builder.append("\n");

        if (event.getThrowable() != null) {
          builder.append("```\n");
          builder.append(event.getThrowableText().trim()).append("\n");
          builder.append("```\n");
          builder.append("\n");
        }
      }
    }
    else {
      builder.append("## Exception\n");
      builder.append("\n");
      builder.append(errorMessage).append("\n");
      builder.append("\n");
      builder.append("```\n");
      builder.append(stackTrace.replaceAll("\\\\n", "\n")).append("\n");
      builder.append("```\n");
      builder.append("\n");
    }

    for (IdeaLoggingEvent event : events) {
      FlutterInitializer.getAnalytics().sendException(event.getThrowableText(), false);
    }

    final String text = builder.toString().trim() + "\n";

    // Create scratch file.
    final ScratchRootType scratchRoot = ScratchRootType.getInstance();
    final VirtualFile file = scratchRoot.createScratchFile(project, "bug-report.md", PlainTextLanguage.INSTANCE, text);

    if (file == null) {
      // Don't remove the cast until a later version of Android Studio.
      fail(((Consumer<SubmittedReportInfo>)consumer));
      return false;
    }

    // Open the file.
    new OpenFileDescriptor(project, file).navigate(true);

    consumer.consume(new SubmittedReportInfo(
      null,
      "",
      SubmittedReportInfo.SubmissionStatus.NEW_ISSUE));

    return true;
  }