File: UsingDirectiveSyntaxExtensions.cs
Web Access
Project: ..\..\..\src\CodeStyle\CSharp\CodeFixes\Microsoft.CodeAnalysis.CSharp.CodeStyle.Fixes.csproj (Microsoft.CodeAnalysis.CSharp.CodeStyle.Fixes)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System.Collections.Generic;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.CSharp.Utilities;
using Roslyn.Utilities;
 
namespace Microsoft.CodeAnalysis.CSharp.Extensions
{
    internal static class UsingDirectiveSyntaxExtensions
    {
        public static void SortUsingDirectives(
            this List<UsingDirectiveSyntax> usingDirectives,
            SyntaxList<UsingDirectiveSyntax> existingDirectives,
            bool placeSystemNamespaceFirst)
        {
            var systemFirstInstance = UsingsAndExternAliasesDirectiveComparer.SystemFirstInstance;
            var normalInstance = UsingsAndExternAliasesDirectiveComparer.NormalInstance;
 
            var specialCaseSystem = placeSystemNamespaceFirst;
            var comparers = specialCaseSystem
                ? (systemFirstInstance, normalInstance)
                : (normalInstance, systemFirstInstance);
 
            // First, see if the usings were sorted according to the user's preference.  If so,
            // keep the same sorting after we add the using.  However, if the usings weren't sorted
            // according to their preference, then see if they're sorted in the other way.  If so
            // preserve that sorting as well.  That way if the user is working with a file that 
            // was written on a machine with a different default, the usings will stay in a 
            // reasonable order.
            if (existingDirectives.IsSorted(comparers.Item1))
            {
                usingDirectives.Sort(comparers.Item1);
            }
            else if (existingDirectives.IsSorted(comparers.Item2))
            {
                usingDirectives.Sort(comparers.Item2);
            }
        }
    }
}