Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/test/common/services/semanticTokensProviderStyling.test.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import assert from 'assert';
7
import { DisposableStore } from '../../../../base/common/lifecycle.js';
8
import { SparseMultilineTokens } from '../../../common/tokens/sparseMultilineTokens.js';
9
import { MetadataConsts } from '../../../common/encodedTokenAttributes.js';
10
import { SemanticTokensProviderStyling, toMultilineTokens2 } from '../../../common/services/semanticTokensProviderStyling.js';
11
import { createModelServices } from '../testTextModel.js';
12
import { TestInstantiationService } from '../../../../platform/instantiation/test/common/instantiationServiceMock.js';
13
import { IColorTheme, IThemeService, ITokenStyle } from '../../../../platform/theme/common/themeService.js';
14
import { ILanguageService } from '../../../common/languages/language.js';
15
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';
16
17
suite('ModelService', () => {
18
let disposables: DisposableStore;
19
let instantiationService: TestInstantiationService;
20
let languageService: ILanguageService;
21
22
setup(() => {
23
disposables = new DisposableStore();
24
instantiationService = createModelServices(disposables);
25
languageService = instantiationService.get(ILanguageService);
26
});
27
28
teardown(() => {
29
disposables.dispose();
30
});
31
32
ensureNoDisposablesAreLeakedInTestSuite();
33
34
test('issue #134973: invalid semantic tokens should be handled better', () => {
35
const languageId = 'java';
36
disposables.add(languageService.registerLanguage({ id: languageId }));
37
const legend = {
38
tokenTypes: ['st0', 'st1', 'st2', 'st3', 'st4', 'st5', 'st6', 'st7', 'st8', 'st9', 'st10'],
39
tokenModifiers: []
40
};
41
instantiationService.stub(IThemeService, {
42
getColorTheme() {
43
return <IColorTheme>{
44
getTokenStyleMetadata: (tokenType, tokenModifiers, languageId): ITokenStyle => {
45
return {
46
foreground: parseInt(tokenType.substr(2), 10),
47
bold: undefined,
48
underline: undefined,
49
strikethrough: undefined,
50
italic: undefined
51
};
52
}
53
};
54
}
55
});
56
const styling = instantiationService.createInstance(SemanticTokensProviderStyling, legend);
57
const badTokens = {
58
data: new Uint32Array([
59
0, 13, 16, 1, 0,
60
1, 2, 6, 2, 0,
61
0, 7, 6, 3, 0,
62
0, 15, 8, 4, 0,
63
0, 17, 1, 5, 0,
64
0, 7, 5, 6, 0,
65
1, 12, 8, 7, 0,
66
0, 19, 5, 8, 0,
67
0, 7, 1, 9, 0,
68
0, 4294967294, 5, 10, 0
69
])
70
};
71
const result = toMultilineTokens2(badTokens, styling, languageId);
72
const expected = SparseMultilineTokens.create(1, new Uint32Array([
73
0, 13, 29, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (1 << MetadataConsts.FOREGROUND_OFFSET)),
74
1, 2, 8, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (2 << MetadataConsts.FOREGROUND_OFFSET)),
75
1, 9, 15, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (3 << MetadataConsts.FOREGROUND_OFFSET)),
76
1, 24, 32, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (4 << MetadataConsts.FOREGROUND_OFFSET)),
77
1, 41, 42, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (5 << MetadataConsts.FOREGROUND_OFFSET)),
78
1, 48, 53, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (6 << MetadataConsts.FOREGROUND_OFFSET)),
79
2, 12, 20, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (7 << MetadataConsts.FOREGROUND_OFFSET)),
80
2, 31, 36, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (8 << MetadataConsts.FOREGROUND_OFFSET)),
81
2, 38, 39, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (9 << MetadataConsts.FOREGROUND_OFFSET)),
82
]));
83
assert.deepStrictEqual(result.toString(), expected.toString());
84
});
85
86
test('issue #148651: VSCode UI process can hang if a semantic token with negative values is returned by language service', () => {
87
const languageId = 'dockerfile';
88
disposables.add(languageService.registerLanguage({ id: languageId }));
89
const legend = {
90
tokenTypes: ['st0', 'st1', 'st2', 'st3', 'st4', 'st5', 'st6', 'st7', 'st8', 'st9'],
91
tokenModifiers: ['stm0', 'stm1', 'stm2']
92
};
93
instantiationService.stub(IThemeService, {
94
getColorTheme() {
95
return <IColorTheme>{
96
getTokenStyleMetadata: (tokenType, tokenModifiers, languageId): ITokenStyle => {
97
return {
98
foreground: parseInt(tokenType.substr(2), 10),
99
bold: undefined,
100
underline: undefined,
101
strikethrough: undefined,
102
italic: undefined
103
};
104
}
105
};
106
}
107
});
108
const styling = instantiationService.createInstance(SemanticTokensProviderStyling, legend);
109
const badTokens = {
110
data: new Uint32Array([
111
0, 0, 3, 0, 0,
112
0, 4, 2, 2, 0,
113
0, 2, 3, 8, 0,
114
0, 3, 1, 9, 0,
115
0, 1, 1, 10, 0,
116
0, 1, 4, 8, 0,
117
0, 4, 4294967292, 2, 0,
118
0, 4294967292, 4294967294, 8, 0,
119
0, 4294967294, 1, 9, 0,
120
0, 1, 1, 10, 0,
121
0, 1, 3, 8, 0,
122
0, 3, 4294967291, 8, 0,
123
0, 4294967291, 1, 9, 0,
124
0, 1, 1, 10, 0,
125
0, 1, 4, 8, 0
126
])
127
};
128
const result = toMultilineTokens2(badTokens, styling, languageId);
129
const expected = SparseMultilineTokens.create(1, new Uint32Array([
130
0, 4, 6, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (1 << MetadataConsts.FOREGROUND_OFFSET)),
131
0, 6, 9, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (2 << MetadataConsts.FOREGROUND_OFFSET)),
132
0, 9, 10, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (3 << MetadataConsts.FOREGROUND_OFFSET)),
133
0, 11, 15, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (4 << MetadataConsts.FOREGROUND_OFFSET)),
134
]));
135
assert.deepStrictEqual(result.toString(), expected.toString());
136
});
137
138
test('issue #149130: vscode freezes because of Bracket Pair Colorization', () => {
139
const languageId = 'q';
140
disposables.add(languageService.registerLanguage({ id: languageId }));
141
const legend = {
142
tokenTypes: ['st0', 'st1', 'st2', 'st3', 'st4', 'st5'],
143
tokenModifiers: ['stm0', 'stm1', 'stm2']
144
};
145
instantiationService.stub(IThemeService, {
146
getColorTheme() {
147
return <IColorTheme>{
148
getTokenStyleMetadata: (tokenType, tokenModifiers, languageId): ITokenStyle => {
149
return {
150
foreground: parseInt(tokenType.substr(2), 10),
151
bold: undefined,
152
underline: undefined,
153
strikethrough: undefined,
154
italic: undefined
155
};
156
}
157
};
158
}
159
});
160
const styling = instantiationService.createInstance(SemanticTokensProviderStyling, legend);
161
const badTokens = {
162
data: new Uint32Array([
163
0, 11, 1, 1, 0,
164
0, 4, 1, 1, 0,
165
0, 4294967289, 1, 1, 0
166
])
167
};
168
const result = toMultilineTokens2(badTokens, styling, languageId);
169
const expected = SparseMultilineTokens.create(1, new Uint32Array([
170
0, 11, 12, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (1 << MetadataConsts.FOREGROUND_OFFSET)),
171
0, 15, 16, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (1 << MetadataConsts.FOREGROUND_OFFSET)),
172
]));
173
assert.deepStrictEqual(result.toString(), expected.toString());
174
});
175
});
176
177