Skip to content

Commit 88b4f86

Browse files
committed
Allow bracket pairs to share open tokens or close tokens
1 parent 09f1506 commit 88b4f86

8 files changed

+34
-11
lines changed

src/documentDecoration.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ export default class DocumentDecoration {
342342
for (const match of matches) {
343343
const lookup = this.languageConfig.bracketToId.get(match.content);
344344
if (lookup) {
345-
newLine.AddToken(match.content, match.index, lookup.key, lookup.open);
345+
newLine.AddToken(match.content, match.index, lookup.key, lookup.open, lookup.pairsWith);
346346
}
347347
}
348348
return newLine;

src/languageConfig.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ import { IGrammar } from "./IExtensionGrammar";
33
export default class LanguageConfig {
44
public readonly grammar: IGrammar;
55
public readonly regex: RegExp;
6-
public readonly bracketToId: Map<string, { open: boolean, key: number }>;
6+
public readonly bracketToId: Map<string, { open: boolean, key: number, pairsWith: Array<number> }>;
77

8-
constructor(grammar: IGrammar, regex: RegExp, bracketToId: Map<string, { open: boolean, key: number }>) {
8+
constructor(grammar: IGrammar, regex: RegExp, bracketToId: Map<string, { open: boolean, key: number, pairsWith: Array<number> }>) {
99
this.grammar = grammar;
1010
this.regex = regex;
1111
this.bracketToId = bracketToId;

src/lineState.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,9 @@ export default class LineState {
6666
beginIndex: number,
6767
lineIndex: number,
6868
open: boolean,
69+
pairsWith: Array<number>
6970
) {
70-
const token = new Token(type, character, beginIndex, lineIndex);
71+
const token = new Token(type, character, beginIndex, lineIndex, pairsWith);
7172
if (open) {
7273
this.addOpenBracket(token);
7374
}

src/multipleIndexes.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export default class MultipleBracketGroups implements IBracketManager {
5656
const openStack = this.allLinesOpenBracketStack[token.type];
5757

5858
if (openStack.length > 0) {
59-
if (openStack[openStack.length - 1].token.type === token.type) {
59+
if (openStack[openStack.length - 1].token.pairsWith.indexOf(token.type) >= 0) {
6060
const openBracket = openStack.pop();
6161
const closeBracket = new BracketClose(token, openBracket!);
6262
this.allBracketsOnLine.push(closeBracket);

src/singularIndex.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ export default class SingularBracketGroup implements IBracketManager {
4949

5050
public addCloseBracket(token: Token) {
5151
if (this.allLinesOpenBracketStack.length > 0) {
52-
if (this.allLinesOpenBracketStack[this.allLinesOpenBracketStack.length - 1].token.type === token.type) {
52+
if (this.allLinesOpenBracketStack[this.allLinesOpenBracketStack.length - 1].token.pairsWith.indexOf(token.type) >= 0) {
5353
const openBracket = this.allLinesOpenBracketStack.pop();
5454
const closeBracket = new BracketClose(token, openBracket!);
5555
this.allBracketsOnLine.push(closeBracket);

src/textLine.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,9 @@ export default class TextLine {
3636
index: number,
3737
key: number,
3838
open: boolean,
39+
pairsWith: Array<number>
3940
) {
40-
this.lineState.addBracket(key, currentChar, index, this.index, open);
41+
this.lineState.addBracket(key, currentChar, index, this.index, open, pairsWith);
4142
}
4243

4344
public getClosingBracket(position: Position): BracketClose | undefined {

src/textMateLoader.ts

+22-3
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,30 @@ export class TextMateLoader {
9191
return;
9292
}
9393

94-
const bracketToId = new Map<string, { open: boolean, key: number }>();
94+
const bracketToId = new Map<string, { open: boolean, key: number, pairsWith: Array<number> }>();
9595
for (let i = 0; i < brackets.length; i++) {
9696
const bracket = brackets[i];
97-
bracketToId.set(bracket[0], { open: true, key: i });
98-
bracketToId.set(bracket[1], { open: false, key: i });
97+
98+
var openBracket = bracketToId.get(bracket[0]);
99+
var closeBracket = bracketToId.get(bracket[1]);
100+
101+
// Create new keys if brackets don't exist.
102+
if (openBracket === undefined) {
103+
openBracket = { open: true, key: i, pairsWith: [] };
104+
}
105+
if (closeBracket === undefined) {
106+
closeBracket = { open: false, key: i, pairsWith: [] };
107+
}
108+
// Link open and close brackets.
109+
if (openBracket.pairsWith.indexOf(closeBracket.key) < 0) {
110+
openBracket.pairsWith.push(closeBracket.key);
111+
}
112+
if (closeBracket.pairsWith.indexOf(openBracket.key) < 0) {
113+
closeBracket.pairsWith.push(openBracket.key);
114+
}
115+
// Create or update bracket definitions
116+
bracketToId.set(bracket[0], openBracket);
117+
bracketToId.set(bracket[1], closeBracket);
99118
}
100119

101120
let maxBracketLength = 0;

src/token.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ import { Position, Range } from "vscode";
22

33
export default class Token {
44
public readonly type: number;
5+
public readonly pairsWith: Array<number>;
56
public readonly character: string;
67
public range: Range;
78

8-
constructor(type: number, character: string, beginIndex: number, lineIndex: number) {
9+
constructor(type: number, character: string, beginIndex: number, lineIndex: number, pairsWith: Array<number>) {
910
this.type = type;
11+
this.pairsWith = pairsWith;
1012
this.character = character;
1113
const startPos = new Position(lineIndex, beginIndex);
1214
const endPos = startPos.translate(0, character.length);

0 commit comments

Comments
 (0)