Skip to content

Commit 6958e01

Browse files
authored
Remove stringbuilder code for when TextDecoder doesn't exist (microsoft#157952)
All of the environments we run in now have `TextDecoder`
1 parent 087921e commit 6958e01

File tree

12 files changed

+34
-103
lines changed

12 files changed

+34
-103
lines changed

src/vs/editor/browser/view/domLineBreaksComputer.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import { WrappingIndent } from 'vs/editor/common/config/editorOptions';
77
import { FontInfo } from 'vs/editor/common/config/fontInfo';
8-
import { createStringBuilder, IStringBuilder } from 'vs/editor/common/core/stringBuilder';
8+
import { StringBuilder } from 'vs/editor/common/core/stringBuilder';
99
import { CharCode } from 'vs/base/common/charCode';
1010
import * as strings from 'vs/base/common/strings';
1111
import { applyFontInfo } from 'vs/editor/browser/config/domFontInfo';
@@ -72,7 +72,7 @@ function createLineBreaks(requests: string[], fontInfo: FontInfo, tabSize: numbe
7272
const containerDomNode = document.createElement('div');
7373
applyFontInfo(containerDomNode, fontInfo);
7474

75-
const sb = createStringBuilder(10000);
75+
const sb = new StringBuilder(10000);
7676
const firstNonWhitespaceIndices: number[] = [];
7777
const wrappedTextIndentLengths: number[] = [];
7878
const renderLineContents: string[] = [];
@@ -182,7 +182,7 @@ const enum Constants {
182182
SPAN_MODULO_LIMIT = 16384
183183
}
184184

185-
function renderLine(lineContent: string, initialVisibleColumn: number, tabSize: number, width: number, sb: IStringBuilder, wrappingIndentLength: number): [number[], number[]] {
185+
function renderLine(lineContent: string, initialVisibleColumn: number, tabSize: number, width: number, sb: StringBuilder, wrappingIndentLength: number): [number[], number[]] {
186186

187187
if (wrappingIndentLength !== 0) {
188188
const hangingOffset = String(wrappingIndentLength);

src/vs/editor/browser/view/viewLayer.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode';
7-
import { IStringBuilder, createStringBuilder } from 'vs/editor/common/core/stringBuilder';
7+
import { StringBuilder } from 'vs/editor/common/core/stringBuilder';
88
import * as viewEvents from 'vs/editor/common/viewEvents';
99
import { ViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData';
1010
import { EditorOption } from 'vs/editor/common/config/editorOptions';
@@ -20,7 +20,7 @@ export interface IVisibleLine extends ILine {
2020
* Return null if the HTML should not be touched.
2121
* Return the new HTML otherwise.
2222
*/
23-
renderLine(lineNumber: number, deltaTop: number, viewportData: ViewportData, sb: IStringBuilder): boolean;
23+
renderLine(lineNumber: number, deltaTop: number, viewportData: ViewportData, sb: StringBuilder): boolean;
2424

2525
/**
2626
* Layout the line.
@@ -547,7 +547,7 @@ class ViewLayerRenderer<T extends IVisibleLine> {
547547
}
548548
}
549549

550-
private static readonly _sb = createStringBuilder(100000);
550+
private static readonly _sb = new StringBuilder(100000);
551551

552552
private _finishRendering(ctx: IRendererContext<T>, domNodeIsEmpty: boolean, deltaTop: number[]): void {
553553

src/vs/editor/browser/view/viewOverlays.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { applyFontInfo } from 'vs/editor/browser/config/domFontInfo';
88
import { DynamicViewOverlay } from 'vs/editor/browser/view/dynamicViewOverlay';
99
import { IVisibleLine, IVisibleLinesHost, VisibleLinesCollection } from 'vs/editor/browser/view/viewLayer';
1010
import { ViewPart } from 'vs/editor/browser/view/viewPart';
11-
import { IStringBuilder } from 'vs/editor/common/core/stringBuilder';
11+
import { StringBuilder } from 'vs/editor/common/core/stringBuilder';
1212
import { IEditorConfiguration } from 'vs/editor/common/config/editorConfiguration';
1313
import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/browser/view/renderingContext';
1414
import { ViewContext } from 'vs/editor/common/viewModel/viewContext';
@@ -175,7 +175,7 @@ export class ViewOverlayLine implements IVisibleLine {
175175
this._lineHeight = this._configuration.options.get(EditorOption.lineHeight);
176176
}
177177

178-
public renderLine(lineNumber: number, deltaTop: number, viewportData: ViewportData, sb: IStringBuilder): boolean {
178+
public renderLine(lineNumber: number, deltaTop: number, viewportData: ViewportData, sb: StringBuilder): boolean {
179179
let result = '';
180180
for (let i = 0, len = this._dynamicOverlays.length; i < len; i++) {
181181
const dynamicOverlay = this._dynamicOverlays[i];

src/vs/editor/browser/viewParts/lines/viewLine.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode';
88
import * as platform from 'vs/base/common/platform';
99
import { IVisibleLine } from 'vs/editor/browser/view/viewLayer';
1010
import { RangeUtil } from 'vs/editor/browser/viewParts/lines/rangeUtil';
11-
import { IStringBuilder } from 'vs/editor/common/core/stringBuilder';
11+
import { StringBuilder } from 'vs/editor/common/core/stringBuilder';
1212
import { IEditorConfiguration } from 'vs/editor/common/config/editorConfiguration';
1313
import { FloatHorizontalRange, VisibleRanges } from 'vs/editor/browser/view/renderingContext';
1414
import { LineDecoration } from 'vs/editor/common/viewLayout/lineDecorations';
@@ -186,7 +186,7 @@ export class ViewLine implements IVisibleLine {
186186
return false;
187187
}
188188

189-
public renderLine(lineNumber: number, deltaTop: number, viewportData: ViewportData, sb: IStringBuilder): boolean {
189+
public renderLine(lineNumber: number, deltaTop: number, viewportData: ViewportData, sb: StringBuilder): boolean {
190190
if (this._isMaybeInvalid === false) {
191191
// it appears that nothing relevant has changed
192192
return false;

src/vs/editor/browser/widget/diffEditorWidget.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import { IDiffEditorOptions, EditorLayoutInfo, EditorOption, EditorOptions, Edit
2424
import { IPosition, Position } from 'vs/editor/common/core/position';
2525
import { IRange, Range } from 'vs/editor/common/core/range';
2626
import { ISelection, Selection } from 'vs/editor/common/core/selection';
27-
import { IStringBuilder, createStringBuilder } from 'vs/editor/common/core/stringBuilder';
27+
import { StringBuilder } from 'vs/editor/common/core/stringBuilder';
2828
import * as editorCommon from 'vs/editor/common/editorCommon';
2929
import { IModelDecorationsChangeAccessor, IModelDeltaDecoration, ITextModel } from 'vs/editor/common/model';
3030
import { ModelDecorationOptions } from 'vs/editor/common/model/textModel';
@@ -2479,7 +2479,7 @@ class InlineViewZonesComputer extends ViewZonesComputer {
24792479
}
24802480
const hasCharChanges = (decorations.length > 0);
24812481

2482-
const sb = createStringBuilder(10000);
2482+
const sb = new StringBuilder(10000);
24832483
let maxCharsPerLine = 0;
24842484
let renderedLineCount = 0;
24852485
let viewLineCounts: number[] | null = null;
@@ -2597,7 +2597,7 @@ class InlineViewZonesComputer extends ViewZonesComputer {
25972597
renderControlCharacters: boolean,
25982598
fontLigatures: string,
25992599
tabSize: number,
2600-
sb: IStringBuilder,
2600+
sb: StringBuilder,
26012601
marginDomNode: HTMLElement
26022602
): number {
26032603

src/vs/editor/common/core/stringBuilder.ts

Lines changed: 2 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,6 @@ import * as strings from 'vs/base/common/strings';
77
import * as platform from 'vs/base/common/platform';
88
import * as buffer from 'vs/base/common/buffer';
99

10-
declare const TextDecoder: {
11-
prototype: TextDecoder;
12-
new(label?: string): TextDecoder;
13-
};
14-
interface TextDecoder {
15-
decode(view: Uint16Array): string;
16-
}
17-
18-
export interface IStringBuilder {
19-
build(): string;
20-
reset(): void;
21-
write1(charCode: number): void;
22-
appendASCII(charCode: number): void;
23-
appendASCIIString(str: string): void;
24-
}
25-
2610
let _utf16LE_TextDecoder: TextDecoder | null;
2711
function getUTF16LE_TextDecoder(): TextDecoder {
2812
if (!_utf16LE_TextDecoder) {
@@ -47,19 +31,7 @@ export function getPlatformTextDecoder(): TextDecoder {
4731
return _platformTextDecoder;
4832
}
4933

50-
export const hasTextDecoder = (typeof TextDecoder !== 'undefined');
51-
export let createStringBuilder: (capacity: number) => IStringBuilder;
52-
export let decodeUTF16LE: (source: Uint8Array, offset: number, len: number) => string;
53-
54-
if (hasTextDecoder) {
55-
createStringBuilder = (capacity) => new StringBuilder(capacity);
56-
decodeUTF16LE = standardDecodeUTF16LE;
57-
} else {
58-
createStringBuilder = (capacity) => new CompatStringBuilder();
59-
decodeUTF16LE = compatDecodeUTF16LE;
60-
}
61-
62-
function standardDecodeUTF16LE(source: Uint8Array, offset: number, len: number): string {
34+
export function decodeUTF16LE(source: Uint8Array, offset: number, len: number): string {
6335
const view = new Uint16Array(source.buffer, offset, len);
6436
if (len > 0 && (view[0] === 0xFEFF || view[0] === 0xFFFE)) {
6537
// UTF16 sometimes starts with a BOM https://de.wikipedia.org/wiki/Byte_Order_Mark
@@ -81,7 +53,7 @@ function compatDecodeUTF16LE(source: Uint8Array, offset: number, len: number): s
8153
return result.join('');
8254
}
8355

84-
class StringBuilder implements IStringBuilder {
56+
export class StringBuilder {
8557

8658
private readonly _capacity: number;
8759
private readonly _buffer: Uint16Array;
@@ -166,35 +138,3 @@ class StringBuilder implements IStringBuilder {
166138
}
167139
}
168140
}
169-
170-
class CompatStringBuilder implements IStringBuilder {
171-
172-
private _pieces: string[];
173-
private _piecesLen: number;
174-
175-
constructor() {
176-
this._pieces = [];
177-
this._piecesLen = 0;
178-
}
179-
180-
public reset(): void {
181-
this._pieces = [];
182-
this._piecesLen = 0;
183-
}
184-
185-
public build(): string {
186-
return this._pieces.join('');
187-
}
188-
189-
public write1(charCode: number): void {
190-
this._pieces[this._piecesLen++] = String.fromCharCode(charCode);
191-
}
192-
193-
public appendASCII(charCode: number): void {
194-
this._pieces[this._piecesLen++] = String.fromCharCode(charCode);
195-
}
196-
197-
public appendASCIIString(str: string): void {
198-
this._pieces[this._piecesLen++] = str;
199-
}
200-
}

src/vs/editor/common/languages/supports/richEditBrackets.ts

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -416,22 +416,13 @@ function createBracketOrRegExp(pieces: string[]): RegExp {
416416
const toReversedString = (function () {
417417

418418
function reverse(str: string): string {
419-
if (stringBuilder.hasTextDecoder) {
420-
// create a Uint16Array and then use a TextDecoder to create a string
421-
const arr = new Uint16Array(str.length);
422-
let offset = 0;
423-
for (let i = str.length - 1; i >= 0; i--) {
424-
arr[offset++] = str.charCodeAt(i);
425-
}
426-
return stringBuilder.getPlatformTextDecoder().decode(arr);
427-
} else {
428-
const result: string[] = [];
429-
let resultLen = 0;
430-
for (let i = str.length - 1; i >= 0; i--) {
431-
result[resultLen++] = str.charAt(i);
432-
}
433-
return result.join('');
419+
// create a Uint16Array and then use a TextDecoder to create a string
420+
const arr = new Uint16Array(str.length);
421+
let offset = 0;
422+
for (let i = str.length - 1; i >= 0; i--) {
423+
arr[offset++] = str.charCodeAt(i);
434424
}
425+
return stringBuilder.getPlatformTextDecoder().decode(arr);
435426
}
436427

437428
let lastInput: string | null = null;

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import { CharCode } from 'vs/base/common/charCode';
77
import * as strings from 'vs/base/common/strings';
88
import { IViewLineTokens } from 'vs/editor/common/tokens/lineTokens';
9-
import { IStringBuilder, createStringBuilder } from 'vs/editor/common/core/stringBuilder';
9+
import { StringBuilder } from 'vs/editor/common/core/stringBuilder';
1010
import { LineDecoration, LineDecorationsNormalizer } from 'vs/editor/common/viewLayout/lineDecorations';
1111
import { InlineDecorationType } from 'vs/editor/common/viewModel';
1212
import { LinePart, LinePartMetadata } from 'vs/editor/common/viewLayout/linePart';
@@ -348,7 +348,7 @@ export class RenderLineOutput {
348348
}
349349
}
350350

351-
export function renderViewLine(input: RenderLineInput, sb: IStringBuilder): RenderLineOutput {
351+
export function renderViewLine(input: RenderLineInput, sb: StringBuilder): RenderLineOutput {
352352
if (input.lineContent.length === 0) {
353353

354354
if (input.lineDecorations.length > 0) {
@@ -410,7 +410,7 @@ export class RenderLineOutput2 {
410410
}
411411

412412
export function renderViewLine2(input: RenderLineInput): RenderLineOutput2 {
413-
const sb = createStringBuilder(10000);
413+
const sb = new StringBuilder(10000);
414414
const out = renderViewLine(input, sb);
415415
return new RenderLineOutput2(out.characterMapping, sb.build(), out.containsRTL, out.containsForeignElements);
416416
}
@@ -904,7 +904,7 @@ function _applyInlineDecorations(lineContent: string, len: number, tokens: LineP
904904
* This function is on purpose not split up into multiple functions to allow runtime type inference (i.e. performance reasons).
905905
* Notice how all the needed data is fully resolved and passed in (i.e. no other calls).
906906
*/
907-
function _renderLine(input: ResolvedRenderLineInput, sb: IStringBuilder): RenderLineOutput {
907+
function _renderLine(input: ResolvedRenderLineInput, sb: StringBuilder): RenderLineOutput {
908908
const fontIsMonospace = input.fontIsMonospace;
909909
const canUseHalfwidthRightwardsArrow = input.canUseHalfwidthRightwardsArrow;
910910
const containsForeignElements = input.containsForeignElements;

src/vs/editor/contrib/inlineCompletions/browser/ghostTextWidget.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { EditorFontLigatures, EditorOption, IComputedEditorOptions } from 'vs/ed
1313
import { LineTokens } from 'vs/editor/common/tokens/lineTokens';
1414
import { Position } from 'vs/editor/common/core/position';
1515
import { Range } from 'vs/editor/common/core/range';
16-
import { createStringBuilder } from 'vs/editor/common/core/stringBuilder';
16+
import { StringBuilder } from 'vs/editor/common/core/stringBuilder';
1717
import { IModelDeltaDecoration, InjectedTextCursorStops, PositionAffinity } from 'vs/editor/common/model';
1818
import { ILanguageIdCodec } from 'vs/editor/common/languages';
1919
import { ILanguageService } from 'vs/editor/common/languages/language';
@@ -356,7 +356,7 @@ function renderLines(domNode: HTMLElement, tabSize: number, lines: LineData[], o
356356
const fontInfo = opts.get(EditorOption.fontInfo);
357357
const lineHeight = opts.get(EditorOption.lineHeight);
358358

359-
const sb = createStringBuilder(10000);
359+
const sb = new StringBuilder(10000);
360360
sb.appendASCIIString('<div class="suggest-preview-text">');
361361

362362
for (let i = 0, len = lines.length; i < len; i++) {

src/vs/editor/contrib/stickyScroll/browser/stickyScrollWidget.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { Disposable, DisposableStore, IDisposable, toDisposable } from 'vs/base/
66
import { IActiveCodeEditor, ICodeEditor, IOverlayWidget, IOverlayWidgetPosition } from 'vs/editor/browser/editorBrowser';
77
import * as dom from 'vs/base/browser/dom';
88
import { EditorLayoutInfo, EditorOption, RenderLineNumbersType } from 'vs/editor/common/config/editorOptions';
9-
import { createStringBuilder } from 'vs/editor/common/core/stringBuilder';
9+
import { StringBuilder } from 'vs/editor/common/core/stringBuilder';
1010
import { RenderLineInput, renderViewLine } from 'vs/editor/common/viewLayout/viewLineRenderer';
1111
import { LineDecoration } from 'vs/editor/common/viewLayout/lineDecorations';
1212
import { Position } from 'vs/editor/common/core/position';
@@ -210,7 +210,7 @@ export class StickyScrollWidget extends Disposable implements IOverlayWidget {
210210
lineRenderingData.tabSize, lineRenderingData.startVisibleColumn,
211211
1, 1, 1, 500, 'none', true, true, null);
212212

213-
const sb = createStringBuilder(2000);
213+
const sb = new StringBuilder(2000);
214214
renderViewLine(renderLineInput, sb);
215215

216216
let newLine;

0 commit comments

Comments
 (0)