File: Completion\VSInternalCompletionListExtensions.cs
Web Access
Project: src\src\Razor\src\Razor\src\Microsoft.CodeAnalysis.Razor.Workspaces\Microsoft.CodeAnalysis.Razor.Workspaces.csproj (Microsoft.CodeAnalysis.Razor.Workspaces)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Linq;
using System.Text.Json;
using System.Text.Json.Nodes;
 
namespace Microsoft.CodeAnalysis.Razor.Completion;
 
internal static class VSInternalCompletionListExtensions
{
    public static void SetResultId(
        this RazorVSInternalCompletionList completionList,
        int resultId,
        VSInternalClientCapabilities clientCapabilities)
    {
        var data = JsonSerializer.SerializeToElement(new JsonObject()
        {
            [VSInternalCompletionItemExtensions.ResultIdKey] = resultId,
        });
 
        if (clientCapabilities.SupportsAnyCompletionListData())
        {
            if (clientCapabilities.SupportsCompletionListData() || completionList.Data is not null)
            {
                completionList.Data = CompletionListMerger.MergeData(data, completionList.Data);
            }
 
            if (clientCapabilities.SupportsCompletionListItemDefaultsData() || completionList.ItemDefaults?.Data is not null)
            {
                completionList.ItemDefaults ??= new();
                completionList.ItemDefaults.Data = CompletionListMerger.MergeData(data, completionList.ItemDefaults.Data);
            }
 
            // Merge data for items that won't inherit the default
            foreach (var completionItem in completionList.Items.Where(c => c.Data is not null))
            {
                completionItem.Data = CompletionListMerger.MergeData(data, completionItem.Data);
            }
        }
        else
        {
            // No CompletionList.Data support
            foreach (var completionItem in completionList.Items)
            {
                completionItem.Data = CompletionListMerger.MergeData(data, completionItem.Data);
            }
        }
    }
}