Skip to content

Commit ab34327

Browse files
committed
Use ITextBufferCloneService if available in AsText
This change also ensures the projection buffers created in Visual Studio have the ITextBufferCloneService added to their property bag. Fixes https://devdiv.visualstudio.com/DevDiv/_workitems/edit/604150
1 parent f076f79 commit ab34327

2 files changed

Lines changed: 9 additions & 1 deletion

File tree

src/EditorFeatures/Text/Extensions.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@ internal static TextLine AsTextLine(this ITextSnapshotLine line)
3737
=> line.Snapshot.AsText().Lines[line.LineNumber];
3838

3939
public static SourceText AsText(this ITextSnapshot textSnapshot)
40-
=> SnapshotSourceText.From(textBufferCloneServiceOpt: null, textSnapshot);
40+
{
41+
textSnapshot.TextBuffer.Properties.TryGetProperty<ITextBufferCloneService>(typeof(ITextBufferCloneService), out var textBufferCloneServiceOpt);
42+
return SnapshotSourceText.From(textBufferCloneServiceOpt, textSnapshot);
43+
}
4144

4245
internal static SourceText AsRoslynText(this ITextSnapshot textSnapshot, ITextBufferCloneService textBufferCloneServiceOpt, Encoding encoding)
4346
=> new SnapshotSourceText.ClosedSnapshotSourceText(textBufferCloneServiceOpt, ((ITextSnapshot2)textSnapshot).TextImage, encoding);

src/VisualStudio/Core/Def/Implementation/ProjectSystem/VisualStudioWorkspaceImpl.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
using Microsoft.VisualStudio.Shell;
2424
using Microsoft.VisualStudio.Shell.Interop;
2525
using Microsoft.VisualStudio.Text;
26+
using Microsoft.VisualStudio.Text.Projection;
2627
using Roslyn.Utilities;
2728
using VSLangProj;
2829
using VSLangProj140;
@@ -39,6 +40,7 @@ internal abstract partial class VisualStudioWorkspaceImpl : VisualStudioWorkspac
3940
private const string AppCodeFolderName = "App_Code";
4041

4142
private readonly ITextBufferFactoryService _textBufferFactoryService;
43+
private readonly IProjectionBufferFactoryService _projectionBufferFactoryService;
4244
private readonly ITextBufferCloneService _textBufferCloneService;
4345

4446
// document worker coordinator
@@ -64,7 +66,9 @@ public VisualStudioWorkspaceImpl(ExportProvider exportProvider)
6466
{
6567
_textBufferCloneService = exportProvider.GetExportedValue<ITextBufferCloneService>();
6668
_textBufferFactoryService = exportProvider.GetExportedValue<ITextBufferFactoryService>();
69+
_projectionBufferFactoryService = exportProvider.GetExportedValue<IProjectionBufferFactoryService>();
6770
_textBufferFactoryService.TextBufferCreated += AddTextBufferCloneServiceToBuffer;
71+
_projectionBufferFactoryService.ProjectionBufferCreated += AddTextBufferCloneServiceToBuffer;
6872
exportProvider.GetExportedValue<PrimaryWorkspace>().Register(this);
6973
}
7074

@@ -1096,6 +1100,7 @@ protected override void Dispose(bool finalize)
10961100
if (!finalize)
10971101
{
10981102
_textBufferFactoryService.TextBufferCreated -= AddTextBufferCloneServiceToBuffer;
1103+
_projectionBufferFactoryService.ProjectionBufferCreated -= AddTextBufferCloneServiceToBuffer;
10991104
}
11001105

11011106
// workspace is going away. unregister this workspace from work coordinator

0 commit comments

Comments
 (0)