From 93dc830a4854967be1d2f9ea5d760fc34bb573ea Mon Sep 17 00:00:00 2001
From: Jacek Kopecky <jacek@jacek.cz>
Date: Tue, 12 Dec 2023 21:19:41 +0000
Subject: [PATCH] Handle case with only whitespace before the cut point

---
 src/vs/base/common/strings.ts           | 14 ++++++++------
 src/vs/base/test/common/strings.test.ts |  2 ++
 2 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/src/vs/base/common/strings.ts b/src/vs/base/common/strings.ts
index a8698c9a2d892..2373ddc3ebbc8 100644
--- a/src/vs/base/common/strings.ts
+++ b/src/vs/base/common/strings.ts
@@ -713,14 +713,16 @@ export function isEmojiImprecise(x: number): boolean {
  * The return value can be longer than the given value of `n`. Leading whitespace is always trimmed.
  */
 export function lcut(text: string, n: number, prefix = '') {
-	if (text.length < n) {
-		return text.trimStart();
+	const trimmed = text.trimStart();
+
+	if (trimmed.length < n) {
+		return trimmed;
 	}
 
 	const re = /\b/g;
 	let i = 0;
-	while (re.test(text)) {
-		if (text.length - re.lastIndex < n) {
+	while (re.test(trimmed)) {
+		if (trimmed.length - re.lastIndex < n) {
 			break;
 		}
 
@@ -729,10 +731,10 @@ export function lcut(text: string, n: number, prefix = '') {
 	}
 
 	if (i === 0) {
-		return text.trimStart();
+		return trimmed;
 	}
 
-	return prefix + text.substring(i).trimStart();
+	return prefix + trimmed.substring(i).trimStart();
 }
 
 // Escape codes, compiled from https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Functions-using-CSI-_-ordered-by-the-final-character_s_
diff --git a/src/vs/base/test/common/strings.test.ts b/src/vs/base/test/common/strings.test.ts
index 0d090da51e929..b7a8f85e95397 100644
--- a/src/vs/base/test/common/strings.test.ts
+++ b/src/vs/base/test/common/strings.test.ts
@@ -144,12 +144,14 @@ suite('Strings', () => {
 		assert.strictEqual(strings.lcut('a', 10), 'a');
 		assert.strictEqual(strings.lcut(' a', 10), 'a');
 		assert.strictEqual(strings.lcut('            a', 10), 'a');
+		assert.strictEqual(strings.lcut(' bbbb       a', 10), 'bbbb       a');
 		assert.strictEqual(strings.lcut('............a', 10), '............a');
 
 		assert.strictEqual(strings.lcut('', 10, '…'), '');
 		assert.strictEqual(strings.lcut('a', 10, '…'), 'a');
 		assert.strictEqual(strings.lcut(' a', 10, '…'), 'a');
 		assert.strictEqual(strings.lcut('            a', 10, '…'), 'a');
+		assert.strictEqual(strings.lcut(' bbbb       a', 10, '…'), 'bbbb       a');
 		assert.strictEqual(strings.lcut('............a', 10, '…'), '............a');
 	});