/// <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; } }
/// <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); } }
/// <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; }