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);
                }
            }
        }
Exemple #2
0
        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));
        }
Exemple #3
0
 public LSPDocumentChangeEventArgs(
     LSPDocumentSnapshot old,
     LSPDocumentSnapshot @new,
     VirtualDocumentSnapshot virtualOld,
     VirtualDocumentSnapshot virtualNew,
     LSPDocumentChangeKind kind)
 {
     Old        = old;
     New        = @new;
     VirtualOld = virtualOld;
     VirtualNew = virtualNew;
     Kind       = kind;
 }
Exemple #4
0
        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);
            }
        }
Exemple #5
0
        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);
                    }
                }
            }
        }
Exemple #6
0
 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();
 }