using System; using System.Collections.Generic; using System.Collections.Immutable; using Microsoft.CodeAnalysis.CSharp.Symbols; using Microsoft.CodeAnalysis.PooledObjects; using Roslyn.Utilities; namespace Microsoft.CodeAnalysis.CSharp; internal sealed class MergedNamespaceDeclaration : MergedNamespaceOrTypeDeclaration { private readonly ImmutableArray _declarations; private ImmutableArray _lazyChildren; public override DeclarationKind Kind => DeclarationKind.Namespace; public ImmutableArray NameLocations { get { if (_declarations.Length == 1) { return ImmutableArray.Create((Location)(object)_declarations[0].NameLocation); } ArrayBuilder instance = ArrayBuilder.GetInstance(); ImmutableArray.Enumerator enumerator = _declarations.GetEnumerator(); while (enumerator.MoveNext()) { SourceLocation nameLocation = enumerator.Current.NameLocation; if ((Location)(object)nameLocation != (Location)null) { instance.Add((Location)(object)nameLocation); } } return instance.ToImmutableAndFree(); } } public ImmutableArray Declarations => _declarations; public new ImmutableArray Children { get { if (_lazyChildren.IsDefault) { ImmutableInterlocked.InterlockedInitialize(ref _lazyChildren, MakeChildren()); } return _lazyChildren; } } private MergedNamespaceDeclaration(ImmutableArray declarations) : base(declarations.IsEmpty ? string.Empty : declarations[0].Name) { _declarations = declarations; } public static MergedNamespaceDeclaration Create(ImmutableArray declarations) { return new MergedNamespaceDeclaration(declarations); } public static MergedNamespaceDeclaration Create(SingleNamespaceDeclaration declaration) { return new MergedNamespaceDeclaration(ImmutableArray.Create(declaration)); } public LexicalSortKey GetLexicalSortKey(CSharpCompilation compilation) { LexicalSortKey lexicalSortKey = new LexicalSortKey((Location)(object)_declarations[0].NameLocation, compilation); for (int i = 1; i < _declarations.Length; i++) { lexicalSortKey = LexicalSortKey.First(lexicalSortKey, new LexicalSortKey((Location)(object)_declarations[i].NameLocation, compilation)); } return lexicalSortKey; } protected override ImmutableArray GetDeclarationChildren() { return StaticCast.From(Children); } private ImmutableArray MakeChildren() { ArrayBuilder val = null; ArrayBuilder val2 = null; bool flag = true; bool flag2 = true; ImmutableArray.Enumerator enumerator = _declarations.GetEnumerator(); while (enumerator.MoveNext()) { ImmutableArray.Enumerator enumerator2 = enumerator.Current.Children.GetEnumerator(); while (enumerator2.MoveNext()) { SingleNamespaceOrTypeDeclaration current = enumerator2.Current; if (current is SingleTypeDeclaration singleTypeDeclaration) { if (val2 == null) { val2 = ArrayBuilder.GetInstance(); } else if (flag2 && !singleTypeDeclaration.Identity.Equals(val2[0].Identity)) { flag2 = false; } val2.Add(singleTypeDeclaration); } else if (current is SingleNamespaceDeclaration singleNamespaceDeclaration) { if (val == null) { val = ArrayBuilder.GetInstance(); } else if (flag && !singleNamespaceDeclaration.Name.Equals(val[0].Name)) { flag = false; } val.Add(singleNamespaceDeclaration); } } } ArrayBuilder instance = ArrayBuilder.GetInstance(); if (val != null) { if (flag) { instance.Add((MergedNamespaceOrTypeDeclaration)Create(val.ToImmutableAndFree())); } else { Dictionary> dictionary = val.ToDictionary((Func)((SingleNamespaceDeclaration n) => n.Name), (IEqualityComparer)StringOrdinalComparer.Instance); val.Free(); foreach (ImmutableArray value in dictionary.Values) { instance.Add((MergedNamespaceOrTypeDeclaration)Create(value)); } } } if (val2 != null) { if (flag2) { instance.Add((MergedNamespaceOrTypeDeclaration)new MergedTypeDeclaration(val2.ToImmutableAndFree())); } else { Dictionary> dictionary2 = val2.ToDictionary((Func)((SingleTypeDeclaration t) => t.Identity), (IEqualityComparer)null); val2.Free(); foreach (ImmutableArray value2 in dictionary2.Values) { instance.Add((MergedNamespaceOrTypeDeclaration)new MergedTypeDeclaration(value2)); } } } return instance.ToImmutableAndFree(); } }