public static void Organize( 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. IEnumerable<SyntaxTrivia> leadingTrivia; initialList[0] = initialList[0].GetNodeWithoutLeadingBannerAndPreprocessorDirectives(out 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; }