Exemple #1
0
 /// <summary>
 /// Gets the most recently parsed document.
 /// </summary>
 /// <param name="mostRecentDocument">The most recent fully-parsed document for the buffer.</param>
 public void GetMostRecent(out UvssTextParserResult mostRecentDocument)
 {
     lock (syncObject)
     {
         mostRecentDocument = this.mostRecentDocument;
     }
 }
Exemple #2
0
 /// <summary>
 /// Gets the most recently parsed document.
 /// </summary>
 /// <param name="mostRecentDocument">The most recent fully-parsed document for the buffer.</param>
 /// <returns>The task that was used to generate the document.</returns>
 public Task <UvssTextParserResult> GetMostRecent(out UvssTextParserResult mostRecentDocument)
 {
     lock (syncObject)
     {
         mostRecentDocument = this.mostRecentDocument;
         return(taskComplete);
     }
 }
Exemple #3
0
        /// <summary>
        /// Gets a task which produces a UVSS document for the specified text snapshot.
        /// </summary>
        /// <param name="snapshot">The snapshot for which to return a task.</param>
        /// <param name="mostRecentDocument">The most recent fully-parsed document for the buffer.</param>
        /// <returns>The task that was retrieved for the specified snapshot.</returns>
        public Task <UvssTextParserResult> GetParseTask(ITextSnapshot snapshot, out UvssTextParserResult mostRecentDocument)
        {
            lock (syncObject)
            {
                var requestedVersion = snapshot.Version;

                if (versionComplete != null && versionComplete.VersionNumber >= requestedVersion.VersionNumber)
                {
                    mostRecentDocument = this.mostRecentDocument;
                    return(taskComplete);
                }

                if (versionProcessing != null && versionProcessing.VersionNumber >= requestedVersion.VersionNumber)
                {
                    mostRecentDocument = this.mostRecentDocument;
                    return(taskProcessing);
                }

                if (taskQueued != null)
                {
                    mostRecentDocument = this.mostRecentDocument;
                    return(taskQueued);
                }
            }

            var task = default(Task <UvssTextParserResult>);

            task = new Task <UvssTextParserResult>(() =>
            {
                ITextVersion version;
                lock (syncObject)
                {
                    version           = buffer.CurrentSnapshot.Version;
                    versionProcessing = version;
                }

                var currentSnapshot = buffer.CurrentSnapshot;
                var source          = currentSnapshot.GetText();
                var document        = UvssParser.Parse(source);
                var result          = new UvssTextParserResult(currentSnapshot, document);

                lock (syncObject)
                {
                    this.mostRecentDocument = result;

                    versionComplete   = version;
                    versionProcessing = null;

                    taskComplete   = task;
                    taskProcessing = null;

                    if (taskQueued != null)
                    {
                        taskProcessing = taskQueued;
                        taskQueued     = null;
                        taskProcessing.Start();
                    }
                }

                RaiseDocumentParsed(new UvssTextParserEventArgs(result));
                return(result);
            });

            lock (syncObject)
            {
                if (taskProcessing == null)
                {
                    taskProcessing = task;
                    taskProcessing.Start();
                }
                else
                {
                    taskQueued = new Task <UvssTextParserResult>(() =>
                    {
                        Task.Delay(QueuedTaskDelay).Wait();
                        task.Start();
                        return(task.Result);
                    });
                }
            }

            mostRecentDocument = this.mostRecentDocument;
            return(task);
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="UvssTextParserEventArgs"/> class.
 /// </summary>
 /// <param name="result">The result of the parsing operation.</param>
 public UvssTextParserEventArgs(UvssTextParserResult result)
 {
     this.Result = result;
 }