Skip to content

Commit dabbf52

Browse files
committed
Adopt CharacterClassifier in CharacterHardWrappingLineMapping
1 parent 841ef45 commit dabbf52

2 files changed

Lines changed: 16 additions & 48 deletions

File tree

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -209,9 +209,8 @@ function renderLineActual(lineText: string, lineTextLength: number, tabSize: num
209209
break;
210210

211211
default:
212-
let characterCode = lineText.charCodeAt(charIndex);
213-
if (renderControlCharacters && isControlCharacter(characterCode)) {
214-
out += controlCharacterToPrintable(characterCode);
212+
if (renderControlCharacters && isControlCharacter(charCode)) {
213+
out += controlCharacterToPrintable(charCode);
215214
} else {
216215
out += lineText.charAt(charIndex);
217216
}

src/vs/editor/common/viewModel/characterHardWrappingLineMapper.ts

Lines changed: 14 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -8,66 +8,35 @@ import * as strings from 'vs/base/common/strings';
88
import {WrappingIndent} from 'vs/editor/common/editorCommon';
99
import {PrefixSumComputer} from 'vs/editor/common/viewModel/prefixSumComputer';
1010
import {ILineMapperFactory, ILineMapping, OutputPosition} from 'vs/editor/common/viewModel/splitLinesCollection';
11+
import {CharacterClassifier} from 'vs/editor/common/core/characterClassifier';
1112

12-
enum CharacterClass {
13+
const enum CharacterClass {
1314
NONE = 0,
1415
BREAK_BEFORE = 1,
1516
BREAK_AFTER = 2,
1617
BREAK_OBTRUSIVE = 3,
1718
BREAK_IDEOGRAPHIC = 4 // for Han and Kana.
1819
}
1920

20-
class CharacterClassifier {
21-
22-
/**
23-
* Maintain a compact (fully initialized ASCII map for quickly classifying ASCII characters - used more often in code).
24-
*/
25-
private _asciiMap: CharacterClass[];
26-
27-
/**
28-
* The entire map (sparse array).
29-
*/
30-
private _map: CharacterClass[];
21+
class WrappingCharacterClassifier extends CharacterClassifier<CharacterClass> {
3122

3223
constructor(BREAK_BEFORE:string, BREAK_AFTER:string, BREAK_OBTRUSIVE:string) {
33-
34-
this._asciiMap = [];
35-
for (let i = 0; i < 256; i++) {
36-
this._asciiMap[i] = CharacterClass.NONE;
37-
}
38-
39-
this._map = [];
24+
super(CharacterClass.NONE);
4025

4126
for (let i = 0; i < BREAK_BEFORE.length; i++) {
42-
this._set(BREAK_BEFORE.charCodeAt(i), CharacterClass.BREAK_BEFORE);
27+
this.set(BREAK_BEFORE.charCodeAt(i), CharacterClass.BREAK_BEFORE);
4328
}
4429

4530
for (let i = 0; i < BREAK_AFTER.length; i++) {
46-
this._set(BREAK_AFTER.charCodeAt(i), CharacterClass.BREAK_AFTER);
31+
this.set(BREAK_AFTER.charCodeAt(i), CharacterClass.BREAK_AFTER);
4732
}
4833

4934
for (let i = 0; i < BREAK_OBTRUSIVE.length; i++) {
50-
this._set(BREAK_OBTRUSIVE.charCodeAt(i), CharacterClass.BREAK_OBTRUSIVE);
51-
}
52-
}
53-
54-
private _set(charCode:number, charClass:CharacterClass): void {
55-
if (charCode < 256) {
56-
this._asciiMap[charCode] = charClass;
35+
this.set(BREAK_OBTRUSIVE.charCodeAt(i), CharacterClass.BREAK_OBTRUSIVE);
5736
}
58-
this._map[charCode] = charClass;
5937
}
6038

61-
public classify(charCode:number): CharacterClass {
62-
if (charCode < 256) {
63-
return this._asciiMap[charCode];
64-
}
65-
66-
let charClass = this._map[charCode];
67-
if (charClass) {
68-
return charClass;
69-
}
70-
39+
public get(charCode:number): CharacterClass {
7140
// Initialize CharacterClass.BREAK_IDEOGRAPHIC for these Unicode ranges:
7241
// 1. CJK Unified Ideographs (0x4E00 -- 0x9FFF)
7342
// 2. CJK Unified Ideographs Extension A (0x3400 -- 0x4DBF)
@@ -80,16 +49,16 @@ class CharacterClassifier {
8049
return CharacterClass.BREAK_IDEOGRAPHIC;
8150
}
8251

83-
return CharacterClass.NONE;
52+
return super.get(charCode);
8453
}
8554
}
8655

8756
export class CharacterHardWrappingLineMapperFactory implements ILineMapperFactory {
8857

89-
private classifier:CharacterClassifier;
58+
private classifier:WrappingCharacterClassifier;
9059

9160
constructor(breakBeforeChars:string, breakAfterChars:string, breakObtrusiveChars:string) {
92-
this.classifier = new CharacterClassifier(breakBeforeChars, breakAfterChars, breakObtrusiveChars);
61+
this.classifier = new WrappingCharacterClassifier(breakBeforeChars, breakAfterChars, breakObtrusiveChars);
9362
}
9463

9564
// TODO@Alex -> duplicated in lineCommentCommand
@@ -157,7 +126,7 @@ export class CharacterHardWrappingLineMapperFactory implements ILineMapperFactor
157126

158127
let charCode = lineText.charCodeAt(i);
159128
let charCodeIsTab = (charCode === TAB_CHAR_CODE);
160-
let charCodeClass = classifier.classify(charCode);
129+
let charCodeClass = classifier.get(charCode);
161130

162131
if (charCodeClass === CharacterClass.BREAK_BEFORE) {
163132
// This is a character that indicates that a break should happen before it
@@ -170,7 +139,7 @@ export class CharacterHardWrappingLineMapperFactory implements ILineMapperFactor
170139
// CJK breaking : before break
171140
if (charCodeClass === CharacterClass.BREAK_IDEOGRAPHIC && i > 0) {
172141
let prevCode = lineText.charCodeAt(i - 1);
173-
let prevClass = classifier.classify(prevCode);
142+
let prevClass = classifier.get(prevCode);
174143
if (prevClass !== CharacterClass.BREAK_BEFORE) { // Kinsoku Shori: Don't break after a leading character, like an open bracket
175144
niceBreakOffset = i;
176145
niceBreakVisibleColumn = 0;
@@ -245,7 +214,7 @@ export class CharacterHardWrappingLineMapperFactory implements ILineMapperFactor
245214
// CJK breaking : after break
246215
if (charCodeClass === CharacterClass.BREAK_IDEOGRAPHIC && i < len - 1) {
247216
let nextCode = lineText.charCodeAt(i + 1);
248-
let nextClass = classifier.classify(nextCode);
217+
let nextClass = classifier.get(nextCode);
249218
if (nextClass !== CharacterClass.BREAK_AFTER) { // Kinsoku Shori: Don't break before a trailing character, like a period
250219
niceBreakOffset = i + 1;
251220
niceBreakVisibleColumn = wrappedTextIndentVisibleColumn;

0 commit comments

Comments
 (0)