Skip to content

Commit 6e8b2dd

Browse files
committed
Fixes microsoft#145938 by respecting independentColorPoolPerBracketType for bracket guides too.
1 parent 6df0027 commit 6e8b2dd

File tree

3 files changed

+154
-38
lines changed

3 files changed

+154
-38
lines changed

src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/bracketPairsTree.ts

Lines changed: 135 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -140,23 +140,43 @@ export class BracketPairsTree extends Disposable {
140140

141141
const node = this.initialAstWithoutTokens || this.astWithTokens!;
142142
const context = new CollectBracketPairsContext(result, includeMinIndentation, this.textModel);
143-
collectBracketPairs(node, lengthZero, node.length, startLength, endLength, context);
143+
collectBracketPairs(node, lengthZero, node.length, startLength, endLength, context, 0, new Map());
144144

145145
return result;
146146
}
147147
}
148148

149-
function collectBrackets(node: AstNode, nodeOffsetStart: Length, nodeOffsetEnd: Length, startOffset: Length, endOffset: Length, result: BracketInfo[], level: number = 0, levelPerBracketType?: Map<string, number>): void {
149+
function collectBrackets(
150+
node: AstNode,
151+
nodeOffsetStart: Length,
152+
nodeOffsetEnd: Length,
153+
startOffset: Length,
154+
endOffset: Length,
155+
result: BracketInfo[],
156+
level: number,
157+
levelPerBracketType: Map<string, number>
158+
): void {
150159
if (node.kind === AstNodeKind.List) {
151160
for (const child of node.children) {
152161
nodeOffsetEnd = lengthAdd(nodeOffsetStart, child.length);
153-
if (lengthLessThanEqual(nodeOffsetStart, endOffset) && lengthGreaterThanEqual(nodeOffsetEnd, startOffset)) {
154-
collectBrackets(child, nodeOffsetStart, nodeOffsetEnd, startOffset, endOffset, result, level, levelPerBracketType);
162+
if (
163+
lengthLessThanEqual(nodeOffsetStart, endOffset) &&
164+
lengthGreaterThanEqual(nodeOffsetEnd, startOffset)
165+
) {
166+
collectBrackets(
167+
child,
168+
nodeOffsetStart,
169+
nodeOffsetEnd,
170+
startOffset,
171+
endOffset,
172+
result,
173+
level,
174+
levelPerBracketType
175+
);
155176
}
156177
nodeOffsetStart = nodeOffsetEnd;
157178
}
158179
} else if (node.kind === AstNodeKind.Pair) {
159-
160180
let levelPerBracket = 0;
161181
if (levelPerBracketType) {
162182
let existing = levelPerBracketType.get(node.openingBracket.text);
@@ -172,25 +192,45 @@ function collectBrackets(node: AstNode, nodeOffsetStart: Length, nodeOffsetEnd:
172192
{
173193
const child = node.openingBracket;
174194
nodeOffsetEnd = lengthAdd(nodeOffsetStart, child.length);
175-
if (lengthLessThanEqual(nodeOffsetStart, endOffset) && lengthGreaterThanEqual(nodeOffsetEnd, startOffset)) {
195+
if (
196+
lengthLessThanEqual(nodeOffsetStart, endOffset) &&
197+
lengthGreaterThanEqual(nodeOffsetEnd, startOffset)
198+
) {
176199
const range = lengthsToRange(nodeOffsetStart, nodeOffsetEnd);
177-
result.push(new BracketInfo(range, level, levelPerBracket, !node.closingBracket));
200+
result.push(
201+
new BracketInfo(range, level, levelPerBracket, !node.closingBracket)
202+
);
178203
}
179204
nodeOffsetStart = nodeOffsetEnd;
180205
}
181206

182207
if (node.child) {
183208
const child = node.child;
184209
nodeOffsetEnd = lengthAdd(nodeOffsetStart, child.length);
185-
if (lengthLessThanEqual(nodeOffsetStart, endOffset) && lengthGreaterThanEqual(nodeOffsetEnd, startOffset)) {
186-
collectBrackets(child, nodeOffsetStart, nodeOffsetEnd, startOffset, endOffset, result, level + 1, levelPerBracketType);
210+
if (
211+
lengthLessThanEqual(nodeOffsetStart, endOffset) &&
212+
lengthGreaterThanEqual(nodeOffsetEnd, startOffset)
213+
) {
214+
collectBrackets(
215+
child,
216+
nodeOffsetStart,
217+
nodeOffsetEnd,
218+
startOffset,
219+
endOffset,
220+
result,
221+
level + 1,
222+
levelPerBracketType
223+
);
187224
}
188225
nodeOffsetStart = nodeOffsetEnd;
189226
}
190227
if (node.closingBracket) {
191228
const child = node.closingBracket;
192229
nodeOffsetEnd = lengthAdd(nodeOffsetStart, child.length);
193-
if (lengthLessThanEqual(nodeOffsetStart, endOffset) && lengthGreaterThanEqual(nodeOffsetEnd, startOffset)) {
230+
if (
231+
lengthLessThanEqual(nodeOffsetStart, endOffset) &&
232+
lengthGreaterThanEqual(nodeOffsetEnd, startOffset)
233+
) {
194234
const range = lengthsToRange(nodeOffsetStart, nodeOffsetEnd);
195235
result.push(new BracketInfo(range, level, levelPerBracket, false));
196236
}
@@ -218,33 +258,98 @@ class CollectBracketPairsContext {
218258
}
219259
}
220260

221-
function collectBracketPairs(node: AstNode, nodeOffset: Length, nodeOffsetEnd: Length, startOffset: Length, endOffset: Length, context: CollectBracketPairsContext, level: number = 0) {
261+
function collectBracketPairs(
262+
node: AstNode,
263+
nodeOffsetStart: Length,
264+
nodeOffsetEnd: Length,
265+
startOffset: Length,
266+
endOffset: Length,
267+
context: CollectBracketPairsContext,
268+
level: number,
269+
levelPerBracketType: Map<string, number>
270+
) {
222271
if (node.kind === AstNodeKind.Pair) {
223-
const openingBracketEnd = lengthAdd(nodeOffset, node.openingBracket.length);
272+
let levelPerBracket = 0;
273+
if (levelPerBracketType) {
274+
let existing = levelPerBracketType.get(node.openingBracket.text);
275+
if (existing === undefined) {
276+
existing = 0;
277+
}
278+
levelPerBracket = existing;
279+
existing++;
280+
levelPerBracketType.set(node.openingBracket.text, existing);
281+
}
282+
283+
const openingBracketEnd = lengthAdd(nodeOffsetStart, node.openingBracket.length);
224284
let minIndentation = -1;
225285
if (context.includeMinIndentation) {
226-
minIndentation = node.computeMinIndentation(nodeOffset, context.textModel);
286+
minIndentation = node.computeMinIndentation(
287+
nodeOffsetStart,
288+
context.textModel
289+
);
227290
}
228291

229-
context.result.push(new BracketPairWithMinIndentationInfo(
230-
lengthsToRange(nodeOffset, nodeOffsetEnd),
231-
lengthsToRange(nodeOffset, openingBracketEnd),
232-
node.closingBracket
233-
? lengthsToRange(lengthAdd(openingBracketEnd, node.child?.length || lengthZero), nodeOffsetEnd)
234-
: undefined,
235-
level,
236-
minIndentation
237-
));
238-
level++;
239-
}
292+
context.result.push(
293+
new BracketPairWithMinIndentationInfo(
294+
lengthsToRange(nodeOffsetStart, nodeOffsetEnd),
295+
lengthsToRange(nodeOffsetStart, openingBracketEnd),
296+
node.closingBracket
297+
? lengthsToRange(
298+
lengthAdd(openingBracketEnd, node.child?.length || lengthZero),
299+
nodeOffsetEnd
300+
)
301+
: undefined,
302+
level,
303+
levelPerBracket,
304+
minIndentation
305+
)
306+
);
240307

241-
let curOffset = nodeOffset;
242-
for (const child of node.children) {
243-
const childOffset = curOffset;
244-
curOffset = lengthAdd(curOffset, child.length);
308+
nodeOffsetStart = openingBracketEnd;
309+
if (node.child) {
310+
const child = node.child;
311+
nodeOffsetEnd = lengthAdd(nodeOffsetStart, child.length);
312+
if (
313+
lengthLessThanEqual(nodeOffsetStart, endOffset) &&
314+
lengthGreaterThanEqual(nodeOffsetEnd, startOffset)
315+
) {
316+
collectBracketPairs(
317+
child,
318+
nodeOffsetStart,
319+
nodeOffsetEnd,
320+
startOffset,
321+
endOffset,
322+
context,
323+
level + 1,
324+
levelPerBracketType
325+
);
326+
}
327+
}
245328

246-
if (lengthLessThanEqual(childOffset, endOffset) && lengthLessThanEqual(startOffset, curOffset)) {
247-
collectBracketPairs(child, childOffset, curOffset, startOffset, endOffset, context, level);
329+
if (levelPerBracketType) {
330+
levelPerBracketType.set(node.openingBracket.text, levelPerBracket);
331+
}
332+
} else {
333+
let curOffset = nodeOffsetStart;
334+
for (const child of node.children) {
335+
const childOffset = curOffset;
336+
curOffset = lengthAdd(curOffset, child.length);
337+
338+
if (
339+
lengthLessThanEqual(childOffset, endOffset) &&
340+
lengthLessThanEqual(startOffset, curOffset)
341+
) {
342+
collectBracketPairs(
343+
child,
344+
childOffset,
345+
curOffset,
346+
startOffset,
347+
endOffset,
348+
context,
349+
level,
350+
levelPerBracketType
351+
);
352+
}
248353
}
249354
}
250355
}

src/vs/editor/common/model/guidesTextModelPart.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import * as strings from 'vs/base/common/strings';
88
import { CursorColumns } from 'vs/editor/common/core/cursorColumns';
99
import { IPosition, Position } from 'vs/editor/common/core/position';
1010
import { Range } from 'vs/editor/common/core/range';
11-
import { BracketPairInfo } from 'vs/editor/common/textModelBracketPairs';
11+
import { BracketInfo, BracketPairInfo } from 'vs/editor/common/textModelBracketPairs';
1212
import type { TextModel } from 'vs/editor/common/model/textModel';
1313
import { TextModelPart } from 'vs/editor/common/model/textModelPart';
1414
import { computeIndentLevel } from 'vs/editor/common/model/utils';
@@ -317,6 +317,7 @@ export class GuidesTextModelPart extends TextModelPart implements IGuidesTextMod
317317
/** Indexed by nesting level */
318318
const activeGuides = new Array<{
319319
nestingLevel: number;
320+
nestingLevelOfEqualBracketType: number;
320321
guideVisibleColumn: number;
321322
start: Position;
322323
visibleStartColumn: number;
@@ -327,6 +328,8 @@ export class GuidesTextModelPart extends TextModelPart implements IGuidesTextMod
327328
} | null>();
328329
const nextGuides = new Array<IndentGuide>();
329330
const colorProvider = new BracketPairGuidesClassNames();
331+
const independentColorPoolPerBracketType = this.textModel.getOptions().bracketPairColorizationOptions
332+
.independentColorPoolPerBracketType;
330333

331334
for (
332335
let lineNumber = startLineNumber;
@@ -382,6 +385,7 @@ export class GuidesTextModelPart extends TextModelPart implements IGuidesTextMod
382385
} else {
383386
activeGuides[pair.nestingLevel] = {
384387
nestingLevel: pair.nestingLevel,
388+
nestingLevelOfEqualBracketType: pair.nestingLevelOfEqualBracketType,
385389
guideVisibleColumn,
386390
start,
387391
visibleStartColumn: this.getVisibleColumnFromPosition(start),
@@ -402,7 +406,7 @@ export class GuidesTextModelPart extends TextModelPart implements IGuidesTextMod
402406
line.bracketPair.range.equalsRange(activeBracketPairRange);
403407

404408
const className =
405-
colorProvider.getInlineClassNameOfLevel(line.nestingLevel) +
409+
colorProvider.getInlineClassName(line.nestingLevel, line.nestingLevelOfEqualBracketType, independentColorPoolPerBracketType) +
406410
(options.highlightActive && isActive
407411
? ' ' + colorProvider.activeClassName
408412
: '');
@@ -458,8 +462,11 @@ export class GuidesTextModelPart extends TextModelPart implements IGuidesTextMod
458462
line.bracketPair.range.equalsRange(activeBracketPairRange);
459463

460464
const className =
461-
colorProvider.getInlineClassNameOfLevel(line.nestingLevel) +
462-
(isActive ? ' ' + colorProvider.activeClassName : '');
465+
colorProvider.getInlineClassName(
466+
line.nestingLevel,
467+
line.nestingLevelOfEqualBracketType,
468+
independentColorPoolPerBracketType
469+
) + (isActive ? ' ' + colorProvider.activeClassName : '');
463470

464471
if (isActive || options.includeInactive) {
465472
if (
@@ -629,6 +636,10 @@ export class GuidesTextModelPart extends TextModelPart implements IGuidesTextMod
629636
export class BracketPairGuidesClassNames {
630637
public readonly activeClassName = 'indent-active';
631638

639+
getInlineClassName(nestingLevel: number, nestingLevelOfEqualBracketType: number, independentColorPoolPerBracketType: boolean): string {
640+
return this.getInlineClassNameOfLevel(independentColorPoolPerBracketType ? nestingLevelOfEqualBracketType : nestingLevel);
641+
}
642+
632643
getInlineClassNameOfLevel(level: number): string {
633644
// To support a dynamic amount of colors up to 6 colors,
634645
// we use a number that is a lcm of all numbers from 1 to 6.

src/vs/editor/common/textModelBracketPairs.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,9 @@ export class BracketPairInfo {
8585
public readonly range: Range,
8686
public readonly openingBracketRange: Range,
8787
public readonly closingBracketRange: Range | undefined,
88-
/**
89-
* 0-based
90-
*/
88+
/** 0-based */
9189
public readonly nestingLevel: number,
90+
public readonly nestingLevelOfEqualBracketType: number,
9291
) { }
9392
}
9493

@@ -101,11 +100,12 @@ export class BracketPairWithMinIndentationInfo extends BracketPairInfo {
101100
* 0-based
102101
*/
103102
nestingLevel: number,
103+
nestingLevelOfEqualBracketType: number,
104104
/**
105105
* -1 if not requested, otherwise the size of the minimum indentation in the bracket pair in terms of visible columns.
106106
*/
107107
public readonly minVisibleColumnIndentation: number,
108108
) {
109-
super(range, openingBracketRange, closingBracketRange, nestingLevel);
109+
super(range, openingBracketRange, closingBracketRange, nestingLevel, nestingLevelOfEqualBracketType);
110110
}
111111
}

0 commit comments

Comments
 (0)