File: Common\GlyphExtensions.cs
Web Access
Project: src\src\Features\Core\Portable\Microsoft.CodeAnalysis.Features.csproj (Microsoft.CodeAnalysis.Features)
// 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.
 
#nullable disable
 
using System.Collections.Immutable;
using Microsoft.CodeAnalysis.Tags;
 
namespace Microsoft.CodeAnalysis;
 
internal static class GlyphExtensions
{
    public static ImmutableArray<Glyph> GetGlyphs(this ImmutableArray<string> tags)
    {
        var builder = ImmutableArray.CreateBuilder<Glyph>(initialCapacity: tags.Length);
 
        foreach (var tag in tags)
        {
            var glyph = GetGlyph(tag, tags);
            if (glyph != Glyph.None)
            {
                builder.Add(glyph);
            }
        }
 
        return builder.ToImmutable();
    }
 
    public static Glyph GetFirstGlyph(this ImmutableArray<string> tags)
    {
        var glyphs = GetGlyphs(tags);
 
        return !glyphs.IsEmpty
            ? glyphs[0]
            : Glyph.None;
    }
 
    private static Glyph GetGlyph(string tag, ImmutableArray<string> allTags)
    {
        switch (tag)
        {
            case WellKnownTags.Assembly:
                return Glyph.Assembly;
 
            case WellKnownTags.File:
                return allTags.Contains(LanguageNames.VisualBasic) ? Glyph.BasicFile : Glyph.CSharpFile;
 
            case WellKnownTags.Project:
                return allTags.Contains(LanguageNames.VisualBasic) ? Glyph.BasicProject : Glyph.CSharpProject;
 
            case WellKnownTags.Class:
                return (GetAccessibility(allTags)) switch
                {
                    Accessibility.Protected => Glyph.ClassProtected,
                    Accessibility.Private => Glyph.ClassPrivate,
                    Accessibility.Internal => Glyph.ClassInternal,
                    _ => Glyph.ClassPublic,
                };
            case WellKnownTags.Constant:
                return (GetAccessibility(allTags)) switch
                {
                    Accessibility.Protected => Glyph.ConstantProtected,
                    Accessibility.Private => Glyph.ConstantPrivate,
                    Accessibility.Internal => Glyph.ConstantInternal,
                    _ => Glyph.ConstantPublic,
                };
            case WellKnownTags.Delegate:
                return (GetAccessibility(allTags)) switch
                {
                    Accessibility.Protected => Glyph.DelegateProtected,
                    Accessibility.Private => Glyph.DelegatePrivate,
                    Accessibility.Internal => Glyph.DelegateInternal,
                    _ => Glyph.DelegatePublic,
                };
            case WellKnownTags.Enum:
                return (GetAccessibility(allTags)) switch
                {
                    Accessibility.Protected => Glyph.EnumProtected,
                    Accessibility.Private => Glyph.EnumPrivate,
                    Accessibility.Internal => Glyph.EnumInternal,
                    _ => Glyph.EnumPublic,
                };
            case WellKnownTags.EnumMember:
                return (GetAccessibility(allTags)) switch
                {
                    Accessibility.Protected => Glyph.EnumMemberProtected,
                    Accessibility.Private => Glyph.EnumMemberPrivate,
                    Accessibility.Internal => Glyph.EnumMemberInternal,
                    _ => Glyph.EnumMemberPublic,
                };
            case WellKnownTags.Error:
                return Glyph.Error;
 
            case WellKnownTags.Event:
                return (GetAccessibility(allTags)) switch
                {
                    Accessibility.Protected => Glyph.EventProtected,
                    Accessibility.Private => Glyph.EventPrivate,
                    Accessibility.Internal => Glyph.EventInternal,
                    _ => Glyph.EventPublic,
                };
            case WellKnownTags.ExtensionMethod:
                return (GetAccessibility(allTags)) switch
                {
                    Accessibility.Protected => Glyph.ExtensionMethodProtected,
                    Accessibility.Private => Glyph.ExtensionMethodPrivate,
                    Accessibility.Internal => Glyph.ExtensionMethodInternal,
                    _ => Glyph.ExtensionMethodPublic,
                };
            case WellKnownTags.Field:
                return (GetAccessibility(allTags)) switch
                {
                    Accessibility.Protected => Glyph.FieldProtected,
                    Accessibility.Private => Glyph.FieldPrivate,
                    Accessibility.Internal => Glyph.FieldInternal,
                    _ => Glyph.FieldPublic,
                };
            case WellKnownTags.Interface:
                return (GetAccessibility(allTags)) switch
                {
                    Accessibility.Protected => Glyph.InterfaceProtected,
                    Accessibility.Private => Glyph.InterfacePrivate,
                    Accessibility.Internal => Glyph.InterfaceInternal,
                    _ => Glyph.InterfacePublic,
                };
            case WellKnownTags.TargetTypeMatch:
                return Glyph.TargetTypeMatch;
 
            case WellKnownTags.Intrinsic:
                return Glyph.Intrinsic;
 
            case WellKnownTags.Keyword:
                return Glyph.Keyword;
 
            case WellKnownTags.Label:
                return Glyph.Label;
 
            case WellKnownTags.Local:
                return Glyph.Local;
 
            case WellKnownTags.Namespace:
                return Glyph.Namespace;
 
            case WellKnownTags.Method:
                return (GetAccessibility(allTags)) switch
                {
                    Accessibility.Protected => Glyph.MethodProtected,
                    Accessibility.Private => Glyph.MethodPrivate,
                    Accessibility.Internal => Glyph.MethodInternal,
                    _ => Glyph.MethodPublic,
                };
            case WellKnownTags.Module:
                return (GetAccessibility(allTags)) switch
                {
                    Accessibility.Protected => Glyph.ModulePublic,
                    Accessibility.Private => Glyph.ModulePrivate,
                    Accessibility.Internal => Glyph.ModuleInternal,
                    _ => Glyph.ModulePublic,
                };
            case WellKnownTags.Folder:
                return Glyph.OpenFolder;
 
            case WellKnownTags.Operator:
                return Glyph.Operator;
 
            case WellKnownTags.Parameter:
                return Glyph.Parameter;
 
            case WellKnownTags.Property:
                return (GetAccessibility(allTags)) switch
                {
                    Accessibility.Protected => Glyph.PropertyProtected,
                    Accessibility.Private => Glyph.PropertyPrivate,
                    Accessibility.Internal => Glyph.PropertyInternal,
                    _ => Glyph.PropertyPublic,
                };
            case WellKnownTags.RangeVariable:
                return Glyph.RangeVariable;
 
            case WellKnownTags.Reference:
                return Glyph.Reference;
 
            case WellKnownTags.NuGet:
                return Glyph.NuGet;
 
            case WellKnownTags.Structure:
                return (GetAccessibility(allTags)) switch
                {
                    Accessibility.Protected => Glyph.StructureProtected,
                    Accessibility.Private => Glyph.StructurePrivate,
                    Accessibility.Internal => Glyph.StructureInternal,
                    _ => Glyph.StructurePublic,
                };
            case WellKnownTags.TypeParameter:
                return Glyph.TypeParameter;
 
            case WellKnownTags.Snippet:
                return Glyph.Snippet;
 
            case WellKnownTags.Warning:
                return Glyph.CompletionWarning;
 
            case WellKnownTags.StatusInformation:
                return Glyph.StatusInformation;
        }
 
        return Glyph.None;
    }
 
    public static Accessibility GetAccessibility(ImmutableArray<string> tags)
    {
        foreach (var tag in tags)
        {
            switch (tag)
            {
                case WellKnownTags.Public:
                    return Accessibility.Public;
                case WellKnownTags.Protected:
                    return Accessibility.Protected;
                case WellKnownTags.Internal:
                    return Accessibility.Internal;
                case WellKnownTags.Private:
                    return Accessibility.Private;
            }
        }
 
        return Accessibility.NotApplicable;
    }
}