File: LSPDocumentSnapshot.cs
Web Access
Project: src\src\Razor\src\Razor\src\Microsoft.VisualStudio.LanguageServer.ContainedLanguage\Microsoft.VisualStudio.LanguageServer.ContainedLanguage.csproj (Microsoft.VisualStudio.LanguageServer.ContainedLanguage)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Razor.PooledObjects;
using Microsoft.VisualStudio.Text;
 
namespace Microsoft.VisualStudio.LanguageServer.ContainedLanguage;
 
public abstract class LSPDocumentSnapshot
{
    public abstract int Version { get; }
 
    public abstract Uri Uri { get; }
 
    public abstract ITextSnapshot Snapshot { get; }
 
    public abstract IReadOnlyList<VirtualDocumentSnapshot> VirtualDocuments { get; }
 
    public bool TryGetVirtualDocument<TVirtualDocument>([NotNullWhen(true)] out TVirtualDocument? virtualDocument)
        where TVirtualDocument : VirtualDocumentSnapshot
    {
        virtualDocument = null;
 
        for (var i = 0; i < VirtualDocuments.Count; i++)
        {
            if (VirtualDocuments[i] is TVirtualDocument actualVirtualDocument)
            {
                virtualDocument = actualVirtualDocument;
                return true;
            }
        }
 
        return false;
    }
 
    public bool TryGetAllVirtualDocuments<TVirtualDocument>([NotNullWhen(true)] out TVirtualDocument[]? virtualDocuments)
        where TVirtualDocument : VirtualDocumentSnapshot
    {
        List<TVirtualDocument>? actualVirtualDocuments = null;
 
        for (var i = 0; i < VirtualDocuments.Count; i++)
        {
            if (VirtualDocuments[i] is TVirtualDocument actualVirtualDocument)
            {
                actualVirtualDocuments ??= [];
                actualVirtualDocuments.Add(actualVirtualDocument);
            }
        }
 
        virtualDocuments = actualVirtualDocuments?.ToArray();
        return virtualDocuments is not null;
    }
 
    internal bool TryGetAllVirtualDocumentsAsArray<TVirtualDocument>([NotNullWhen(true)] out ImmutableArray<TVirtualDocument> virtualDocuments)
        where TVirtualDocument : VirtualDocumentSnapshot
    {
        var documents = VirtualDocuments;
        using var actualVirtualDocuments = new PooledArrayBuilder<TVirtualDocument>(documents.Count);
 
        for (var i = 0; i < documents.Count; i++)
        {
            if (documents[i] is TVirtualDocument actualVirtualDocument)
            {
                actualVirtualDocuments.Add(actualVirtualDocument);
            }
        }
 
        virtualDocuments = actualVirtualDocuments.ToImmutableAndClear();
        return virtualDocuments.Length > 0;
    }
}