private void NotifyDocumentManagerChangeListeners( LSPDocumentSnapshot old, LSPDocumentSnapshot @new, VirtualDocumentSnapshot virtualOld, VirtualDocumentSnapshot virtualNew, LSPDocumentChangeKind kind) { foreach (var listener in _documentManagerChangeListeners) { var notifyListener = false; if (old != null && listener.Metadata.ContentTypes.Any(ct => old.Snapshot.ContentType.IsOfType(ct))) { notifyListener = true; } else if (@new != null && listener.Metadata.ContentTypes.Any(ct => @new.Snapshot.ContentType.IsOfType(ct))) { notifyListener = true; } if (notifyListener) { listener.Value.Changed(old, @new, virtualOld, virtualNew, kind); } } }
private DefaultLSPDocumentSnapshot UpdateSnapshot() { var virtualDocumentSnapshots = new VirtualDocumentSnapshot[VirtualDocuments.Count]; for (var i = 0; i < VirtualDocuments.Count; i++) { virtualDocumentSnapshots[i] = VirtualDocuments[i].CurrentSnapshot; } return(new DefaultLSPDocumentSnapshot(Uri, TextBuffer.CurrentSnapshot, virtualDocumentSnapshots, Version)); }
public LSPDocumentChangeEventArgs( LSPDocumentSnapshot old, LSPDocumentSnapshot @new, VirtualDocumentSnapshot virtualOld, VirtualDocumentSnapshot virtualNew, LSPDocumentChangeKind kind) { Old = old; New = @new; VirtualOld = virtualOld; VirtualNew = virtualNew; Kind = kind; }
public override Task <bool> TrySynchronizeVirtualDocumentAsync(int requiredHostDocumentVersion, VirtualDocumentSnapshot virtualDocument, CancellationToken cancellationToken) { if (virtualDocument is null) { throw new ArgumentNullException(nameof(virtualDocument)); } lock (DocumentContextLock) { if (!_virtualDocumentContexts.TryGetValue(virtualDocument.Uri, out var documentContext)) { throw new InvalidOperationException("Document context should never be null here."); } if (requiredHostDocumentVersion == documentContext.SeenHostDocumentVersion) { // Already synchronized return(Task.FromResult(true)); } // Currently tracked synchronizing context is not sufficient, need to update a new one. var onSynchronizedTask = documentContext.GetSynchronizationTaskAsync(requiredHostDocumentVersion, cancellationToken); return(onSynchronizedTask); } }
public override void Changed(LSPDocumentSnapshot old, LSPDocumentSnapshot @new, VirtualDocumentSnapshot virtualOld, VirtualDocumentSnapshot virtualNew, LSPDocumentChangeKind kind) { lock (_documentContextLock) { if (kind == LSPDocumentChangeKind.Added) { var lspDocument = @new; for (var i = 0; i < lspDocument.VirtualDocuments.Count; i++) { var virtualDocument = lspDocument.VirtualDocuments[i]; Debug.Assert(!_virtualDocumentContexts.ContainsKey(virtualDocument.Uri)); var virtualDocumentTextBuffer = virtualDocument.Snapshot.TextBuffer; virtualDocumentTextBuffer.PostChanged += VirtualDocumentBuffer_PostChanged; _virtualDocumentContexts[virtualDocument.Uri] = new DocumentContext(_synchronizationTimeout); } } else if (kind == LSPDocumentChangeKind.Removed) { var lspDocument = old; for (var i = 0; i < lspDocument.VirtualDocuments.Count; i++) { var virtualDocument = lspDocument.VirtualDocuments[i]; if (!_virtualDocumentContexts.TryGetValue(virtualDocument.Uri, out var virtualDocumentContext)) { Debug.Fail("Could not locate virtual document context, it should have been added."); continue; } var virtualDocumentTextBuffer = virtualDocument.Snapshot.TextBuffer; virtualDocumentTextBuffer.PostChanged -= VirtualDocumentBuffer_PostChanged; virtualDocumentContext.Dispose(); _virtualDocumentContexts.Remove(virtualDocument.Uri); } } else if (kind == LSPDocumentChangeKind.VirtualDocumentChanged) { if (virtualOld.Snapshot.Version == virtualNew.Snapshot.Version) { // UpdateDocumentContextVersionInternal is typically invoked through a buffer notification, // however in the case where VirtualDocumentBase.Update is called with a zero change edit, // there won't be such an edit to hook into. Instead, we'll detect that case here and // update the document context version appropriately. UpdateDocumentContextVersionInternal(virtualNew.Snapshot.TextBuffer); } } } }
public abstract Task <bool> TrySynchronizeVirtualDocumentAsync(int requiredHostDocumentVersion, VirtualDocumentSnapshot virtualDocument, CancellationToken cancellationToken);
public virtual Task <bool> TrySynchronizeVirtualDocumentAsync(int requiredHostDocumentVersion, VirtualDocumentSnapshot virtualDocument, bool rejectOnNewerParallelRequest, CancellationToken cancellationToken) { throw new NotImplementedException(); }