Beispiel #1
0
        private void OnDocumentChangeProcessingComplete(IDocument doc, VersionCookie vc, bool enqueueForAnalysis, AnalysisPriority priority, IDisposable disposeWhenEnqueued)
        {
            try {
                if (vc != null)
                {
                    foreach (var kv in vc.GetAllParts(doc.DocumentUri))
                    {
                        ParseComplete(kv.Key, kv.Value.Version);
                    }
                }
                else
                {
                    ParseComplete(doc.DocumentUri, 0);
                }

                if (doc is IAnalyzable analyzable && enqueueForAnalysis)
                {
                    TraceMessage($"Enqueing document {doc.DocumentUri} for analysis");
                    _queue.Enqueue(analyzable, priority);
                }

                disposeWhenEnqueued?.Dispose();
                disposeWhenEnqueued = null;
                var openedFile = _openFiles.GetDocument(doc.DocumentUri);
                if (vc != null)
                {
                    var reported = openedFile.LastReportedDiagnostics;
                    lock (reported) {
                        foreach (var kv in vc.GetAllParts(doc.DocumentUri))
                        {
                            var part = _projectFiles.GetPart(kv.Key);
                            if (!reported.TryGetValue(part, out var lastVersion) || lastVersion.Version < kv.Value.Version)
                            {
                                reported[part] = kv.Value;
                                PublishDiagnostics(new PublishDiagnosticsEventArgs {
                                    uri         = kv.Key,
                                    diagnostics = kv.Value.Diagnostics,
                                    _version    = kv.Value.Version
                                });
                            }
                        }
                    }
                }
            } catch (BadSourceException) {
            } catch (OperationCanceledException ex) {
                LogMessage(MessageType.Warning, $"Parsing {doc.DocumentUri} cancelled");
                TraceMessage($"{ex}");
            } catch (Exception ex) {
                LogMessage(MessageType.Error, ex.ToString());
            } finally {
                disposeWhenEnqueued?.Dispose();
            }
        }
        public void UpdateParseDiagnostics(VersionCookie vc, Uri documentUri)
        {
            List <PublishDiagnosticsEventArgs> diags = null;

            lock (_lock) {
                var last = _parseBufferDiagnostics;

                foreach (var kv in vc.GetAllParts(documentUri))
                {
                    var part = _server.ProjectFiles.GetPart(kv.Key);
                    if (!last.TryGetValue(part, out var lastVersion) || lastVersion.Version < kv.Value.Version || _ignoreDiagnosticsVersion)
                    {
                        last[part] = kv.Value;
                        diags      = diags ?? new List <PublishDiagnosticsEventArgs>();
                        diags.Add(new PublishDiagnosticsEventArgs {
                            uri         = kv.Key,
                            diagnostics = kv.Value.Diagnostics,
                            _version    = kv.Value.Version
                        });
                    }
                }
                _ignoreDiagnosticsVersion     = false;
                _lastReportedParseDiagnostics = diags ?? _lastReportedParseDiagnostics;

                if (diags != null)
                {
                    PublishDiagnostics(diags);
                }
            }
        }
Beispiel #3
0
        private void OnDocumentChangeProcessingComplete(IDocument doc, VersionCookie vc, bool enqueueForAnalysis, AnalysisPriority priority, IDisposable disposeWhenEnqueued)
        {
            ThrowIfDisposed();
            try {
                if (vc != null)
                {
                    foreach (var kv in vc.GetAllParts(doc.DocumentUri))
                    {
                        ParseComplete(kv.Key, kv.Value.Version);
                    }
                }
                else
                {
                    ParseComplete(doc.DocumentUri, 0);
                }

                if (doc is IAnalyzable analyzable && enqueueForAnalysis)
                {
                    TraceMessage($"Enqueing document {doc.DocumentUri} for analysis");
                    _queue.Enqueue(analyzable, priority);
                }

                disposeWhenEnqueued?.Dispose();
                disposeWhenEnqueued = null;
                if (vc != null)
                {
                    _editorFiles.GetDocument(doc.DocumentUri).UpdateParseDiagnostics(vc, doc.DocumentUri);
                }
            } catch (BadSourceException) {
            } catch (OperationCanceledException ex) {
                LogMessage(MessageType.Warning, $"Parsing {doc.DocumentUri} cancelled");
                TraceMessage($"{ex}");
            } catch (Exception ex) {
                LogMessage(MessageType.Error, ex.ToString());
            } finally {
                disposeWhenEnqueued?.Dispose();
            }
        }