File: QuickInfo\QuickInfoSection.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.
 
using System.Collections.Immutable;
using System.Linq;
using System.Threading;
 
namespace Microsoft.CodeAnalysis.QuickInfo;
 
/// <summary>
/// Sections are used to make up a <see cref="QuickInfoItem"/>.
/// </summary>
public sealed class QuickInfoSection
{
    /// <summary>
    /// The kind of this section. Use <see cref="QuickInfoSectionKinds"/> for the most common kinds.
    /// </summary>
    public string Kind { get; }
 
    /// <summary>
    /// The individual tagged parts of this section.
    /// </summary>
    public ImmutableArray<TaggedText> TaggedParts { get; }
 
    private QuickInfoSection(string? kind, ImmutableArray<TaggedText> taggedParts)
    {
        Kind = kind ?? string.Empty;
        TaggedParts = taggedParts.NullToEmpty();
    }
 
    /// <summary>
    /// Creates a new instance of <see cref="QuickInfoSection"/>.
    /// </summary>
    /// <param name="kind">The kind of the section. Use <see cref="QuickInfoSectionKinds"/> for the most common kinds.</param>
    /// <param name="taggedParts">The individual tagged parts of the section.</param>
    public static QuickInfoSection Create(string? kind, ImmutableArray<TaggedText> taggedParts)
        => new(kind, taggedParts);
 
    private string? _text;
 
    /// <summary>
    /// The text of the section without tags.
    /// </summary>
    public string Text
    {
        get
        {
            if (_text == null)
            {
                if (TaggedParts.Length == 0)
                {
                    _text = string.Empty;
                }
                else
                {
                    Interlocked.CompareExchange(ref _text, string.Concat(TaggedParts.Select(t => t.Text)), null);
                }
            }
 
            return _text;
        }
    }
}