Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorAaron Bockover <abock@microsoft.com>2019-07-03 23:11:20 +0300
committerGitHub <noreply@github.com>2019-07-03 23:11:20 +0300
commitf3ad1fdf474bd4941170eda2ecabcb0fbfaad2bb (patch)
tree39c91b56d08d136286a3e431a940fb26488b37bd /main
parent412040da5abb7071dbfed4e741f03d54934946ca (diff)
parenta1f85172af0d783ca6c54480904c2a6778f882af (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.cs35
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);