1
>
/*---------------------------------------------------------------------------------------------
brackets.ts
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
>
import { escapeRegExpCharacters } from '../../../../../base/common/strings.js';
6
>
import { ResolvedLanguageConfiguration } from '../../../languages/languageConfigurationRegistry.js';
7
>
import { BracketKind } from '../../../languages/supports/languageBracketsConfiguration.js';
8
>
import { BracketAstNode } from './ast.js';
9
>
import { toLength } from './length.js';
10
>
import { DenseKeyProvider, identityKeyProvider, SmallImmutableSet } from './smallImmutableSet.js';
11
>
import { OpeningBracketId, Token, TokenKind } from './tokenizer.js';
12
>
13
>
export class BracketTokens {
14
>
static createFromLanguage(configuration: ResolvedLanguageConfiguration, denseKeyProvider: DenseKeyProvider<string>): BracketTokens {
15
>
function getId(bracketInfo: BracketKind): OpeningBracketId {
16
>
return denseKeyProvider.getKey(`${bracketInfo.languageId}:::${bracketInfo.bracketText}`);
17
>
}
18
>
19
>
const map = new Map<string, Token>();
20
>
for (const openingBracket of configuration.bracketsNew.openingBrackets) {
21
>
const length = toLength(0, openingBracket.bracketText.length);
22
>
const openingTextId = getId(openingBracket);
23
>
const bracketIds = SmallImmutableSet.getEmpty().add(openingTextId, identityKeyProvider);
24
>
map.set(openingBracket.bracketText, new Token(
25
>
length,
26
>
TokenKind.OpeningBracket,
27
>
openingTextId,
28
>
bracketIds,
29
>
BracketAstNode.create(length, openingBracket, bracketIds)
30
>
));
31
>
}
32
>
33
>
for (const closingBracket of configuration.bracketsNew.closingBrackets) {
34
>
const length = toLength(0, closingBracket.bracketText.length);
35
>
let bracketIds = SmallImmutableSet.getEmpty();
36
>
const closingBrackets = closingBracket.getOpeningBrackets();
37
>
for (const bracket of closingBrackets) {
38
>
bracketIds = bracketIds.add(getId(bracket), identityKeyProvider);
39
>
}
40
>
map.set(closingBracket.bracketText, new Token(
41
>
length,
42
>
TokenKind.ClosingBracket,
43
>
getId(closingBrackets[0]),
44
>
bracketIds,
45
>
BracketAstNode.create(length, closingBracket, bracketIds)
46
>
));
47
>
}
48
>
49
>
return new BracketTokens(map);
50
>
}
51
>
52
>
private hasRegExp = false;
53
>
private _regExpGlobal: RegExp | null = null;
54
>
55
>
constructor(
56
private readonly map: Map<string, Token>
57
) { }
59
>
getRegExpStr(): string | null {
60
if (this.isEmpty) {
61
return null;