Skip to content

Commit 5e7472b

Browse files
committed
perf - save an array when asking for language features
1 parent d25d7ff commit 5e7472b

1 file changed

Lines changed: 24 additions & 21 deletions

File tree

src/vs/editor/common/modes/languageFeatureRegistry.ts

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -90,60 +90,63 @@ export default class LanguageFeatureRegistry<T> {
9090
}
9191

9292
ordered(model: IModel): T[] {
93-
let entries = this._orderedEntries(model);
94-
return entries.map(item => item.provider);
93+
const result: T[] = [];
94+
this._orderedForEach(model, entry => result.push(entry.provider));
95+
return result;
9596
}
9697

9798
orderedGroups(model: IModel): T[][] {
98-
let entries = this._orderedEntries(model);
99-
let result: T[][] = [];
99+
const result: T[][] = [];
100100
let lastBucket: T[];
101101
let lastBucketScore: number;
102102

103-
for (let entry of entries) {
103+
this._orderedForEach(model, entry => {
104104
if (lastBucket && lastBucketScore === entry._score) {
105105
lastBucket.push(entry.provider);
106106
} else {
107107
lastBucketScore = entry._score;
108108
lastBucket = [entry.provider];
109109
result.push(lastBucket);
110110
}
111-
}
111+
});
112112

113113
return result;
114114
}
115115

116-
private _orderedEntries(model: IModel): Entry<T>[] {
116+
private _orderedForEach(model: IModel, callback: (provider: Entry<T>) => any): void {
117+
117118
if (!model || model.isTooLargeForHavingAMode()) {
118-
return [];
119+
return;
119120
}
120-
const result: Entry<T>[] = [];
121121

122122
if (this._updateScores(model)) {
123123
this._sortByScore();
124124
}
125125

126-
// (1) from registry
127-
for (let entry of this._entries) {
128-
if (entry._score > 0) {
129-
result.push(entry);
130-
}
131-
}
126+
let supportIndex: number = -1;
127+
let supportEntry: Entry<T>;
132128

133-
// (2) from mode
134129
if (model.getMode() && model.getMode()[this._supportName]) {
135-
136-
let entry: Entry<T> = {
130+
supportEntry = {
137131
selector: undefined,
138132
provider: model.getMode()[this._supportName],
139133
_score: .5,
140134
_time: 0
141135
};
136+
supportIndex = ~binarySearch(this._entries, supportEntry, LanguageFeatureRegistry._compareByScoreAndTime);
137+
}
142138

143-
let idx = binarySearch(result, entry, LanguageFeatureRegistry._compareByScoreAndTime);
144-
result.splice(idx < 0 ? ~idx : idx, 0, entry);
139+
const to = Math.max(supportIndex + 1, this._entries.length);
140+
for (let from = 0; from < to; from++) {
141+
if (from === supportIndex) {
142+
callback(supportEntry);
143+
} else {
144+
let entry = this._entries[from];
145+
if (entry._score > 0) {
146+
callback(entry);
147+
}
148+
}
145149
}
146-
return result;
147150
}
148151

149152
private _lastCandidate: { uri: string; language: string; };

0 commit comments

Comments
 (0)