diff --git a/Codist/Semantics/CSharpParser.cs b/Codist/Semantics/CSharpParser.cs index 9c411a4c..ac1ec3e9 100644 --- a/Codist/Semantics/CSharpParser.cs +++ b/Codist/Semantics/CSharpParser.cs @@ -134,17 +134,17 @@ public TextBufferParser(CSharpParser container, ITextBuffer buffer) { public event EventHandler> StateUpdated; - internal bool IsDisposed => _Parser == null; + public bool IsDisposed => _Parser == null; public ITextBuffer TextBuffer => _Buffer; public void Ref() { _Ref++; - Debug.WriteLine($"Ref+ {_Ref} {_Name}"); + $"Ref+ {_Ref} {_Name}".Log(); } internal void Release() { if (Interlocked.Exchange(ref _Parser, null) != null) { - Debug.WriteLine($"{_Name} tagger released"); + $"{_Name} tagger released".Log(); ReleaseResources(); _Ref = 0; } @@ -274,7 +274,7 @@ void UnsubscribeBufferEvents(ITextBuffer buffer) { } void WorkspaceChanged(object sender, WorkspaceChangeEventArgs args) { - Debug.WriteLine($"Workspace {args.Kind}: {args.DocumentId}"); + $"Workspace {args.Kind}: {args.DocumentId}".Log(); var parser = _Parser; if (parser == null) { return; @@ -308,17 +308,18 @@ void WorkspaceChanged(object sender, WorkspaceChangeEventArgs args) { void TextBuffer_ContentTypeChanged(object sender, ContentTypeChangedEventArgs e) { if (_IsInteractiveWindow == false && e.AfterContentType.IsOfType(Constants.CodeTypes.CSharp) == false) { + $"ContentType changed to {e.AfterContentType.DisplayName}".Log(); Dispose(); } } public void Dispose() { if (--_Ref > 0) { - Debug.WriteLine($"Ref- {_Ref} {_Name}"); + $"Ref- {_Ref} {_Name}".Log(); return; } if (Interlocked.Exchange(ref _Parser, null) != null) { - Debug.WriteLine($"{_Name} tagger disposed"); + $"{_Name} tagger disposed".Log(); ReleaseResources(); } } @@ -402,7 +403,7 @@ async Task ParseAsync(Workspace workspace, Document document, ITextSnapshot snap throw; } if (Interlocked.CompareExchange(ref _State, (int)ParserState.Completed, (int)ParserState.Working) == (int)ParserState.Working) { - Debug.WriteLine($"{snapshot.TextBuffer.GetDocument().GetDocId()} end parsing {snapshot.Version} on thread {Thread.CurrentThread.ManagedThreadId}"); + $"{snapshot.TextBuffer.GetDocument().GetDocId()} end parsing {snapshot.Version} on thread {Thread.CurrentThread.ManagedThreadId}".Log(); _Callback(new SemanticState(workspace, model, snapshot, document)); Interlocked.CompareExchange(ref _State, (int)ParserState.Idle, (int)ParserState.Completed); } diff --git a/Codist/Semantics/ITextBufferParser.cs b/Codist/Semantics/ITextBufferParser.cs index f407c929..991aa57c 100644 --- a/Codist/Semantics/ITextBufferParser.cs +++ b/Codist/Semantics/ITextBufferParser.cs @@ -11,6 +11,7 @@ namespace Codist interface ITextBufferParser : IDisposable { ITextBuffer TextBuffer { get; } + bool IsDisposed { get; } /// /// Gets from given . If the is not the same as the in the , a new parsing will be scheduled. After the parsing, the semantic state can be retrieved via the event. diff --git a/Codist/Taggers/CSharpTagger.cs b/Codist/Taggers/CSharpTagger.cs index 4a6ddde6..9ab04bc8 100644 --- a/Codist/Taggers/CSharpTagger.cs +++ b/Codist/Taggers/CSharpTagger.cs @@ -25,14 +25,18 @@ sealed class CSharpTagger : ITagger, IDisposable ConcurrentQueue _PendingSpans = new ConcurrentQueue(); CancellationTokenSource _RenderBreaker; - + int _Ref; ITextBufferParser _Parser; public CSharpTagger(CSharpParser parser, ITextBuffer buffer) { _Parser = parser.GetParser(buffer); _Parser.StateUpdated += HandleParseResult; + Ref(); } + public bool Disabled { get; set; } + public event EventHandler TagsChanged; + void HandleParseResult(object sender, EventArgs result) { var pendingSpans = _PendingSpans; if (pendingSpans != null) { @@ -48,9 +52,6 @@ void HandleParseResult(object sender, EventArgs result) { } } - public bool Disabled { get; set; } - public event EventHandler TagsChanged; - public IEnumerable> GetTags(NormalizedSnapshotSpanCollection spans) { var p = _Parser; if (p == null || Disabled) { @@ -80,7 +81,14 @@ static IEnumerable MapToOldSpans(NormalizedSnapshotSpanCollection } } + public void Ref() { + ++_Ref; + } + public void Dispose() { + if (_Ref-- > 0) { + return; + } _PendingSpans = null; SyncHelper.CancelAndDispose(ref _RenderBreaker, false); ITextBufferParser t = _Parser; diff --git a/Codist/Taggers/TaggerFactories.cs b/Codist/Taggers/TaggerFactories.cs index 285d77cd..9efd6229 100644 --- a/Codist/Taggers/TaggerFactories.cs +++ b/Codist/Taggers/TaggerFactories.cs @@ -108,6 +108,7 @@ ITagger GetTagger(ITextView textView, ITextBuffer buffer) { return null; } if (_LastView == textView && _LastTextBuffer == buffer) { + _LastTagger.Ref(); return _LastTagger; }