Path: blob/main/src/vs/editor/test/common/model/tokensStore.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 { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';8import { ISingleEditOperation } from '../../../common/core/editOperation.js';9import { Position } from '../../../common/core/position.js';10import { Range } from '../../../common/core/range.js';11import { ColorId, FontStyle, MetadataConsts, TokenMetadata } from '../../../common/encodedTokenAttributes.js';12import { ILanguageConfigurationService, LanguageConfigurationService } from '../../../common/languages/languageConfigurationRegistry.js';13import { TextModel } from '../../../common/model/textModel.js';14import { LanguageIdCodec } from '../../../common/services/languagesRegistry.js';15import { LineTokens } from '../../../common/tokens/lineTokens.js';16import { SparseMultilineTokens } from '../../../common/tokens/sparseMultilineTokens.js';17import { SparseTokensStore } from '../../../common/tokens/sparseTokensStore.js';18import { createModelServices, createTextModel, instantiateTextModel } from '../testTextModel.js';1920suite('TokensStore', () => {2122ensureNoDisposablesAreLeakedInTestSuite();2324const SEMANTIC_COLOR = 5 as ColorId;2526function parseTokensState(state: string[]): { text: string; tokens: SparseMultilineTokens } {27const text: string[] = [];28const tokens: number[] = [];29let baseLine = 1;30for (let i = 0; i < state.length; i++) {31const line = state[i];3233let startOffset = 0;34let lineText = '';35while (true) {36const firstPipeOffset = line.indexOf('|', startOffset);37if (firstPipeOffset === -1) {38break;39}40const secondPipeOffset = line.indexOf('|', firstPipeOffset + 1);41if (secondPipeOffset === -1) {42break;43}44if (firstPipeOffset + 1 === secondPipeOffset) {45// skip ||46lineText += line.substring(startOffset, secondPipeOffset + 1);47startOffset = secondPipeOffset + 1;48continue;49}5051lineText += line.substring(startOffset, firstPipeOffset);52const tokenStartCharacter = lineText.length;53const tokenLength = secondPipeOffset - firstPipeOffset - 1;54const metadata = (55SEMANTIC_COLOR << MetadataConsts.FOREGROUND_OFFSET56| MetadataConsts.SEMANTIC_USE_FOREGROUND57);5859if (tokens.length === 0) {60baseLine = i + 1;61}62tokens.push(i + 1 - baseLine, tokenStartCharacter, tokenStartCharacter + tokenLength, metadata);6364lineText += line.substr(firstPipeOffset + 1, tokenLength);65startOffset = secondPipeOffset + 1;66}6768lineText += line.substring(startOffset);6970text.push(lineText);71}7273return {74text: text.join('\n'),75tokens: SparseMultilineTokens.create(baseLine, new Uint32Array(tokens))76};77}7879function extractState(model: TextModel): string[] {80const result: string[] = [];81for (let lineNumber = 1; lineNumber <= model.getLineCount(); lineNumber++) {82const lineTokens = model.tokenization.getLineTokens(lineNumber);83const lineContent = model.getLineContent(lineNumber);8485let lineText = '';86for (let i = 0; i < lineTokens.getCount(); i++) {87const tokenStartCharacter = lineTokens.getStartOffset(i);88const tokenEndCharacter = lineTokens.getEndOffset(i);89const metadata = lineTokens.getMetadata(i);90const color = TokenMetadata.getForeground(metadata);91const tokenText = lineContent.substring(tokenStartCharacter, tokenEndCharacter);92if (color === SEMANTIC_COLOR) {93lineText += `|${tokenText}|`;94} else {95lineText += tokenText;96}97}9899result.push(lineText);100}101return result;102}103104function testTokensAdjustment(rawInitialState: string[], edits: ISingleEditOperation[], rawFinalState: string[]) {105const initialState = parseTokensState(rawInitialState);106const model = createTextModel(initialState.text);107model.tokenization.setSemanticTokens([initialState.tokens], true);108109model.applyEdits(edits);110111const actualState = extractState(model);112assert.deepStrictEqual(actualState, rawFinalState);113114model.dispose();115}116117test('issue #86303 - color shifting between different tokens', () => {118testTokensAdjustment(119[120`import { |URI| } from 'vs/base/common/uri';`,121`const foo = |URI|.parse('hey');`122],123[124{ range: new Range(2, 9, 2, 10), text: '' }125],126[127`import { |URI| } from 'vs/base/common/uri';`,128`const fo = |URI|.parse('hey');`129]130);131});132133test('deleting a newline', () => {134testTokensAdjustment(135[136`import { |URI| } from 'vs/base/common/uri';`,137`const foo = |URI|.parse('hey');`138],139[140{ range: new Range(1, 42, 2, 1), text: '' }141],142[143`import { |URI| } from 'vs/base/common/uri';const foo = |URI|.parse('hey');`144]145);146});147148test('inserting a newline', () => {149testTokensAdjustment(150[151`import { |URI| } from 'vs/base/common/uri';const foo = |URI|.parse('hey');`152],153[154{ range: new Range(1, 42, 1, 42), text: '\n' }155],156[157`import { |URI| } from 'vs/base/common/uri';`,158`const foo = |URI|.parse('hey');`159]160);161});162163test('deleting a newline 2', () => {164testTokensAdjustment(165[166`import { `,167` |URI| } from 'vs/base/common/uri';const foo = |URI|.parse('hey');`168],169[170{ range: new Range(1, 10, 2, 5), text: '' }171],172[173`import { |URI| } from 'vs/base/common/uri';const foo = |URI|.parse('hey');`174]175);176});177178test('issue #179268: a complex edit', () => {179testTokensAdjustment(180[181`|export| |'interior_material_selector.dart'|;`,182`|export| |'mileage_selector.dart'|;`,183`|export| |'owners_selector.dart'|;`,184`|export| |'price_selector.dart'|;`,185`|export| |'seat_count_selector.dart'|;`,186`|export| |'year_selector.dart'|;`,187`|export| |'winter_options_selector.dart'|;|export| |'camera_selector.dart'|;`188],189[190{ range: new Range(1, 9, 1, 9), text: `camera_selector.dart';\nexport '` },191{ range: new Range(6, 9, 7, 9), text: `` },192{ range: new Range(7, 39, 7, 39), text: `\n` },193{ range: new Range(7, 47, 7, 48), text: `ye` },194{ range: new Range(7, 49, 7, 51), text: `` },195{ range: new Range(7, 52, 7, 53), text: `` },196],197[198`|export| |'|camera_selector.dart';`,199`export 'interior_material_selector.dart';`,200`|export| |'mileage_selector.dart'|;`,201`|export| |'owners_selector.dart'|;`,202`|export| |'price_selector.dart'|;`,203`|export| |'seat_count_selector.dart'|;`,204`|export| |'||winter_options_selector.dart'|;`,205`|export| |'year_selector.dart'|;`206]207);208});209210test('issue #91936: Semantic token color highlighting fails on line with selected text', () => {211const model = createTextModel(' else if ($s = 08) then \'\\b\'');212model.tokenization.setSemanticTokens([213SparseMultilineTokens.create(1, new Uint32Array([2140, 20, 24, 0b01111000000000010000,2150, 25, 27, 0b01111000000000010000,2160, 28, 29, 0b00001000000000010000,2170, 29, 31, 0b10000000000000010000,2180, 32, 33, 0b00001000000000010000,2190, 34, 36, 0b00110000000000010000,2200, 36, 37, 0b00001000000000010000,2210, 38, 42, 0b01111000000000010000,2220, 43, 47, 0b01011000000000010000,223]))224], true);225const lineTokens = model.tokenization.getLineTokens(1);226const decodedTokens: number[] = [];227for (let i = 0, len = lineTokens.getCount(); i < len; i++) {228decodedTokens.push(lineTokens.getEndOffset(i), lineTokens.getMetadata(i));229}230231assert.deepStrictEqual(decodedTokens, [23220, 0b10000000001000010000000001,23324, 0b10000001111000010000000001,23425, 0b10000000001000010000000001,23527, 0b10000001111000010000000001,23628, 0b10000000001000010000000001,23729, 0b10000000001000010000000001,23831, 0b10000010000000010000000001,23932, 0b10000000001000010000000001,24033, 0b10000000001000010000000001,24134, 0b10000000001000010000000001,24236, 0b10000000110000010000000001,24337, 0b10000000001000010000000001,24438, 0b10000000001000010000000001,24542, 0b10000001111000010000000001,24643, 0b10000000001000010000000001,24747, 0b10000001011000010000000001248]);249250model.dispose();251});252253test('issue #147944: Language id "vs.editor.nullLanguage" is not configured nor known', () => {254const disposables = new DisposableStore();255const instantiationService = createModelServices(disposables, [256[ILanguageConfigurationService, LanguageConfigurationService]257]);258const model = disposables.add(instantiateTextModel(instantiationService, '--[[\n\n]]'));259model.tokenization.setSemanticTokens([260SparseMultilineTokens.create(1, new Uint32Array([2610, 2, 4, 0b100000000000010000,2621, 0, 0, 0b100000000000010000,2632, 0, 2, 0b100000000000010000,264]))265], true);266assert.strictEqual(model.getWordAtPosition(new Position(2, 1)), null);267disposables.dispose();268});269270test('partial tokens 1', () => {271const codec = new LanguageIdCodec();272const store = new SparseTokensStore(codec);273274// setPartial: [1,1 -> 31,2], [(5,5-10),(10,5-10),(15,5-10),(20,5-10),(25,5-10),(30,5-10)]275store.setPartial(new Range(1, 1, 31, 2), [276SparseMultilineTokens.create(5, new Uint32Array([2770, 5, 10, 1,2785, 5, 10, 2,27910, 5, 10, 3,28015, 5, 10, 4,28120, 5, 10, 5,28225, 5, 10, 6,283]))284]);285286// setPartial: [18,1 -> 42,1], [(20,5-10),(25,5-10),(30,5-10),(35,5-10),(40,5-10)]287store.setPartial(new Range(18, 1, 42, 1), [288SparseMultilineTokens.create(20, new Uint32Array([2890, 5, 10, 4,2905, 5, 10, 5,29110, 5, 10, 6,29215, 5, 10, 7,29320, 5, 10, 8,294]))295]);296297// setPartial: [1,1 -> 31,2], [(5,5-10),(10,5-10),(15,5-10),(20,5-10),(25,5-10),(30,5-10)]298store.setPartial(new Range(1, 1, 31, 2), [299SparseMultilineTokens.create(5, new Uint32Array([3000, 5, 10, 1,3015, 5, 10, 2,30210, 5, 10, 3,30315, 5, 10, 4,30420, 5, 10, 5,30525, 5, 10, 6,306]))307]);308309const lineTokens = store.addSparseTokens(10, new LineTokens(new Uint32Array([12, 1]), `enum Enum1 {`, codec));310assert.strictEqual(lineTokens.getCount(), 3);311});312313test('partial tokens 2', () => {314const codec = new LanguageIdCodec();315const store = new SparseTokensStore(codec);316317// setPartial: [1,1 -> 31,2], [(5,5-10),(10,5-10),(15,5-10),(20,5-10),(25,5-10),(30,5-10)]318store.setPartial(new Range(1, 1, 31, 2), [319SparseMultilineTokens.create(5, new Uint32Array([3200, 5, 10, 1,3215, 5, 10, 2,32210, 5, 10, 3,32315, 5, 10, 4,32420, 5, 10, 5,32525, 5, 10, 6,326]))327]);328329// setPartial: [6,1 -> 36,2], [(10,5-10),(15,5-10),(20,5-10),(25,5-10),(30,5-10),(35,5-10)]330store.setPartial(new Range(6, 1, 36, 2), [331SparseMultilineTokens.create(10, new Uint32Array([3320, 5, 10, 2,3335, 5, 10, 3,33410, 5, 10, 4,33515, 5, 10, 5,33620, 5, 10, 6,337]))338]);339340// setPartial: [17,1 -> 42,1], [(20,5-10),(25,5-10),(30,5-10),(35,5-10),(40,5-10)]341store.setPartial(new Range(17, 1, 42, 1), [342SparseMultilineTokens.create(20, new Uint32Array([3430, 5, 10, 4,3445, 5, 10, 5,34510, 5, 10, 6,34615, 5, 10, 7,34720, 5, 10, 8,348]))349]);350351const lineTokens = store.addSparseTokens(20, new LineTokens(new Uint32Array([12, 1]), `enum Enum1 {`, codec));352assert.strictEqual(lineTokens.getCount(), 3);353});354355test('partial tokens 3', () => {356const codec = new LanguageIdCodec();357const store = new SparseTokensStore(codec);358359// setPartial: [1,1 -> 31,2], [(5,5-10),(10,5-10),(15,5-10),(20,5-10),(25,5-10),(30,5-10)]360store.setPartial(new Range(1, 1, 31, 2), [361SparseMultilineTokens.create(5, new Uint32Array([3620, 5, 10, 1,3635, 5, 10, 2,36410, 5, 10, 3,36515, 5, 10, 4,36620, 5, 10, 5,36725, 5, 10, 6,368]))369]);370371// setPartial: [11,1 -> 16,2], [(15,5-10),(20,5-10)]372store.setPartial(new Range(11, 1, 16, 2), [373SparseMultilineTokens.create(10, new Uint32Array([3740, 5, 10, 3,3755, 5, 10, 4,376]))377]);378379const lineTokens = store.addSparseTokens(5, new LineTokens(new Uint32Array([12, 1]), `enum Enum1 {`, codec));380assert.strictEqual(lineTokens.getCount(), 3);381});382383test('issue #94133: Semantic colors stick around when using (only) range provider', () => {384const codec = new LanguageIdCodec();385const store = new SparseTokensStore(codec);386387// setPartial: [1,1 -> 1,20] [(1,9-11)]388store.setPartial(new Range(1, 1, 1, 20), [389SparseMultilineTokens.create(1, new Uint32Array([3900, 9, 11, 1,391]))392]);393394// setPartial: [1,1 -> 1,20], []395store.setPartial(new Range(1, 1, 1, 20), []);396397const lineTokens = store.addSparseTokens(1, new LineTokens(new Uint32Array([12, 1]), `enum Enum1 {`, codec));398assert.strictEqual(lineTokens.getCount(), 1);399});400401test('bug', () => {402function createTokens(str: string): SparseMultilineTokens {403str = str.replace(/^\[\(/, '');404str = str.replace(/\)\]$/, '');405const strTokens = str.split('),(');406const result: number[] = [];407let firstLineNumber = 0;408for (const strToken of strTokens) {409const pieces = strToken.split(',');410const chars = pieces[1].split('-');411const lineNumber = parseInt(pieces[0], 10);412const startChar = parseInt(chars[0], 10);413const endChar = parseInt(chars[1], 10);414if (firstLineNumber === 0) {415// this is the first line416firstLineNumber = lineNumber;417}418result.push(lineNumber - firstLineNumber, startChar, endChar, (lineNumber + startChar) % 13);419}420return SparseMultilineTokens.create(firstLineNumber, new Uint32Array(result));421}422423const codec = new LanguageIdCodec();424const store = new SparseTokensStore(codec);425// setPartial [36446,1 -> 36475,115] [(36448,24-29),(36448,33-46),(36448,47-54),(36450,25-35),(36450,36-50),(36451,28-33),(36451,36-49),(36451,50-57),(36452,35-53),(36452,54-62),(36454,33-38),(36454,41-54),(36454,55-60),(36455,35-53),(36455,54-62),(36457,33-44),(36457,45-49),(36457,50-56),(36457,62-83),(36457,84-88),(36458,35-53),(36458,54-62),(36460,33-37),(36460,38-42),(36460,47-57),(36460,58-67),(36461,35-53),(36461,54-62),(36463,34-38),(36463,39-45),(36463,46-51),(36463,54-63),(36463,64-71),(36463,76-80),(36463,81-87),(36463,88-92),(36463,97-107),(36463,108-119),(36464,35-53),(36464,54-62),(36466,33-71),(36466,72-76),(36467,35-53),(36467,54-62),(36469,24-29),(36469,33-46),(36469,47-54),(36470,24-35),(36470,38-46),(36473,25-35),(36473,36-51),(36474,28-33),(36474,36-49),(36474,50-58),(36475,35-53),(36475,54-62)]426store.setPartial(427new Range(36446, 1, 36475, 115),428[createTokens('[(36448,24-29),(36448,33-46),(36448,47-54),(36450,25-35),(36450,36-50),(36451,28-33),(36451,36-49),(36451,50-57),(36452,35-53),(36452,54-62),(36454,33-38),(36454,41-54),(36454,55-60),(36455,35-53),(36455,54-62),(36457,33-44),(36457,45-49),(36457,50-56),(36457,62-83),(36457,84-88),(36458,35-53),(36458,54-62),(36460,33-37),(36460,38-42),(36460,47-57),(36460,58-67),(36461,35-53),(36461,54-62),(36463,34-38),(36463,39-45),(36463,46-51),(36463,54-63),(36463,64-71),(36463,76-80),(36463,81-87),(36463,88-92),(36463,97-107),(36463,108-119),(36464,35-53),(36464,54-62),(36466,33-71),(36466,72-76),(36467,35-53),(36467,54-62),(36469,24-29),(36469,33-46),(36469,47-54),(36470,24-35),(36470,38-46),(36473,25-35),(36473,36-51),(36474,28-33),(36474,36-49),(36474,50-58),(36475,35-53),(36475,54-62)]')]429);430// setPartial [36436,1 -> 36464,142] [(36437,33-37),(36437,38-42),(36437,47-57),(36437,58-67),(36438,35-53),(36438,54-62),(36440,24-29),(36440,33-46),(36440,47-53),(36442,25-35),(36442,36-50),(36443,30-39),(36443,42-46),(36443,47-53),(36443,54-58),(36443,63-73),(36443,74-84),(36443,87-91),(36443,92-98),(36443,101-105),(36443,106-112),(36443,113-119),(36444,28-37),(36444,38-42),(36444,47-57),(36444,58-75),(36444,80-95),(36444,96-105),(36445,35-53),(36445,54-62),(36448,24-29),(36448,33-46),(36448,47-54),(36450,25-35),(36450,36-50),(36451,28-33),(36451,36-49),(36451,50-57),(36452,35-53),(36452,54-62),(36454,33-38),(36454,41-54),(36454,55-60),(36455,35-53),(36455,54-62),(36457,33-44),(36457,45-49),(36457,50-56),(36457,62-83),(36457,84-88),(36458,35-53),(36458,54-62),(36460,33-37),(36460,38-42),(36460,47-57),(36460,58-67),(36461,35-53),(36461,54-62),(36463,34-38),(36463,39-45),(36463,46-51),(36463,54-63),(36463,64-71),(36463,76-80),(36463,81-87),(36463,88-92),(36463,97-107),(36463,108-119),(36464,35-53),(36464,54-62)]431store.setPartial(432new Range(36436, 1, 36464, 142),433[createTokens('[(36437,33-37),(36437,38-42),(36437,47-57),(36437,58-67),(36438,35-53),(36438,54-62),(36440,24-29),(36440,33-46),(36440,47-53),(36442,25-35),(36442,36-50),(36443,30-39),(36443,42-46),(36443,47-53),(36443,54-58),(36443,63-73),(36443,74-84),(36443,87-91),(36443,92-98),(36443,101-105),(36443,106-112),(36443,113-119),(36444,28-37),(36444,38-42),(36444,47-57),(36444,58-75),(36444,80-95),(36444,96-105),(36445,35-53),(36445,54-62),(36448,24-29),(36448,33-46),(36448,47-54),(36450,25-35),(36450,36-50),(36451,28-33),(36451,36-49),(36451,50-57),(36452,35-53),(36452,54-62),(36454,33-38),(36454,41-54),(36454,55-60),(36455,35-53),(36455,54-62),(36457,33-44),(36457,45-49),(36457,50-56),(36457,62-83),(36457,84-88),(36458,35-53),(36458,54-62),(36460,33-37),(36460,38-42),(36460,47-57),(36460,58-67),(36461,35-53),(36461,54-62),(36463,34-38),(36463,39-45),(36463,46-51),(36463,54-63),(36463,64-71),(36463,76-80),(36463,81-87),(36463,88-92),(36463,97-107),(36463,108-119),(36464,35-53),(36464,54-62)]')]434);435// setPartial [36457,1 -> 36485,140] [(36457,33-44),(36457,45-49),(36457,50-56),(36457,62-83),(36457,84-88),(36458,35-53),(36458,54-62),(36460,33-37),(36460,38-42),(36460,47-57),(36460,58-67),(36461,35-53),(36461,54-62),(36463,34-38),(36463,39-45),(36463,46-51),(36463,54-63),(36463,64-71),(36463,76-80),(36463,81-87),(36463,88-92),(36463,97-107),(36463,108-119),(36464,35-53),(36464,54-62),(36466,33-71),(36466,72-76),(36467,35-53),(36467,54-62),(36469,24-29),(36469,33-46),(36469,47-54),(36470,24-35),(36470,38-46),(36473,25-35),(36473,36-51),(36474,28-33),(36474,36-49),(36474,50-58),(36475,35-53),(36475,54-62),(36477,28-32),(36477,33-37),(36477,42-52),(36477,53-69),(36478,32-36),(36478,37-41),(36478,46-56),(36478,57-74),(36479,32-36),(36479,37-41),(36479,46-56),(36479,57-76),(36480,32-36),(36480,37-41),(36480,46-56),(36480,57-68),(36481,32-36),(36481,37-41),(36481,46-56),(36481,57-68),(36482,39-57),(36482,58-66),(36484,34-38),(36484,39-45),(36484,46-50),(36484,55-65),(36484,66-82),(36484,86-97),(36484,98-102),(36484,103-109),(36484,111-124),(36484,125-133),(36485,39-57),(36485,58-66)]436store.setPartial(437new Range(36457, 1, 36485, 140),438[createTokens('[(36457,33-44),(36457,45-49),(36457,50-56),(36457,62-83),(36457,84-88),(36458,35-53),(36458,54-62),(36460,33-37),(36460,38-42),(36460,47-57),(36460,58-67),(36461,35-53),(36461,54-62),(36463,34-38),(36463,39-45),(36463,46-51),(36463,54-63),(36463,64-71),(36463,76-80),(36463,81-87),(36463,88-92),(36463,97-107),(36463,108-119),(36464,35-53),(36464,54-62),(36466,33-71),(36466,72-76),(36467,35-53),(36467,54-62),(36469,24-29),(36469,33-46),(36469,47-54),(36470,24-35),(36470,38-46),(36473,25-35),(36473,36-51),(36474,28-33),(36474,36-49),(36474,50-58),(36475,35-53),(36475,54-62),(36477,28-32),(36477,33-37),(36477,42-52),(36477,53-69),(36478,32-36),(36478,37-41),(36478,46-56),(36478,57-74),(36479,32-36),(36479,37-41),(36479,46-56),(36479,57-76),(36480,32-36),(36480,37-41),(36480,46-56),(36480,57-68),(36481,32-36),(36481,37-41),(36481,46-56),(36481,57-68),(36482,39-57),(36482,58-66),(36484,34-38),(36484,39-45),(36484,46-50),(36484,55-65),(36484,66-82),(36484,86-97),(36484,98-102),(36484,103-109),(36484,111-124),(36484,125-133),(36485,39-57),(36485,58-66)]')]439);440// setPartial [36441,1 -> 36469,56] [(36442,25-35),(36442,36-50),(36443,30-39),(36443,42-46),(36443,47-53),(36443,54-58),(36443,63-73),(36443,74-84),(36443,87-91),(36443,92-98),(36443,101-105),(36443,106-112),(36443,113-119),(36444,28-37),(36444,38-42),(36444,47-57),(36444,58-75),(36444,80-95),(36444,96-105),(36445,35-53),(36445,54-62),(36448,24-29),(36448,33-46),(36448,47-54),(36450,25-35),(36450,36-50),(36451,28-33),(36451,36-49),(36451,50-57),(36452,35-53),(36452,54-62),(36454,33-38),(36454,41-54),(36454,55-60),(36455,35-53),(36455,54-62),(36457,33-44),(36457,45-49),(36457,50-56),(36457,62-83),(36457,84-88),(36458,35-53),(36458,54-62),(36460,33-37),(36460,38-42),(36460,47-57),(36460,58-67),(36461,35-53),(36461,54-62),(36463,34-38),(36463,39-45),(36463,46-51),(36463,54-63),(36463,64-71),(36463,76-80),(36463,81-87),(36463,88-92),(36463,97-107),(36463,108-119),(36464,35-53),(36464,54-62),(36466,33-71),(36466,72-76),(36467,35-53),(36467,54-62),(36469,24-29),(36469,33-46),(36469,47-54),(36470,24-35)]441store.setPartial(442new Range(36441, 1, 36469, 56),443[createTokens('[(36442,25-35),(36442,36-50),(36443,30-39),(36443,42-46),(36443,47-53),(36443,54-58),(36443,63-73),(36443,74-84),(36443,87-91),(36443,92-98),(36443,101-105),(36443,106-112),(36443,113-119),(36444,28-37),(36444,38-42),(36444,47-57),(36444,58-75),(36444,80-95),(36444,96-105),(36445,35-53),(36445,54-62),(36448,24-29),(36448,33-46),(36448,47-54),(36450,25-35),(36450,36-50),(36451,28-33),(36451,36-49),(36451,50-57),(36452,35-53),(36452,54-62),(36454,33-38),(36454,41-54),(36454,55-60),(36455,35-53),(36455,54-62),(36457,33-44),(36457,45-49),(36457,50-56),(36457,62-83),(36457,84-88),(36458,35-53),(36458,54-62),(36460,33-37),(36460,38-42),(36460,47-57),(36460,58-67),(36461,35-53),(36461,54-62),(36463,34-38),(36463,39-45),(36463,46-51),(36463,54-63),(36463,64-71),(36463,76-80),(36463,81-87),(36463,88-92),(36463,97-107),(36463,108-119),(36464,35-53),(36464,54-62),(36466,33-71),(36466,72-76),(36467,35-53),(36467,54-62),(36469,24-29),(36469,33-46),(36469,47-54),(36470,24-35)]')]444);445446const lineTokens = store.addSparseTokens(36451, new LineTokens(new Uint32Array([60, 1]), ` if (flags & ModifierFlags.Ambient) {`, codec));447assert.strictEqual(lineTokens.getCount(), 7);448});449450451test('issue #95949: Identifiers are colored in bold when targetting keywords', () => {452453function createTMMetadata(foreground: number, fontStyle: number, languageId: number): number {454return (455(languageId << MetadataConsts.LANGUAGEID_OFFSET)456| (fontStyle << MetadataConsts.FONT_STYLE_OFFSET)457| (foreground << MetadataConsts.FOREGROUND_OFFSET)458) >>> 0;459}460461function toArr(lineTokens: LineTokens): number[] {462const r: number[] = [];463for (let i = 0; i < lineTokens.getCount(); i++) {464r.push(lineTokens.getEndOffset(i));465r.push(lineTokens.getMetadata(i));466}467return r;468}469470const codec = new LanguageIdCodec();471const store = new SparseTokensStore(codec);472473store.set([474SparseMultilineTokens.create(1, new Uint32Array([4750, 6, 11, (1 << MetadataConsts.FOREGROUND_OFFSET) | MetadataConsts.SEMANTIC_USE_FOREGROUND,476]))477], true);478479const lineTokens = store.addSparseTokens(1, new LineTokens(new Uint32Array([4805, createTMMetadata(5, FontStyle.Bold, 53),48114, createTMMetadata(1, FontStyle.None, 53),48217, createTMMetadata(6, FontStyle.None, 53),48318, createTMMetadata(1, FontStyle.None, 53),484]), `const hello = 123;`, codec));485486const actual = toArr(lineTokens);487assert.deepStrictEqual(actual, [4885, createTMMetadata(5, FontStyle.Bold, 53),4896, createTMMetadata(1, FontStyle.None, 53),49011, createTMMetadata(1, FontStyle.None, 53),49114, createTMMetadata(1, FontStyle.None, 53),49217, createTMMetadata(6, FontStyle.None, 53),49318, createTMMetadata(1, FontStyle.None, 53)494]);495});496});497498499