Skip to content

Commit 96b9fe6

Browse files
committed
Fixes microsoft#136622: call extractControlCharacters before introducing empty line parts for line decorations
1 parent ee12413 commit 96b9fe6

File tree

2 files changed

+45
-3
lines changed

2 files changed

+45
-3
lines changed

src/vs/editor/common/viewLayout/viewLineRenderer.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,11 @@ function resolveRenderLineInput(input: RenderLineInput): ResolvedRenderLineInput
474474
}
475475

476476
let tokens = transformAndRemoveOverflowing(input.lineTokens, input.fauxIndentLength, len);
477+
if (input.renderControlCharacters && !input.isBasicASCII) {
478+
// Calling `extractControlCharacters` before adding (possibly empty) line parts
479+
// for inline decorations. `extractControlCharacters` removes empty line parts.
480+
tokens = extractControlCharacters(lineContent, tokens);
481+
}
477482
if (input.renderWhitespace === RenderWhitespace.All ||
478483
input.renderWhitespace === RenderWhitespace.Boundary ||
479484
(input.renderWhitespace === RenderWhitespace.Selection && !!input.selectionsOnLine) ||
@@ -500,9 +505,6 @@ function resolveRenderLineInput(input: RenderLineInput): ResolvedRenderLineInput
500505
// We can never split RTL text, as it ruins the rendering
501506
tokens = splitLargeTokens(lineContent, tokens, !input.isBasicASCII || input.fontLigatures);
502507
}
503-
if (input.renderControlCharacters && !input.isBasicASCII) {
504-
tokens = extractControlCharacters(lineContent, tokens);
505-
}
506508

507509
return new ResolvedRenderLineInput(
508510
input.useMonospaceOptimizations,

src/vs/editor/test/common/viewLayout/viewLineRenderer.test.ts

+40
Original file line numberDiff line numberDiff line change
@@ -1722,6 +1722,46 @@ suite('viewLineRenderer.renderLine 2', () => {
17221722
assert.deepStrictEqual(actual.html, expected);
17231723
});
17241724

1725+
test('issue #136622: Inline decorations are not rendering on non-ASCII lines when renderControlCharacters is on', () => {
1726+
1727+
let actual = renderViewLine(new RenderLineInput(
1728+
true,
1729+
true,
1730+
'some text £',
1731+
false,
1732+
false,
1733+
false,
1734+
0,
1735+
createViewLineTokens([createPart(11, 3)]),
1736+
[
1737+
new LineDecoration(5, 5, 'inlineDec1', InlineDecorationType.After),
1738+
new LineDecoration(6, 6, 'inlineDec2', InlineDecorationType.Before),
1739+
],
1740+
4,
1741+
0,
1742+
10,
1743+
10,
1744+
10,
1745+
10000,
1746+
'none',
1747+
true,
1748+
false,
1749+
null
1750+
));
1751+
1752+
let expected = [
1753+
'<span>',
1754+
'<span class="mtk3">some</span>',
1755+
'<span class="mtk3 inlineDec1"></span>',
1756+
'<span class="mtk3">\u00a0</span>',
1757+
'<span class="mtk3 inlineDec2"></span>',
1758+
'<span class="mtk3">text\u00a0£</span>',
1759+
'</span>'
1760+
].join('');
1761+
1762+
assert.deepStrictEqual(actual.html, expected);
1763+
});
1764+
17251765
test('issue #22832: Consider fullwidth characters when rendering tabs', () => {
17261766

17271767
let actual = renderViewLine(new RenderLineInput(

0 commit comments

Comments
 (0)