Path: blob/main/src/vs/editor/test/common/services/semanticTokensProviderStyling.test.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import assert from 'assert';6import { DisposableStore } from '../../../../base/common/lifecycle.js';7import { SparseMultilineTokens } from '../../../common/tokens/sparseMultilineTokens.js';8import { MetadataConsts } from '../../../common/encodedTokenAttributes.js';9import { SemanticTokensProviderStyling, toMultilineTokens2 } from '../../../common/services/semanticTokensProviderStyling.js';10import { createModelServices } from '../testTextModel.js';11import { TestInstantiationService } from '../../../../platform/instantiation/test/common/instantiationServiceMock.js';12import { IColorTheme, IThemeService, ITokenStyle } from '../../../../platform/theme/common/themeService.js';13import { ILanguageService } from '../../../common/languages/language.js';14import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';1516suite('ModelService', () => {17let disposables: DisposableStore;18let instantiationService: TestInstantiationService;19let languageService: ILanguageService;2021setup(() => {22disposables = new DisposableStore();23instantiationService = createModelServices(disposables);24languageService = instantiationService.get(ILanguageService);25});2627teardown(() => {28disposables.dispose();29});3031ensureNoDisposablesAreLeakedInTestSuite();3233test('issue #134973: invalid semantic tokens should be handled better', () => {34const languageId = 'java';35disposables.add(languageService.registerLanguage({ id: languageId }));36const legend = {37tokenTypes: ['st0', 'st1', 'st2', 'st3', 'st4', 'st5', 'st6', 'st7', 'st8', 'st9', 'st10'],38tokenModifiers: []39};40instantiationService.stub(IThemeService, {41getColorTheme() {42return <IColorTheme>{43getTokenStyleMetadata: (tokenType, tokenModifiers, languageId): ITokenStyle => {44return {45foreground: parseInt(tokenType.substr(2), 10),46bold: undefined,47underline: undefined,48strikethrough: undefined,49italic: undefined50};51}52};53}54});55const styling = instantiationService.createInstance(SemanticTokensProviderStyling, legend);56const badTokens = {57data: new Uint32Array([580, 13, 16, 1, 0,591, 2, 6, 2, 0,600, 7, 6, 3, 0,610, 15, 8, 4, 0,620, 17, 1, 5, 0,630, 7, 5, 6, 0,641, 12, 8, 7, 0,650, 19, 5, 8, 0,660, 7, 1, 9, 0,670, 4294967294, 5, 10, 068])69};70const result = toMultilineTokens2(badTokens, styling, languageId);71const expected = SparseMultilineTokens.create(1, new Uint32Array([720, 13, 29, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (1 << MetadataConsts.FOREGROUND_OFFSET)),731, 2, 8, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (2 << MetadataConsts.FOREGROUND_OFFSET)),741, 9, 15, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (3 << MetadataConsts.FOREGROUND_OFFSET)),751, 24, 32, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (4 << MetadataConsts.FOREGROUND_OFFSET)),761, 41, 42, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (5 << MetadataConsts.FOREGROUND_OFFSET)),771, 48, 53, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (6 << MetadataConsts.FOREGROUND_OFFSET)),782, 12, 20, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (7 << MetadataConsts.FOREGROUND_OFFSET)),792, 31, 36, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (8 << MetadataConsts.FOREGROUND_OFFSET)),802, 38, 39, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (9 << MetadataConsts.FOREGROUND_OFFSET)),81]));82assert.deepStrictEqual(result.toString(), expected.toString());83});8485test('issue #148651: VSCode UI process can hang if a semantic token with negative values is returned by language service', () => {86const languageId = 'dockerfile';87disposables.add(languageService.registerLanguage({ id: languageId }));88const legend = {89tokenTypes: ['st0', 'st1', 'st2', 'st3', 'st4', 'st5', 'st6', 'st7', 'st8', 'st9'],90tokenModifiers: ['stm0', 'stm1', 'stm2']91};92instantiationService.stub(IThemeService, {93getColorTheme() {94return <IColorTheme>{95getTokenStyleMetadata: (tokenType, tokenModifiers, languageId): ITokenStyle => {96return {97foreground: parseInt(tokenType.substr(2), 10),98bold: undefined,99underline: undefined,100strikethrough: undefined,101italic: undefined102};103}104};105}106});107const styling = instantiationService.createInstance(SemanticTokensProviderStyling, legend);108const badTokens = {109data: new Uint32Array([1100, 0, 3, 0, 0,1110, 4, 2, 2, 0,1120, 2, 3, 8, 0,1130, 3, 1, 9, 0,1140, 1, 1, 10, 0,1150, 1, 4, 8, 0,1160, 4, 4294967292, 2, 0,1170, 4294967292, 4294967294, 8, 0,1180, 4294967294, 1, 9, 0,1190, 1, 1, 10, 0,1200, 1, 3, 8, 0,1210, 3, 4294967291, 8, 0,1220, 4294967291, 1, 9, 0,1230, 1, 1, 10, 0,1240, 1, 4, 8, 0125])126};127const result = toMultilineTokens2(badTokens, styling, languageId);128const expected = SparseMultilineTokens.create(1, new Uint32Array([1290, 4, 6, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (1 << MetadataConsts.FOREGROUND_OFFSET)),1300, 6, 9, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (2 << MetadataConsts.FOREGROUND_OFFSET)),1310, 9, 10, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (3 << MetadataConsts.FOREGROUND_OFFSET)),1320, 11, 15, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (4 << MetadataConsts.FOREGROUND_OFFSET)),133]));134assert.deepStrictEqual(result.toString(), expected.toString());135});136137test('issue #149130: vscode freezes because of Bracket Pair Colorization', () => {138const languageId = 'q';139disposables.add(languageService.registerLanguage({ id: languageId }));140const legend = {141tokenTypes: ['st0', 'st1', 'st2', 'st3', 'st4', 'st5'],142tokenModifiers: ['stm0', 'stm1', 'stm2']143};144instantiationService.stub(IThemeService, {145getColorTheme() {146return <IColorTheme>{147getTokenStyleMetadata: (tokenType, tokenModifiers, languageId): ITokenStyle => {148return {149foreground: parseInt(tokenType.substr(2), 10),150bold: undefined,151underline: undefined,152strikethrough: undefined,153italic: undefined154};155}156};157}158});159const styling = instantiationService.createInstance(SemanticTokensProviderStyling, legend);160const badTokens = {161data: new Uint32Array([1620, 11, 1, 1, 0,1630, 4, 1, 1, 0,1640, 4294967289, 1, 1, 0165])166};167const result = toMultilineTokens2(badTokens, styling, languageId);168const expected = SparseMultilineTokens.create(1, new Uint32Array([1690, 11, 12, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (1 << MetadataConsts.FOREGROUND_OFFSET)),1700, 15, 16, (MetadataConsts.SEMANTIC_USE_FOREGROUND | (1 << MetadataConsts.FOREGROUND_OFFSET)),171]));172assert.deepStrictEqual(result.toString(), expected.toString());173});174});175176177