void _organizeDirectives()

in packages/snippets/lib/import_sorter.dart [100:220]


  void _organizeDirectives() {
    final LineInfo lineInfo = unit.lineInfo ?? LineInfo.fromContent(code);
    bool hasLibraryDirective = false;
    final List<_DirectiveInfo> directives = <_DirectiveInfo>[];
    for (final Directive directive in unit.directives) {
      if (directive is LibraryDirective) {
        hasLibraryDirective = true;
      }
      if (directive is UriBasedDirective) {
        final _DirectivePriority? priority = getDirectivePriority(directive);
        if (priority != null) {
          int offset = directive.offset;
          int end = directive.end;

          final Token? leadingComment =
              getLeadingComment(unit, directive, lineInfo);
          final Token? trailingComment =
              getTrailingComment(unit, directive, lineInfo, end);

          String? leadingCommentText;
          if (leadingComment != null) {
            leadingCommentText =
                code.substring(leadingComment.offset, directive.offset);
            offset = leadingComment.offset;
          }
          String? trailingCommentText;
          if (trailingComment != null) {
            trailingCommentText =
                code.substring(directive.end, trailingComment.end);
            end = trailingComment.end;
          }
          String? documentationText;
          final Comment? documentationComment = directive.documentationComment;
          if (documentationComment != null) {
            documentationText = code.substring(
                documentationComment.offset, documentationComment.end);
          }
          String? annotationText;
          final Token? beginToken = directive.metadata.beginToken;
          final Token? endToken = directive.metadata.endToken;
          if (beginToken != null && endToken != null) {
            annotationText = code.substring(beginToken.offset, endToken.end);
          }
          final String text = code.substring(
              directive.firstTokenAfterCommentAndMetadata.offset,
              directive.end);
          final String uriContent = directive.uri.stringValue ?? '';
          directives.add(
            _DirectiveInfo(
              directive,
              priority,
              leadingCommentText,
              documentationText,
              annotationText,
              uriContent,
              trailingCommentText,
              offset,
              end,
              text,
            ),
          );
        }
      }
    }
    // nothing to do
    if (directives.isEmpty) {
      return;
    }
    final int firstDirectiveOffset = directives.first.offset;
    final int lastDirectiveEnd = directives.last.end;

    // Without a library directive, the library comment is the comment of the
    // first directive.
    _DirectiveInfo? libraryDocumentationDirective;
    if (!hasLibraryDirective && directives.isNotEmpty) {
      libraryDocumentationDirective = directives.first;
    }

    // sort
    directives.sort();
    // append directives with grouping
    String directivesCode;
    {
      final StringBuffer sb = StringBuffer();
      if (libraryDocumentationDirective != null &&
          libraryDocumentationDirective.documentationText != null) {
        sb.write(libraryDocumentationDirective.documentationText);
        sb.write(endOfLine);
      }
      _DirectivePriority currentPriority = directives.first.priority;
      for (final _DirectiveInfo directiveInfo in directives) {
        if (currentPriority != directiveInfo.priority) {
          sb.write(endOfLine);
          currentPriority = directiveInfo.priority;
        }
        if (directiveInfo.leadingCommentText != null) {
          sb.write(directiveInfo.leadingCommentText);
        }
        if (directiveInfo != libraryDocumentationDirective &&
            directiveInfo.documentationText != null) {
          sb.write(directiveInfo.documentationText);
          sb.write(endOfLine);
        }
        if (directiveInfo.annotationText != null) {
          sb.write(directiveInfo.annotationText);
          sb.write(endOfLine);
        }
        sb.write(directiveInfo.text);
        if (directiveInfo.trailingCommentText != null) {
          sb.write(directiveInfo.trailingCommentText);
        }
        sb.write(endOfLine);
      }
      directivesCode = sb.toString();
      directivesCode = directivesCode.trimRight();
    }
    // prepare code
    final String beforeDirectives = code.substring(0, firstDirectiveOffset);
    final String afterDirectives = code.substring(lastDirectiveEnd);
    code = beforeDirectives + directivesCode + afterDirectives;
  }