Skip to content

Commit bff1a71

Browse files
author
aiday-mar
committed
Changes from review
1 parent 34a64c3 commit bff1a71

File tree

1 file changed

+20
-34
lines changed

1 file changed

+20
-34
lines changed

src/vs/editor/contrib/stickyScroll/browser/stickyScrollProvider.ts

Lines changed: 20 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { EditorOption } from 'vs/editor/common/config/editorOptions';
1212
import { RunOnceScheduler } from 'vs/base/common/async';
1313
import { Range } from 'vs/editor/common/core/range';
1414
import { Emitter } from 'vs/base/common/event';
15+
import { binarySearch } from 'vs/base/common/arrays';
1516

1617
export class StickyRange {
1718
constructor(
@@ -96,44 +97,29 @@ export class StickyLineCandidateProvider extends Disposable {
9697
}
9798
}
9899

99-
private customBinarySearch(model: readonly StickyOutlineElement[], startLine: number) {
100-
101-
// Binary search
102-
let result;
103-
let low = 0, high = model.length - 1;
104-
while (low <= high) {
105-
const mid = ((low + high) / 2) | 0;
106-
const comp = model[mid].range?.startLineNumber as number - startLine;
107-
if (comp < 0) {
108-
low = mid + 1;
109-
} else if (comp > 0) {
110-
high = mid - 1;
111-
} else {
112-
result = mid;
113-
break;
114-
}
100+
private updateIndex(index: number) {
101+
if (index === -1) {
102+
index = 0;
103+
} else if (index < 0) {
104+
index = -index - 2;
115105
}
116-
if (!result) { result = -(low + 1); }
117-
118-
// Update index
119-
if (result === -1) {
120-
result = 0;
121-
} else if (result < 0) {
122-
result = -result - 2;
123-
}
124-
return result;
106+
return index;
125107
}
126108

127109
public getCandidateStickyLinesIntersectingFromOutline(range: StickyRange, outlineModel: StickyOutlineElement, result: StickyLineCandidate[], depth: number, lastStartLineNumber: number): void {
128-
if (!outlineModel || outlineModel.children.length === 0) {
110+
if (outlineModel.children.length === 0) {
129111
return;
130112
}
131113
let lastLine = lastStartLineNumber;
132-
const lowerBound = this.customBinarySearch(outlineModel.children, range.startLineNumber);
133-
const upperBound = this.customBinarySearch(outlineModel.children, range.startLineNumber + depth);
114+
const childrenStartLines = outlineModel.children.map(child => child.range?.startLineNumber as number);
115+
const lowerBound = this.updateIndex(binarySearch(childrenStartLines, range.startLineNumber, (a: number, b: number) => { return a - b; }));
116+
const upperBound = this.updateIndex(binarySearch(childrenStartLines, range.startLineNumber + depth, (a: number, b: number) => { return a - b; }));
134117
for (let i = lowerBound; i <= upperBound; i++) {
135118
const child = outlineModel.children[i];
136-
if (child && child.range) {
119+
if (!child) {
120+
return;
121+
}
122+
if (child.range) {
137123
const childStartLine = child.range.startLineNumber;
138124
const childEndLine = child.range.endLineNumber;
139125
if (range.startLineNumber <= childEndLine + 1 && childStartLine - 1 <= range.endLineNumber && childStartLine !== lastLine) {
@@ -167,13 +153,13 @@ export class StickyLineCandidateProvider extends Disposable {
167153

168154
class StickyOutlineElement {
169155
public static fromOutlineModel(outlineModel: OutlineModel | OutlineElement | OutlineGroup): StickyOutlineElement {
170-
const children = [...outlineModel.children.values()].map(child => {
156+
157+
const children: StickyOutlineElement[] = [];
158+
for (const child of outlineModel.children.values()) {
171159
if (child instanceof OutlineElement && child.symbol.selectionRange.startLineNumber !== child.symbol.range.endLineNumber || child instanceof OutlineGroup || child instanceof OutlineModel) {
172-
return StickyOutlineElement.fromOutlineModel(child);
173-
} else {
174-
return;
160+
children.push(StickyOutlineElement.fromOutlineModel(child));
175161
}
176-
}).filter((child) => !!child) as StickyOutlineElement[];
162+
}
177163
children.sort((child1, child2) => {
178164
if (!child1.range || !child2.range) {
179165
return 1;

0 commit comments

Comments
 (0)