public ProjectionBufferManager(ITextBuffer diskBuffer, IProjectionBufferFactoryService projectionBufferFactoryService, IContentTypeRegistryService contentTypeRegistryService, string secondaryContentTypeName) { DiskBuffer = diskBuffer; _contentTypeRegistryService = contentTypeRegistryService; var snapshot = diskBuffer.CurrentSnapshot; var shaderLabSyntaxTree = SyntaxFactory.ParseUnitySyntaxTree(new Text.VisualStudioSourceText(snapshot, null, true)); var cgBlockVisitor = new CgBlockVisitor(); //cgBlockVisitor.Visit(shaderLabSyntaxTree.Root); var cgBlockSpans = cgBlockVisitor.CgBlockSpans; var dataBufferSpans = new List <object>(); var secondaryContentType = _contentTypeRegistryService.GetContentType(secondaryContentTypeName); var primaryIndex = 0; foreach (var cgBlockSpan in cgBlockSpans) { var primarySpan = Span.FromBounds(primaryIndex, cgBlockSpan.Start); if (!primarySpan.IsEmpty) { dataBufferSpans.Add(snapshot.CreateTrackingSpan(primarySpan, SpanTrackingMode.EdgeExclusive)); } var elisionBuffer = projectionBufferFactoryService.CreateElisionBuffer(null, new NormalizedSnapshotSpanCollection(new SnapshotSpan(snapshot, cgBlockSpan)), ElisionBufferOptions.None, secondaryContentType); dataBufferSpans.Add(elisionBuffer.CurrentSnapshot.CreateTrackingSpan(0, elisionBuffer.CurrentSnapshot.Length, SpanTrackingMode.EdgeInclusive)); primaryIndex = cgBlockSpan.End; } // Last span. { var primarySpan = Span.FromBounds(primaryIndex, snapshot.Length); if (!primarySpan.IsEmpty) { dataBufferSpans.Add(snapshot.CreateTrackingSpan(primarySpan, SpanTrackingMode.EdgeExclusive)); } } ViewBuffer = projectionBufferFactoryService.CreateProjectionBuffer(null, dataBufferSpans, ProjectionBufferOptions.None); DiskBuffer.Properties.AddProperty(typeof(IProjectionBufferManager), this); ViewBuffer.Properties.AddProperty(typeof(IProjectionBufferManager), this); }
public static IElisionBuffer CreateElisionBufferWithoutIndentation( this IProjectionBufferFactoryService factoryService, IEditorOptions editorOptions, IContentType contentType, IEnumerable <SnapshotSpan> exposedSpans) { var spans = new NormalizedSnapshotSpanCollection(exposedSpans); if (spans.Count > 0) { // BUG(6335): We have to make sure that the spans refer to the current snapshot of // the buffer. var buffer = spans.First().Snapshot.TextBuffer; var currentSnapshot = buffer.CurrentSnapshot; spans = new NormalizedSnapshotSpanCollection( spans.Select(s => s.TranslateTo(currentSnapshot, SpanTrackingMode.EdgeExclusive))); } contentType = contentType ?? factoryService.ProjectionContentType; var elisionBuffer = factoryService.CreateElisionBuffer( null, spans, ElisionBufferOptions.None, contentType); if (spans.Count > 0) { var snapshot = spans.First().Snapshot; var buffer = snapshot.TextBuffer; // We need to figure out the shorted indentation level of the exposed lines. We'll // then remove that indentation from all lines. var indentationColumn = DetermineIndentationColumn(editorOptions, spans); var spansToElide = new List <Span>(); foreach (var span in spans) { var startLineNumber = snapshot.GetLineNumberFromPosition(span.Start); var endLineNumber = snapshot.GetLineNumberFromPosition(span.End); for (var lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) { var line = snapshot.GetLineFromLineNumber(lineNumber); var lineOffsetOfColumn = line.GetLineOffsetFromColumn(indentationColumn, editorOptions); spansToElide.Add(Span.FromBounds(line.Start, line.Start + lineOffsetOfColumn)); } } elisionBuffer.ElideSpans(new NormalizedSpanCollection(spansToElide)); } return(elisionBuffer); }
private IElisionBuffer CreateHtmlBuffer(IProjectionBufferFactoryService bufferFactory) { var res = bufferFactory.CreateElisionBuffer( this, new NormalizedSnapshotSpanCollection( new SnapshotSpan( _diskBuffer.CurrentSnapshot, new Span(0, _diskBuffer.CurrentSnapshot.Length) ) ), ElisionBufferOptions.None, _contentType ); res.Properties.AddProperty(typeof(TemplateProjectionBuffer), this); return(res); }
private async Task UpdateBuffersAsync(Document document, CancellationToken cancellationToken) { var shaderLabSyntaxTree = (SyntaxTree)await document.GetSyntaxTreeAsync(cancellationToken); var shaderBlockVisitor = new ShaderBlockVisitor(shaderLabSyntaxTree); shaderBlockVisitor.Visit((SyntaxNode)shaderLabSyntaxTree.Root); var shaderBlockSpans = shaderBlockVisitor.CgBlockSpans; var snapshot = document.SourceText.FindCorrespondingEditorTextSnapshot(); var dataBufferSpans = new List <object>(); var primaryIndex = 0; foreach (var shaderBlockSpan in shaderBlockSpans) { var primarySpan = Span.FromBounds(primaryIndex, shaderBlockSpan.Start); if (!primarySpan.IsEmpty) { dataBufferSpans.Add(snapshot.CreateTrackingSpan( primarySpan, SpanTrackingMode.EdgeExclusive)); } var elisionBuffer = _projectionBufferFactoryService.CreateElisionBuffer( null, new NormalizedSnapshotSpanCollection(new SnapshotSpan(snapshot, shaderBlockSpan)), ElisionBufferOptions.None, _hlslContentType); dataBufferSpans.Add(elisionBuffer.CurrentSnapshot.CreateTrackingSpan( 0, elisionBuffer.CurrentSnapshot.Length, SpanTrackingMode.EdgeInclusive)); primaryIndex = shaderBlockSpan.End; } // Last span. { var primarySpan = Span.FromBounds(primaryIndex, snapshot.Length); if (!primarySpan.IsEmpty) { dataBufferSpans.Add(snapshot.CreateTrackingSpan(primarySpan, SpanTrackingMode.EdgeExclusive)); } } // TODO: Make this a bit more type-safe. var viewBuffer = snapshot.TextBuffer.Properties.GetProperty <IProjectionBuffer>(typeof(IProjectionBuffer)); _foregroundNotificationService.RegisterNotification( () => { viewBuffer.ReplaceSpans( 0, viewBuffer.CurrentSnapshot.SpanCount, dataBufferSpans, EditOptions.None, null); }, _listener.BeginAsyncOperation("ReplaceProjectionBufferSpans"), cancellationToken); }