diff options
author | Aaron Bockover <abock@microsoft.com> | 2019-07-03 23:11:20 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-03 23:11:20 +0300 |
commit | f3ad1fdf474bd4941170eda2ecabcb0fbfaad2bb (patch) | |
tree | 39c91b56d08d136286a3e431a940fb26488b37bd /main | |
parent | 412040da5abb7071dbfed4e741f03d54934946ca (diff) | |
parent | a1f85172af0d783ca6c54480904c2a6778f882af (diff) |
Merge pull request #8129 from mono/backport-pr-8073-to-release-8.2
[release-8.2] Fix 935197: Exception in TextFileNavigationPoint.OnDocumentClosing
Diffstat (limited to 'main')
-rw-r--r-- | main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Navigation/TextFileNavigationPoint.cs | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Navigation/TextFileNavigationPoint.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Navigation/TextFileNavigationPoint.cs index a59fbe4ef3..29838a4e3f 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Navigation/TextFileNavigationPoint.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Navigation/TextFileNavigationPoint.cs @@ -48,22 +48,21 @@ namespace MonoDevelop.Ide.Navigation int column; SnapshotPoint? offset; - ITextView textView; public TextFileNavigationPoint (Document doc, ITextView textView) : base (doc) { offset = textView.Caret.Position.BufferPosition; - this.textView = textView; } protected override void OnDocumentClosing () { try { // text source version becomes invalid on document close. - if (textView != null && this.offset.HasValue) { - var translatedOffset = this.offset.Value.TranslateTo (textView.TextSnapshot, PointTrackingMode.Positive); - var snapshotLine = textView.TextSnapshot.GetLineFromPosition (translatedOffset); + if (this.offset is SnapshotPoint point) { + var currentSnapshot = point.Snapshot.TextBuffer.CurrentSnapshot; + var translatedOffset = point.TranslateTo (currentSnapshot, PointTrackingMode.Positive); + var snapshotLine = currentSnapshot.GetLineFromPosition (translatedOffset); line = snapshotLine.LineNumber; column = translatedOffset - snapshotLine.Start.Position; offset = null; @@ -71,7 +70,6 @@ namespace MonoDevelop.Ide.Navigation } catch (Exception e) { LoggingService.LogInternalError (e); } - textView = null; } public TextFileNavigationPoint (FilePath file, int line, int column) @@ -87,14 +85,16 @@ namespace MonoDevelop.Ide.Navigation if (tf == null) return false; var line1 = this.line; - if (this.offset is SnapshotPoint sp1 && sp1.Snapshot.TextBuffer == textView?.TextBuffer) { - var translatedOffset1 = sp1.TranslateTo (textView.TextSnapshot, PointTrackingMode.Positive); - line1 = textView.TextSnapshot.GetLineNumberFromPosition (translatedOffset1); + if (this.offset is SnapshotPoint sp1) { + var currentSnapshot = sp1.Snapshot.TextBuffer.CurrentSnapshot; + var translatedOffset1 = sp1.TranslateTo (currentSnapshot, PointTrackingMode.Positive); + line1 = currentSnapshot.GetLineNumberFromPosition (translatedOffset1); } var line2 = tf.line; - if (tf.offset is SnapshotPoint sp2 && sp2.Snapshot.TextBuffer == textView?.TextBuffer) { - var translatedOffset2 = sp2.TranslateTo (textView.TextSnapshot, PointTrackingMode.Positive); - line2 = textView.TextSnapshot.GetLineNumberFromPosition (translatedOffset2); + if (tf.offset is SnapshotPoint sp2) { + var currentSnapshot = sp2.Snapshot.TextBuffer.CurrentSnapshot; + var translatedOffset2 = sp2.TranslateTo (currentSnapshot, PointTrackingMode.Positive); + line2 = currentSnapshot.GetLineNumberFromPosition (translatedOffset2); } return base.Equals (tf) && Math.Abs (line1 - line2) < 5; } @@ -131,12 +131,13 @@ namespace MonoDevelop.Ide.Navigation var editorOperationsFactoryService = CompositionManager.Instance.GetExportedValue<IEditorOperationsFactoryService> (); var editorOperations = editorOperationsFactoryService.GetEditorOperations (textView); VirtualSnapshotPoint point; - if (textView == this.textView && offset.HasValue) { - var sp = offset.Value.TranslateTo (textView.TextSnapshot, PointTrackingMode.Positive); - point = new VirtualSnapshotPoint (textView.TextSnapshot, sp); + if (offset is SnapshotPoint sp1 && sp1.Snapshot.TextBuffer == textView.TextBuffer) { + var currentSnapshot = textView.TextBuffer.CurrentSnapshot; + var sp = sp1.TranslateTo (currentSnapshot, PointTrackingMode.Positive); + point = new VirtualSnapshotPoint (currentSnapshot, sp); } else { - var snapshotLine = textView.TextSnapshot.GetLineFromLineNumber (this.line); - point = new VirtualSnapshotPoint (textView.TextSnapshot, snapshotLine.Start.Position + column); + var snapshotLine = textView.TextSnapshot.GetLineFromLineNumber (Math.Min (textView.TextSnapshot.LineCount - 1, this.line)); + point = new VirtualSnapshotPoint (textView.TextSnapshot, Math.Min (textView.TextSnapshot.Length - 1, snapshotLine.Start.Position + column)); offset = point.Position; } editorOperations.SelectAndMoveCaret (point, point, TextSelectionMode.Stream, EnsureSpanVisibleOptions.AlwaysCenter); |