public bool Update(DocumentParseCompleteEventArgs e) { int versionNumber = (e.SourceChange.NewBuffer as IShimTextBuffer).Snapshot.Version.VersionNumber; if (versionNumber >= _lastVersion) { _lastVersion = versionNumber; _parseCompleteEventArg = e; } if (e.TreeStructureChanged) { TreeStructureChanged = true; } else if (!TreeStructureChanged) { TextChange sourceChange = e.SourceChange; if (sourceChange.NewLength > 1) { if ((sourceChange.NewBuffer as IShimTextBuffer).Snapshot.GetText(sourceChange.NewPosition, sourceChange.NewLength).Any(c => char.IsWhiteSpace(c))) { TreeStructureChanged = true; } } } bool expr_BE = !NotificationPending; if (expr_BE) { NotificationPending = true; } return expr_BE; }
private void OnDocumentParseComplete(DocumentParseCompleteEventArgs args) { using (_parser.SynchronizeMainThreadState()) { _currentParseTree = args.GeneratorResults.Document; _lastChangeOwner = null; } Debug.Assert(args != null, "Event arguments cannot be null"); EventHandler <DocumentParseCompleteEventArgs> handler = DocumentParseComplete; if (handler != null) { try { handler(this, args); } catch (Exception ex) { Debug.WriteLine( "[RzEd] Document Parse Complete Handler Threw: " + ex.ToString() ); } } }
public ParseData() { TreeStructureChanged = true; _parseCompleteEventArg = null; NotificationPending = false; _lastVersion = -1; }
protected virtual void OnResultsReady(DocumentParseCompleteEventArgs args) { var handler = ResultsReady; if (handler != null) { handler(this, args); } }
public void OnDocumentParseComplete(object sender, DocumentParseCompleteEventArgs args) { EventHandler<DocumentParseCompleteEventArgs> documentParseComplete = DocumentParseComplete; if (documentParseComplete != null) { documentParseComplete(this, args); } }
private void OnDocumentParseComplete(DocumentParseCompleteEventArgs args) { Debug.Assert(args != null, "Event arguments cannot be null"); EventHandler <DocumentParseCompleteEventArgs> handler = DocumentParseComplete; if (handler != null) { handler(this, args); } #if DEBUG RazorDebugHelpers.WriteDebugTree(FileName, args.GeneratorResults.Document, PartialParseResult.Rejected, args.SourceChange, this, args.TreeStructureChanged); RazorDebugHelpers.WriteGeneratedCode(FileName, args.GeneratorResults.GeneratedCode); #endif }
private void DocumentParseComplete(object sender, DocumentParseCompleteEventArgs e) { if (_parseData == null) { return; } ParseData parseData = _parseData; bool flag2; lock (parseData) { flag2 = _parseData.Update(e); } if (flag2) { WebEditor.DispatchOnUIThread(delegate { DocumentParseCompleteMainThread(); }); } }
void CreateParserFor (string fileName) { editorParser = new MonoDevelop.Web.Razor.EditorParserFixed.RazorEditorParser (CreateRazorHost (fileName), fileName); parseComplete = new AutoResetEvent (false); editorParser.DocumentParseComplete += (sender, args) => { capturedArgs = args; parseComplete.Set (); }; lastParsedFile = fileName; }
// **** BACKGROUND THREAD **** private void WorkerLoop() { long? elapsedMs = null; string fileNameOnly = Path.GetFileName(_fileName); #if EDITOR_TRACING Stopwatch sw = new Stopwatch(); #endif try { RazorEditorTrace.TraceLine(RazorResources.Trace_BackgroundThreadStart, fileNameOnly); EnsureOnThread(); while (!_shutdownToken.IsCancellationRequested) { // Grab the parcel of work to do WorkParcel parcel = _main.GetParcel(); if (parcel.Changes.Any()) { RazorEditorTrace.TraceLine(RazorResources.Trace_ChangesArrived, fileNameOnly, parcel.Changes.Count); try { DocumentParseCompleteEventArgs args = null; using (var linkedCancel = CancellationTokenSource.CreateLinkedTokenSource(_shutdownToken, parcel.CancelToken)) { if (parcel != null && !linkedCancel.IsCancellationRequested) { // Collect ALL changes #if EDITOR_TRACING if (_previouslyDiscarded != null && _previouslyDiscarded.Any()) { RazorEditorTrace.TraceLine(RazorResources.Trace_CollectedDiscardedChanges, fileNameOnly, _previouslyDiscarded.Count); } #endif var allChanges = Enumerable.Concat( _previouslyDiscarded ?? Enumerable.Empty<TextChange>(), parcel.Changes).ToList(); var finalChange = allChanges.LastOrDefault(); if (finalChange != default (TextChange)) { #if EDITOR_TRACING sw.Start(); #endif GeneratorResults results = ParseChange(finalChange.NewBuffer, linkedCancel.Token); #if EDITOR_TRACING sw.Stop(); elapsedMs = sw.ElapsedMilliseconds; sw.Reset(); #endif RazorEditorTrace.TraceLine( RazorResources.Trace_ParseComplete, fileNameOnly, elapsedMs.HasValue ? elapsedMs.Value.ToString() : "?"); if (results != null && !linkedCancel.IsCancellationRequested) { // Clear discarded changes list _previouslyDiscarded = null; // Take the current tree and check for differences #if EDITOR_TRACING sw.Start(); #endif bool treeStructureChanged = _currentParseTree == null || TreesAreDifferent(_currentParseTree, results.Document, allChanges, parcel.CancelToken); #if EDITOR_TRACING sw.Stop(); elapsedMs = sw.ElapsedMilliseconds; sw.Reset(); #endif _currentParseTree = results.Document; RazorEditorTrace.TraceLine(RazorResources.Trace_TreesCompared, fileNameOnly, elapsedMs.HasValue ? elapsedMs.Value.ToString() : "?", treeStructureChanged); // Build Arguments args = new DocumentParseCompleteEventArgs() { GeneratorResults = results, SourceChange = finalChange, TreeStructureChanged = treeStructureChanged }; } else { // Parse completed but we were cancelled in the mean time. Add these to the discarded changes set RazorEditorTrace.TraceLine(RazorResources.Trace_ChangesDiscarded, fileNameOnly, allChanges.Count); _previouslyDiscarded = allChanges; } #if CHECK_TREE if (args != null) { // Rewind the buffer and sanity check the line mappings finalChange.NewBuffer.Position = 0; int lineCount = finalChange.NewBuffer.ReadToEnd().Split(new string[] { Environment.NewLine, "\r", "\n" }, StringSplitOptions.None).Count(); Debug.Assert( !args.GeneratorResults.DesignTimeLineMappings.Any(pair => pair.Value.StartLine > lineCount), "Found a design-time line mapping referring to a line outside the source file!"); Debug.Assert( !args.GeneratorResults.Document.Flatten().Any(span => span.Start.LineIndex > lineCount), "Found a span with a line number outside the source file"); Debug.Assert( !args.GeneratorResults.Document.Flatten().Any(span => span.Start.AbsoluteIndex > parcel.NewBuffer.Length), "Found a span with an absolute offset outside the source file"); } #endif } } } if (args != null) { _main.ReturnParcel(args); } } catch (OperationCanceledException) { } } else { RazorEditorTrace.TraceLine(RazorResources.Trace_NoChangesArrived, fileNameOnly, parcel.Changes.Count); Thread.Yield(); } } } catch (OperationCanceledException) { // Do nothing. Just shut down. } catch (Exception ex) { MonoDevelop.Core.LoggingService.LogError ("Internal error in Razor parser", ex); MonoDevelop.Core.LogReporting.LogReportingService.ReportUnhandledException (ex, false); } finally { RazorEditorTrace.TraceLine(RazorResources.Trace_BackgroundThreadShutdown, fileNameOnly); // Clean up main thread resources _main.Dispose(); } }
public void ReturnParcel(DocumentParseCompleteEventArgs args) { lock (_stateLock) { // Clear the current parcel cancellation source if (_currentParcelCancelSource != null) { _currentParcelCancelSource.Dispose(); _currentParcelCancelSource = null; } // If there are things waiting to be parsed, just don't fire the event because we're already out of date if (_changes.Any()) { return; } } var handler = ResultsReady; if (handler != null) { handler(this, args); } }
private void OnDocumentParseComplete(DocumentParseCompleteEventArgs args) { using (_parser.SynchronizeMainThreadState()) { _currentParseTree = args.GeneratorResults.Document; _lastChangeOwner = null; } Debug.Assert(args != null, "Event arguments cannot be null"); EventHandler<DocumentParseCompleteEventArgs> handler = DocumentParseComplete; if (handler != null) { try { handler(this, args); } catch (Exception ex) { Debug.WriteLine("[RzEd] Document Parse Complete Handler Threw: " + ex.ToString()); } } }
private void OnDocumentParseComplete(DocumentParseCompleteEventArgs args) { Debug.Assert(args != null, "Event arguments cannot be null"); EventHandler<DocumentParseCompleteEventArgs> handler = DocumentParseComplete; if (handler != null) { handler(this, args); } #if DEBUG RazorDebugHelpers.WriteDebugTree(FileName, args.GeneratorResults.Document, PartialParseResult.Rejected, args.SourceChange, this, args.TreeStructureChanged); RazorDebugHelpers.WriteGeneratedCode(FileName, args.GeneratorResults.GeneratedCode); #endif }