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;
}