File: EditorFactory.cs
Web Access
Project: src\src\EditorFeatures\TestUtilities\Microsoft.CodeAnalysis.EditorFeatures.Test.Utilities.csproj (Microsoft.CodeAnalysis.EditorFeatures.Test.Utilities)
// 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.IO;
using Microsoft.CodeAnalysis.Editor.UnitTests;
using Microsoft.VisualStudio.Composition;
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Editor;
using Microsoft.VisualStudio.Utilities;
using Roslyn.Test.Utilities;
 
namespace Roslyn.Test.EditorUtilities;
 
public static class EditorFactory
{
    public static ITextBuffer2 CreateBuffer(
        ExportProvider exportProvider,
        params string[] lines)
    {
        var contentType = exportProvider.GetExportedValue<ITextBufferFactoryService>().TextContentType;
 
        return CreateBuffer(exportProvider, contentType, lines);
    }
 
    public static ITextBuffer2 CreateBuffer(
        ExportProvider exportProvider,
        IContentType contentType,
        params string[] lines)
    {
        var text = LinesToFullText(lines);
 
        // The overload of CreateTextBuffer that takes just a string doesn't initialize the whitespace tracking logic in the editor,
        // so calls to IIndentationManagerService won't work correctly. Tracked by https://devdiv.visualstudio.com/DevDiv/_workitems/edit/1005541.
        using var reader = new StringReader(text);
        return (ITextBuffer2)exportProvider.GetExportedValue<ITextBufferFactoryService>().CreateTextBuffer(reader, contentType);
    }
 
    public static DisposableTextView CreateView(
        ExportProvider exportProvider,
        params string[] lines)
    {
        var contentType = exportProvider.GetExportedValue<ITextBufferFactoryService>().TextContentType;
        return CreateView(exportProvider, contentType, lines);
    }
 
    public static DisposableTextView CreateView(
        ExportProvider exportProvider,
        IContentType contentType,
        params string[] lines)
    {
        WpfTestRunner.RequireWpfFact($"Creates an {nameof(IWpfTextView)} through {nameof(EditorFactory)}.{nameof(CreateView)}");
 
        var buffer = CreateBuffer(exportProvider, contentType, lines);
        return exportProvider.GetExportedValue<ITextEditorFactoryService>().CreateDisposableTextView(buffer);
    }
 
    public static DisposableTextView CreateView(
        ExportProvider exportProvider,
        IContentType contentType,
        ImmutableArray<string> roles)
    {
        WpfTestRunner.RequireWpfFact($"Creates an {nameof(IWpfTextView)} through {nameof(EditorFactory)}.{nameof(CreateView)}");
 
        var buffer = CreateBuffer(exportProvider, contentType);
        return exportProvider.GetExportedValue<ITextEditorFactoryService>().CreateDisposableTextView(buffer, roles);
    }
 
    public static string LinesToFullText(params string[] lines)
        => string.Join("\r\n", lines);
}