@codingame/monaco-vscode-search-service-override 4.1.0 → 4.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/external/rollup-plugin-styles/dist/runtime/inject-css.js +3 -0
- package/external/tslib/tslib.es6.js +11 -0
- package/override/vs/platform/dialogs/common/dialogs.js +10 -0
- package/package.json +2 -2
- package/search.js +4 -4
- package/vscode/src/vs/workbench/contrib/search/browser/anythingQuickAccess.js +796 -0
- package/vscode/src/vs/workbench/contrib/search/browser/media/anythingQuickAccess.css.js +6 -0
- package/vscode/src/vs/workbench/contrib/search/browser/media/searchview.css.js +6 -0
- package/vscode/src/vs/workbench/contrib/search/browser/patternInputWidget.js +234 -0
- package/vscode/src/vs/workbench/contrib/search/browser/quickTextSearch/textSearchQuickAccess.js +341 -0
- package/vscode/src/vs/workbench/contrib/search/browser/replaceContributions.js +9 -0
- package/vscode/src/vs/workbench/contrib/search/browser/replaceService.js +232 -0
- package/vscode/src/vs/workbench/contrib/search/browser/search.contribution.js +647 -0
- package/vscode/src/vs/workbench/contrib/search/browser/searchActionsCopy.js +209 -0
- package/vscode/src/vs/workbench/contrib/search/browser/searchActionsNav.js +511 -0
- package/vscode/src/vs/workbench/contrib/search/browser/searchActionsRemoveReplace.js +374 -0
- package/vscode/src/vs/workbench/contrib/search/browser/searchActionsSymbol.js +43 -0
- package/vscode/src/vs/workbench/contrib/search/browser/searchActionsTextQuickAccess.js +44 -0
- package/vscode/src/vs/workbench/contrib/search/browser/searchActionsTopBar.js +323 -0
- package/vscode/src/vs/workbench/contrib/search/browser/searchFindInput.js +103 -0
- package/vscode/src/vs/workbench/contrib/search/browser/searchIcons.js +106 -0
- package/vscode/src/vs/workbench/contrib/search/browser/searchMessage.js +66 -0
- package/vscode/src/vs/workbench/contrib/search/browser/searchResultsView.js +437 -0
- package/vscode/src/vs/workbench/contrib/search/browser/searchView.js +2177 -0
- package/vscode/src/vs/workbench/contrib/search/browser/searchWidget.js +674 -0
- package/vscode/src/vs/workbench/contrib/search/browser/symbolsQuickAccess.js +234 -0
- package/vscode/src/vs/workbench/contrib/search/common/cacheState.js +87 -0
- package/vscode/src/vs/workbench/contrib/searchEditor/browser/media/searchEditor.css.js +6 -0
- package/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditor.contribution.js +586 -0
- package/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditor.js +760 -0
- package/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions.js +189 -0
- package/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput.js +320 -0
- package/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorModel.js +138 -0
- package/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization.js +293 -0
- package/vscode/src/vs/workbench/services/search/common/searchService.js +416 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { coalesce, flatten } from 'vscode/vscode/vs/base/common/arrays';
|
|
2
|
+
import './media/searchEditor.css.js';
|
|
3
|
+
import { Range } from 'vscode/vscode/vs/editor/common/core/range';
|
|
4
|
+
import { localizeWithPath } from 'vscode/vscode/vs/nls';
|
|
5
|
+
import { searchMatchComparer } from 'vscode/vscode/vs/workbench/contrib/search/browser/searchModel';
|
|
6
|
+
import { ITextFileService } from 'vscode/vscode/vs/workbench/services/textfile/common/textfiles';
|
|
7
|
+
|
|
8
|
+
const lineDelimiter = '\n';
|
|
9
|
+
const translateRangeLines = (n) => (range) => ( new Range(
|
|
10
|
+
range.startLineNumber + n,
|
|
11
|
+
range.startColumn,
|
|
12
|
+
range.endLineNumber + n,
|
|
13
|
+
range.endColumn
|
|
14
|
+
));
|
|
15
|
+
const matchToSearchResultFormat = (match, longestLineNumber) => {
|
|
16
|
+
const getLinePrefix = (i) => `${match.range().startLineNumber + i}`;
|
|
17
|
+
const fullMatchLines = match.fullPreviewLines();
|
|
18
|
+
const results = [];
|
|
19
|
+
fullMatchLines
|
|
20
|
+
.forEach((sourceLine, i) => {
|
|
21
|
+
const lineNumber = getLinePrefix(i);
|
|
22
|
+
const paddingStr = ' '.repeat(longestLineNumber - lineNumber.length);
|
|
23
|
+
const prefix = ` ${paddingStr}${lineNumber}: `;
|
|
24
|
+
const prefixOffset = prefix.length;
|
|
25
|
+
const line = prefix + (sourceLine.split(/\r?\n?$/, 1)[0] || '');
|
|
26
|
+
const rangeOnThisLine = ({ start, end }) => ( new Range(
|
|
27
|
+
1,
|
|
28
|
+
(start ?? 1) + prefixOffset,
|
|
29
|
+
1,
|
|
30
|
+
(end ?? sourceLine.length + 1) + prefixOffset
|
|
31
|
+
));
|
|
32
|
+
const matchRange = match.rangeInPreview();
|
|
33
|
+
const matchIsSingleLine = matchRange.startLineNumber === matchRange.endLineNumber;
|
|
34
|
+
let lineRange;
|
|
35
|
+
if (matchIsSingleLine) {
|
|
36
|
+
lineRange = (rangeOnThisLine({ start: matchRange.startColumn, end: matchRange.endColumn }));
|
|
37
|
+
}
|
|
38
|
+
else if (i === 0) {
|
|
39
|
+
lineRange = (rangeOnThisLine({ start: matchRange.startColumn }));
|
|
40
|
+
}
|
|
41
|
+
else if (i === fullMatchLines.length - 1) {
|
|
42
|
+
lineRange = (rangeOnThisLine({ end: matchRange.endColumn }));
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
lineRange = (rangeOnThisLine({}));
|
|
46
|
+
}
|
|
47
|
+
results.push({ lineNumber: lineNumber, line, ranges: [lineRange] });
|
|
48
|
+
});
|
|
49
|
+
return results;
|
|
50
|
+
};
|
|
51
|
+
function fileMatchToSearchResultFormat(fileMatch, labelFormatter) {
|
|
52
|
+
const textSerializations = fileMatch.textMatches().length > 0 ? matchesToSearchResultFormat(fileMatch.resource, fileMatch.textMatches().sort(searchMatchComparer), fileMatch.context, labelFormatter) : undefined;
|
|
53
|
+
const cellSerializations = ( fileMatch.cellMatches().sort((a, b) => a.cellIndex - b.cellIndex).sort().filter(cellMatch => cellMatch.contentMatches.length > 0).map(
|
|
54
|
+
(cellMatch, index) => cellMatchToSearchResultFormat(cellMatch, labelFormatter, index === 0)
|
|
55
|
+
));
|
|
56
|
+
return [textSerializations, ...cellSerializations].filter(x => !!x);
|
|
57
|
+
}
|
|
58
|
+
function matchesToSearchResultFormat(resource, sortedMatches, matchContext, labelFormatter, shouldUseHeader = true) {
|
|
59
|
+
const longestLineNumber = ( sortedMatches[sortedMatches.length - 1].range().endLineNumber.toString()).length;
|
|
60
|
+
const text = shouldUseHeader ? [`${labelFormatter(resource)}:`] : [];
|
|
61
|
+
const matchRanges = [];
|
|
62
|
+
const targetLineNumberToOffset = {};
|
|
63
|
+
const context = [];
|
|
64
|
+
matchContext.forEach((line, lineNumber) => context.push({ line, lineNumber }));
|
|
65
|
+
context.sort((a, b) => a.lineNumber - b.lineNumber);
|
|
66
|
+
let lastLine = undefined;
|
|
67
|
+
const seenLines = ( new Set());
|
|
68
|
+
sortedMatches.forEach(match => {
|
|
69
|
+
matchToSearchResultFormat(match, longestLineNumber).forEach(match => {
|
|
70
|
+
if (!( seenLines.has(match.lineNumber))) {
|
|
71
|
+
while (context.length && context[0].lineNumber < +match.lineNumber) {
|
|
72
|
+
const { line, lineNumber } = context.shift();
|
|
73
|
+
if (lastLine !== undefined && lineNumber !== lastLine + 1) {
|
|
74
|
+
text.push('');
|
|
75
|
+
}
|
|
76
|
+
text.push(` ${' '.repeat(longestLineNumber - `${lineNumber}`.length)}${lineNumber} ${line}`);
|
|
77
|
+
lastLine = lineNumber;
|
|
78
|
+
}
|
|
79
|
+
targetLineNumberToOffset[match.lineNumber] = text.length;
|
|
80
|
+
seenLines.add(match.lineNumber);
|
|
81
|
+
text.push(match.line);
|
|
82
|
+
lastLine = +match.lineNumber;
|
|
83
|
+
}
|
|
84
|
+
matchRanges.push(...( match.ranges.map(translateRangeLines(targetLineNumberToOffset[match.lineNumber]))));
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
while (context.length) {
|
|
88
|
+
const { line, lineNumber } = context.shift();
|
|
89
|
+
text.push(` ${lineNumber} ${line}`);
|
|
90
|
+
}
|
|
91
|
+
return { text, matchRanges };
|
|
92
|
+
}
|
|
93
|
+
function cellMatchToSearchResultFormat(cellMatch, labelFormatter, shouldUseHeader) {
|
|
94
|
+
return matchesToSearchResultFormat(cellMatch.cell?.uri ?? cellMatch.parent.resource, cellMatch.contentMatches.sort(searchMatchComparer), cellMatch.context, labelFormatter, shouldUseHeader);
|
|
95
|
+
}
|
|
96
|
+
const contentPatternToSearchConfiguration = (pattern, includes, excludes, contextLines) => {
|
|
97
|
+
return {
|
|
98
|
+
query: pattern.contentPattern.pattern,
|
|
99
|
+
isRegexp: !!pattern.contentPattern.isRegExp,
|
|
100
|
+
isCaseSensitive: !!pattern.contentPattern.isCaseSensitive,
|
|
101
|
+
matchWholeWord: !!pattern.contentPattern.isWordMatch,
|
|
102
|
+
filesToExclude: excludes, filesToInclude: includes,
|
|
103
|
+
showIncludesExcludes: !!(includes || excludes || pattern?.userDisabledExcludesAndIgnoreFiles),
|
|
104
|
+
useExcludeSettingsAndIgnoreFiles: (pattern?.userDisabledExcludesAndIgnoreFiles === undefined ? true : !pattern.userDisabledExcludesAndIgnoreFiles),
|
|
105
|
+
contextLines,
|
|
106
|
+
onlyOpenEditors: !!pattern.onlyOpenEditors,
|
|
107
|
+
notebookSearchConfig: {
|
|
108
|
+
includeMarkupInput: !!pattern.contentPattern.notebookInfo?.isInNotebookMarkdownInput,
|
|
109
|
+
includeMarkupPreview: !!pattern.contentPattern.notebookInfo?.isInNotebookMarkdownPreview,
|
|
110
|
+
includeCodeInput: !!pattern.contentPattern.notebookInfo?.isInNotebookCellInput,
|
|
111
|
+
includeOutput: !!pattern.contentPattern.notebookInfo?.isInNotebookCellOutput,
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
const serializeSearchConfiguration = (config) => {
|
|
116
|
+
const removeNullFalseAndUndefined = (a) => a.filter(a => a !== false && a !== null && a !== undefined);
|
|
117
|
+
const escapeNewlines = (str) => str.replace(/\\/g, '\\\\').replace(/\n/g, '\\n');
|
|
118
|
+
return removeNullFalseAndUndefined([
|
|
119
|
+
`# Query: ${escapeNewlines(config.query ?? '')}`,
|
|
120
|
+
(config.isCaseSensitive || config.matchWholeWord || config.isRegexp || config.useExcludeSettingsAndIgnoreFiles === false)
|
|
121
|
+
&& `# Flags: ${coalesce([
|
|
122
|
+
config.isCaseSensitive && 'CaseSensitive',
|
|
123
|
+
config.matchWholeWord && 'WordMatch',
|
|
124
|
+
config.isRegexp && 'RegExp',
|
|
125
|
+
config.onlyOpenEditors && 'OpenEditors',
|
|
126
|
+
(config.useExcludeSettingsAndIgnoreFiles === false) && 'IgnoreExcludeSettings'
|
|
127
|
+
]).join(' ')}`,
|
|
128
|
+
config.filesToInclude ? `# Including: ${config.filesToInclude}` : undefined,
|
|
129
|
+
config.filesToExclude ? `# Excluding: ${config.filesToExclude}` : undefined,
|
|
130
|
+
config.contextLines ? `# ContextLines: ${config.contextLines}` : undefined,
|
|
131
|
+
''
|
|
132
|
+
]).join(lineDelimiter);
|
|
133
|
+
};
|
|
134
|
+
const defaultSearchConfig = () => ({
|
|
135
|
+
query: '',
|
|
136
|
+
filesToInclude: '',
|
|
137
|
+
filesToExclude: '',
|
|
138
|
+
isRegexp: false,
|
|
139
|
+
isCaseSensitive: false,
|
|
140
|
+
useExcludeSettingsAndIgnoreFiles: true,
|
|
141
|
+
matchWholeWord: false,
|
|
142
|
+
contextLines: 0,
|
|
143
|
+
showIncludesExcludes: false,
|
|
144
|
+
onlyOpenEditors: false,
|
|
145
|
+
notebookSearchConfig: {
|
|
146
|
+
includeMarkupInput: true,
|
|
147
|
+
includeMarkupPreview: false,
|
|
148
|
+
includeCodeInput: true,
|
|
149
|
+
includeOutput: true,
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
const extractSearchQueryFromLines = (lines) => {
|
|
153
|
+
const query = defaultSearchConfig();
|
|
154
|
+
const unescapeNewlines = (str) => {
|
|
155
|
+
let out = '';
|
|
156
|
+
for (let i = 0; i < str.length; i++) {
|
|
157
|
+
if (str[i] === '\\') {
|
|
158
|
+
i++;
|
|
159
|
+
const escaped = str[i];
|
|
160
|
+
if (escaped === 'n') {
|
|
161
|
+
out += '\n';
|
|
162
|
+
}
|
|
163
|
+
else if (escaped === '\\') {
|
|
164
|
+
out += '\\';
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
throw Error(localizeWithPath('vs/workbench/contrib/searchEditor/browser/searchEditorSerialization', 'invalidQueryStringError', "All backslashes in Query string must be escaped (\\\\)"));
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
out += str[i];
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return out;
|
|
175
|
+
};
|
|
176
|
+
const parseYML = /^# ([^:]*): (.*)$/;
|
|
177
|
+
for (const line of lines) {
|
|
178
|
+
const parsed = parseYML.exec(line);
|
|
179
|
+
if (!parsed) {
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
const [, key, value] = parsed;
|
|
183
|
+
switch (key) {
|
|
184
|
+
case 'Query':
|
|
185
|
+
query.query = unescapeNewlines(value);
|
|
186
|
+
break;
|
|
187
|
+
case 'Including':
|
|
188
|
+
query.filesToInclude = value;
|
|
189
|
+
break;
|
|
190
|
+
case 'Excluding':
|
|
191
|
+
query.filesToExclude = value;
|
|
192
|
+
break;
|
|
193
|
+
case 'ContextLines':
|
|
194
|
+
query.contextLines = +value;
|
|
195
|
+
break;
|
|
196
|
+
case 'Flags': {
|
|
197
|
+
query.isRegexp = value.indexOf('RegExp') !== -1;
|
|
198
|
+
query.isCaseSensitive = value.indexOf('CaseSensitive') !== -1;
|
|
199
|
+
query.useExcludeSettingsAndIgnoreFiles = value.indexOf('IgnoreExcludeSettings') === -1;
|
|
200
|
+
query.matchWholeWord = value.indexOf('WordMatch') !== -1;
|
|
201
|
+
query.onlyOpenEditors = value.indexOf('OpenEditors') !== -1;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
query.showIncludesExcludes = !!(query.filesToInclude || query.filesToExclude || !query.useExcludeSettingsAndIgnoreFiles);
|
|
206
|
+
return query;
|
|
207
|
+
};
|
|
208
|
+
const serializeSearchResultForEditor = (searchResult, rawIncludePattern, rawExcludePattern, contextLines, labelFormatter, sortOrder, limitHit) => {
|
|
209
|
+
if (!searchResult.query) {
|
|
210
|
+
throw Error('Internal Error: Expected query, got null');
|
|
211
|
+
}
|
|
212
|
+
const config = contentPatternToSearchConfiguration(searchResult.query, rawIncludePattern, rawExcludePattern, contextLines);
|
|
213
|
+
const filecount = searchResult.fileCount() > 1 ? ( localizeWithPath(
|
|
214
|
+
'vs/workbench/contrib/searchEditor/browser/searchEditorSerialization',
|
|
215
|
+
'numFiles',
|
|
216
|
+
"{0} files",
|
|
217
|
+
searchResult.fileCount()
|
|
218
|
+
)) : ( localizeWithPath(
|
|
219
|
+
'vs/workbench/contrib/searchEditor/browser/searchEditorSerialization',
|
|
220
|
+
'oneFile',
|
|
221
|
+
"1 file"
|
|
222
|
+
));
|
|
223
|
+
const resultcount = searchResult.count() > 1 ? ( localizeWithPath(
|
|
224
|
+
'vs/workbench/contrib/searchEditor/browser/searchEditorSerialization',
|
|
225
|
+
'numResults',
|
|
226
|
+
"{0} results",
|
|
227
|
+
searchResult.count()
|
|
228
|
+
)) : ( localizeWithPath(
|
|
229
|
+
'vs/workbench/contrib/searchEditor/browser/searchEditorSerialization',
|
|
230
|
+
'oneResult',
|
|
231
|
+
"1 result"
|
|
232
|
+
));
|
|
233
|
+
const info = [
|
|
234
|
+
searchResult.count()
|
|
235
|
+
? `${resultcount} - ${filecount}`
|
|
236
|
+
: ( localizeWithPath(
|
|
237
|
+
'vs/workbench/contrib/searchEditor/browser/searchEditorSerialization',
|
|
238
|
+
'noResults',
|
|
239
|
+
"No Results"
|
|
240
|
+
)),
|
|
241
|
+
];
|
|
242
|
+
if (limitHit) {
|
|
243
|
+
info.push(( localizeWithPath(
|
|
244
|
+
'vs/workbench/contrib/searchEditor/browser/searchEditorSerialization',
|
|
245
|
+
'searchMaxResultsWarning',
|
|
246
|
+
"The result set only contains a subset of all matches. Be more specific in your search to narrow down the results."
|
|
247
|
+
)));
|
|
248
|
+
}
|
|
249
|
+
info.push('');
|
|
250
|
+
const matchComparer = (a, b) => searchMatchComparer(a, b, sortOrder);
|
|
251
|
+
const allResults = flattenSearchResultSerializations(flatten(( searchResult.folderMatches().sort(matchComparer)
|
|
252
|
+
.map(folderMatch => folderMatch.allDownstreamFileMatches().sort(matchComparer)
|
|
253
|
+
.flatMap(fileMatch => fileMatchToSearchResultFormat(fileMatch, labelFormatter))))));
|
|
254
|
+
return {
|
|
255
|
+
matchRanges: ( allResults.matchRanges.map(translateRangeLines(info.length))),
|
|
256
|
+
text: info.concat(allResults.text).join(lineDelimiter),
|
|
257
|
+
config
|
|
258
|
+
};
|
|
259
|
+
};
|
|
260
|
+
const flattenSearchResultSerializations = (serializations) => {
|
|
261
|
+
const text = [];
|
|
262
|
+
const matchRanges = [];
|
|
263
|
+
serializations.forEach(serialized => {
|
|
264
|
+
( serialized.matchRanges.map(translateRangeLines(text.length))).forEach(range => matchRanges.push(range));
|
|
265
|
+
serialized.text.forEach(line => text.push(line));
|
|
266
|
+
text.push('');
|
|
267
|
+
});
|
|
268
|
+
return { text, matchRanges };
|
|
269
|
+
};
|
|
270
|
+
const parseSavedSearchEditor = async (accessor, resource) => {
|
|
271
|
+
const textFileService = accessor.get(ITextFileService);
|
|
272
|
+
const text = (await textFileService.read(resource)).value;
|
|
273
|
+
return parseSerializedSearchEditor(text);
|
|
274
|
+
};
|
|
275
|
+
const parseSerializedSearchEditor = (text) => {
|
|
276
|
+
const headerlines = [];
|
|
277
|
+
const bodylines = [];
|
|
278
|
+
let inHeader = true;
|
|
279
|
+
for (const line of text.split(/\r?\n/g)) {
|
|
280
|
+
if (inHeader) {
|
|
281
|
+
headerlines.push(line);
|
|
282
|
+
if (line === '') {
|
|
283
|
+
inHeader = false;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
bodylines.push(line);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return { config: extractSearchQueryFromLines(headerlines), text: bodylines.join('\n') };
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
export { defaultSearchConfig, extractSearchQueryFromLines, parseSavedSearchEditor, parseSerializedSearchEditor, serializeSearchConfiguration, serializeSearchResultForEditor };
|