Bug 578018 - Regex content assist: fix backslash counting

In addBsProposal(), only omit the backslash if there is an odd number
of backslashes before the insertion point. 'fIsEscape' already contains
this information.

Change-Id: I2dcb86cc52d89652e371446a1734b89801d2ecad
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
Reviewed-on: https://git.eclipse.org/r/c/platform/eclipse.platform.text/+/189224
Tested-by: Platform Bot <platform-bot@eclipse.org>
Reviewed-by: Karsten Thoms <karsten.thoms@karakun.com>
diff --git a/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/FindReplaceDocumentAdapterContentProposalProviderTest.java b/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/FindReplaceDocumentAdapterContentProposalProviderTest.java
new file mode 100644
index 0000000..3046512
--- /dev/null
+++ b/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/FindReplaceDocumentAdapterContentProposalProviderTest.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2022 Thomas Wolf <thomas.wolf@paranor.ch> and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.jface.text.tests;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.Test;
+
+import org.eclipse.jface.fieldassist.IContentProposal;
+
+import org.eclipse.jface.text.FindReplaceDocumentAdapterContentProposalProvider;
+
+public class FindReplaceDocumentAdapterContentProposalProviderTest {
+
+	private FindReplaceDocumentAdapterContentProposalProvider provider= new FindReplaceDocumentAdapterContentProposalProvider(true);
+
+	private void assertProposal(IContentProposal[] proposals, String prefix, String replacement) {
+		IContentProposal match= null;
+		for (IContentProposal p : proposals) {
+			if (p.getLabel().startsWith(prefix)) {
+				match= p;
+				break;
+			}
+		}
+		assertNotNull("No proposal for " + prefix + " found", match);
+		assertEquals("Unexpected replacement", replacement, match.getContent());
+	}
+
+	@Test
+	public void testEmptyTextProposal() {
+		assertProposal(provider.getProposals("", 0), "\\r", "\\r");
+	}
+
+	@Test
+	public void testNonEmptyProposal() {
+		assertProposal(provider.getProposals("text", 3), "\\r", "\\r");
+	}
+
+	@Test
+	public void testBackslashOddProposal() {
+		assertProposal(provider.getProposals("te\\xt", 3), "\\r", "r");
+		assertProposal(provider.getProposals("te\\\\\\xt", 5), "\\r", "r");
+	}
+
+	@Test
+	public void testBackslashEvenProposal() {
+		assertProposal(provider.getProposals("te\\\\xt", 4), "\\r", "\\r");
+		assertProposal(provider.getProposals("te\\\\\\xt", 4), "\\r", "\\r");
+		assertProposal(provider.getProposals("te\\\\\\\\xt", 6), "\\r", "\\r");
+	}
+}
diff --git a/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/JFaceTextTestSuite.java b/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/JFaceTextTestSuite.java
index 011bf02..9668ad7 100644
--- a/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/JFaceTextTestSuite.java
+++ b/org.eclipse.jface.text.tests/src/org/eclipse/jface/text/tests/JFaceTextTestSuite.java
@@ -74,7 +74,8 @@
 
 		TabsToSpacesConverterTest.class,
 		DefaultTextDoubleClickStrategyTest.class,
-		MultiSelectionTest.class
+		MultiSelectionTest.class,
+		FindReplaceDocumentAdapterContentProposalProviderTest.class
 })
 public class JFaceTextTestSuite {
 	// see @SuiteClasses
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/FindReplaceDocumentAdapterContentProposalProvider.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/FindReplaceDocumentAdapterContentProposalProvider.java
index 94cc140..de047a9 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/FindReplaceDocumentAdapterContentProposalProvider.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/FindReplaceDocumentAdapterContentProposalProvider.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008, 2009 IBM Corporation and others.
+ * Copyright (c) 2008, 2022 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -306,18 +306,10 @@
 		 * @param additionalInfo the additional information
 		 */
 		private void addBsProposal(String proposal, String displayString, String additionalInfo) {
-			String prolog= fExpression.substring(0, fDocumentOffset);
-			int position= proposal.length();
-			// If the string already contains the backslash, do not include in the proposal
-			if (prolog.endsWith("\\")) { //$NON-NLS-1$
-				position--;
-				proposal= proposal.substring(1);
-			}
-
 			if (fIsEscape) {
-				fPriorityProposals.add(new ContentProposal(proposal, displayString, additionalInfo, position));
+				fPriorityProposals.add(new ContentProposal(proposal.substring(1), displayString, additionalInfo, proposal.length() - 1));
 			} else {
-				addProposal(proposal, position, displayString, additionalInfo);
+				addProposal(proposal, proposal.length(), displayString, additionalInfo);
 			}
 		}
 	}