private static void OrganizeWorker( SyntaxList <ExternAliasDirectiveSyntax> externAliasList, SyntaxList <UsingDirectiveSyntax> usingList, bool placeSystemNamespaceFirst, out SyntaxList <ExternAliasDirectiveSyntax> organizedExternAliasList, out SyntaxList <UsingDirectiveSyntax> organizedUsingList ) { if (externAliasList.Count > 0 || usingList.Count > 0) { // Merge the list of usings and externs into one list. // order them in the order that they were originally in the // file. var initialList = usingList .Cast <SyntaxNode>() .Concat(externAliasList) .OrderBy(n => n.SpanStart) .ToList(); if (!initialList.SpansPreprocessorDirective()) { // If there is a banner comment that precedes the nodes, // then remove it and store it for later. initialList[0] = initialList[ 0 ].GetNodeWithoutLeadingBannerAndPreprocessorDirectives(out var leadingTrivia); var comparer = placeSystemNamespaceFirst ? UsingsAndExternAliasesDirectiveComparer.SystemFirstInstance : UsingsAndExternAliasesDirectiveComparer.NormalInstance; var finalList = initialList.OrderBy(comparer).ToList(); // Check if sorting the list actually changed anything. If not, then we don't // need to make any changes to the file. if (!finalList.SequenceEqual(initialList)) { // Make sure newlines are correct between nodes. EnsureNewLines(finalList); // Reattach the banner. finalList[0] = finalList[0].WithPrependedLeadingTrivia(leadingTrivia); // Now split out the externs and usings back into two separate lists. organizedExternAliasList = finalList .Where(t => t is ExternAliasDirectiveSyntax) .Cast <ExternAliasDirectiveSyntax>() .ToSyntaxList(); organizedUsingList = finalList .Where(t => t is UsingDirectiveSyntax) .Cast <UsingDirectiveSyntax>() .ToSyntaxList(); return; } } } organizedExternAliasList = externAliasList; organizedUsingList = usingList; }