Bug 567321 - "Go to last edit location" doesn't work after closing
editors

Don't browse backwards in history on closing or changing editor input.

Change-Id: I14353a7b494bddd84ef5177b8801f208d27a1fd1
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
Reviewed-on: https://git.eclipse.org/r/c/platform/eclipse.platform.text/+/183341
Tested-by: Platform Bot <platform-bot@eclipse.org>
diff --git a/org.eclipse.ui.workbench.texteditor/META-INF/MANIFEST.MF b/org.eclipse.ui.workbench.texteditor/META-INF/MANIFEST.MF
index 5d2171a..a2c871e 100644
--- a/org.eclipse.ui.workbench.texteditor/META-INF/MANIFEST.MF
+++ b/org.eclipse.ui.workbench.texteditor/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.ui.workbench.texteditor; singleton:=true
-Bundle-Version: 3.16.100.qualifier
+Bundle-Version: 3.16.200.qualifier
 Bundle-Activator: org.eclipse.ui.internal.texteditor.TextEditorPlugin
 Bundle-ActivationPolicy: lazy
 Bundle-Vendor: %providerName
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/EditPosition.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/EditPosition.java
index c59ffc8..012ee48 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/EditPosition.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/EditPosition.java
@@ -71,6 +71,28 @@
 		return fEditorId;
 	}
 
+	@Override
+	public String toString() {
+		StringBuilder builder = new StringBuilder();
+		builder.append("EditPosition ["); //$NON-NLS-1$
+		if (fEditorInput != null) {
+			builder.append("input="); //$NON-NLS-1$
+			builder.append(fEditorInput);
+			builder.append(", "); //$NON-NLS-1$
+		}
+		if (fEditorId != null) {
+			builder.append("editorId="); //$NON-NLS-1$
+			builder.append(fEditorId);
+			builder.append(", "); //$NON-NLS-1$
+		}
+		if (fPosition != null) {
+			builder.append("position="); //$NON-NLS-1$
+			builder.append(fPosition);
+		}
+		builder.append("]"); //$NON-NLS-1$
+		return builder.toString();
+	}
+
 	/**
 	 * Returns the position.
 	 *
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/HistoryTracker.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/HistoryTracker.java
index 422a2a6..8488a31 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/HistoryTracker.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/texteditor/HistoryTracker.java
@@ -15,6 +15,9 @@
 package org.eclipse.ui.internal.texteditor;
 
 import java.lang.reflect.Array;
+import java.util.Arrays;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * @author Ari Kast
@@ -348,6 +351,33 @@
 	}
 
 	/**
+	 * @return Stream with all non-null history elements, may be empty
+	 */
+	public Stream<T> rawHistory() {
+		return Arrays.asList(fHistory).stream().filter(x -> x != null);
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder builder = new StringBuilder();
+		builder.append("HistoryTracker ["); //$NON-NLS-1$
+		builder.append("history="); //$NON-NLS-1$
+		builder.append(rawHistory().map(x -> x.toString()).collect(Collectors.joining(", "))); //$NON-NLS-1$
+		builder.append(", "); //$NON-NLS-1$
+		if (fBrowsePoint != null) {
+			builder.append("browsePoint="); //$NON-NLS-1$
+			builder.append(fBrowsePoint);
+			builder.append(", "); //$NON-NLS-1$
+		}
+		builder.append("size="); //$NON-NLS-1$
+		builder.append(fSize);
+		builder.append(", circular="); //$NON-NLS-1$
+		builder.append(fUseCircularNavigation);
+		builder.append("]"); //$NON-NLS-1$
+		return builder.toString();
+	}
+
+	/**
 	 * for easy traversing thru history
 	 */
 	public static class Navigator<T> {
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AbstractTextEditor.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AbstractTextEditor.java
index 840af78..cda1fcf 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AbstractTextEditor.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AbstractTextEditor.java
@@ -33,6 +33,7 @@
 import java.util.Map;
 import java.util.ResourceBundle;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Stream;
 
 import org.osgi.framework.Bundle;
 
@@ -682,25 +683,25 @@
 
 		@Override
 		public void inputDocumentAboutToBeChanged(IDocument oldInput, IDocument newInput) {
-			HistoryTracker<EditPosition> positionHistory = TextEditorPlugin.getDefault().getEditPositionHistory();
-			if (oldInput != null && !positionHistory.isEmpty()) {
-				for (int i = 0; i < positionHistory.getSize(); i++)
-					oldInput.removePosition(positionHistory.browseBackward().getPosition());
-			}
+			discardHistoryFor(oldInput, newInput);
 		}
 
 		@Override
 		public void inputDocumentChanged(IDocument oldInput, IDocument newInput) {
-			discardHistoryFor(oldInput);
+			discardHistoryFor(oldInput, newInput);
 		}
 
-		private void discardHistoryFor(IDocument input) {
-			HistoryTracker<EditPosition> positionHistory = TextEditorPlugin.getDefault().getEditPositionHistory();
-			if (input != null && !positionHistory.isEmpty()) {
-				for (int i = 0; i < positionHistory.getSize(); i++)
-					input.removePosition(positionHistory.browseBackward().getPosition());
+		private void discardHistoryFor(IDocument oldInput, IDocument newInput) {
+			// Only discard history from document if it is replaced by other real document,
+			// don't care otherwise
+			if (oldInput == null || newInput == null) {
+				return;
 			}
-
+			HistoryTracker<EditPosition> positionHistory = TextEditorPlugin.getDefault().getEditPositionHistory();
+			if (!positionHistory.isEmpty()) {
+				Stream<EditPosition> rawHistory = positionHistory.rawHistory();
+				rawHistory.forEach(p -> oldInput.removePosition(p.getPosition()));
+			}
 		}
 	}