From c15001e11d8a9a4a96f94deaceb70c3bc4259013 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 1 Mar 2018 12:21:58 +0100 Subject: [PATCH] Fixes #22832: Consider fullwidth characters when rendering tabs --- .../common/viewLayout/viewLineRenderer.ts | 8 +++ .../viewLayout/viewLineRenderer.test.ts | 58 +++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/src/vs/editor/common/viewLayout/viewLineRenderer.ts b/src/vs/editor/common/viewLayout/viewLineRenderer.ts index c9994d1baaf..a3c3bef72de 100644 --- a/src/vs/editor/common/viewLayout/viewLineRenderer.ts +++ b/src/vs/editor/common/viewLayout/viewLineRenderer.ts @@ -450,6 +450,8 @@ function _applyRenderWhitespace(lineContent: string, len: number, tokens: LinePa const chCode = lineContent.charCodeAt(charIndex); if (chCode === CharCode.Tab) { tmpIndent = tabSize; + } else if (strings.isFullWidthCharacter(chCode)) { + tmpIndent += 2; } else { tmpIndent++; } @@ -501,6 +503,8 @@ function _applyRenderWhitespace(lineContent: string, len: number, tokens: LinePa if (chCode === CharCode.Tab) { tmpIndent = tabSize; + } else if (strings.isFullWidthCharacter(chCode)) { + tmpIndent += 2; } else { tmpIndent++; } @@ -637,6 +641,7 @@ function _renderLine(input: ResolvedRenderLineInput, sb: IStringBuilder): Render _tabsCharDelta += insertSpacesCount - 1; partContentCnt += insertSpacesCount; } else { + // must be CharCode.Space partContentCnt++; } } @@ -735,6 +740,9 @@ function _renderLine(input: ResolvedRenderLineInput, sb: IStringBuilder): Render break; default: + if (strings.isFullWidthCharacter(charCode)) { + tabsCharDelta++; + } if (renderControlCharacters && charCode < 32) { sb.write1(9216 + charCode); partContentCnt++; diff --git a/src/vs/editor/test/common/viewLayout/viewLineRenderer.test.ts b/src/vs/editor/test/common/viewLayout/viewLineRenderer.test.ts index 7312c7560ac..b0214ecf8d9 100644 --- a/src/vs/editor/test/common/viewLayout/viewLineRenderer.test.ts +++ b/src/vs/editor/test/common/viewLayout/viewLineRenderer.test.ts @@ -1197,6 +1197,64 @@ suite('viewLineRenderer.renderLine 2', () => { assert.deepEqual(actual.html, expected); }); + test('issue #22832: Consider fullwidth characters when rendering tabs', () => { + + let actual = renderViewLine(new RenderLineInput( + true, + 'asd = "擦"\t\t#asd', + false, + 0, + createViewLineTokens([createPart(15, 3)]), + [], + 4, + 10, + 10000, + 'none', + false, + false + )); + + let expected = [ + '', + 'asd\u00a0=\u00a0"擦"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0#asd', + '' + ].join(''); + + assert.deepEqual(actual.html, expected); + }); + + test('issue #22832: Consider fullwidth characters when rendering tabs (render whitespace)', () => { + + let actual = renderViewLine(new RenderLineInput( + true, + 'asd = "擦"\t\t#asd', + false, + 0, + createViewLineTokens([createPart(15, 3)]), + [], + 4, + 10, + 10000, + 'all', + false, + false + )); + + let expected = [ + '', + 'asd', + '\u00b7', + '=', + '\u00b7', + '"擦"', + '\u2192\u00a0\u2192\u00a0\u00a0\u00a0', + '#asd', + '' + ].join(''); + + assert.deepEqual(actual.html, expected); + }); + function createTestGetColumnOfLinePartOffset(lineContent: string, tabSize: number, parts: ViewLineToken[], expectedPartLengths: number[]): (partIndex: number, partLength: number, offset: number, expected: number) => void { let renderLineOutput = renderViewLine(new RenderLineInput( false,