MCPcopy Create free account
hub / github.com/cursorless-dev/cursorless / delimitedSelector

Function delimitedSelector

src/util/nodeSelectors.ts:238–302  ·  view source on GitHub ↗
(
  isDelimiterNode: (node: SyntaxNode) => boolean,
  defaultDelimiter: string,
  getStartNode: (node: SyntaxNode) => SyntaxNode = identity,
  getEndNode: (node: SyntaxNode) => SyntaxNode = identity
)

Source from the content-addressed store, hash-verified

236 * @returns A selection extractor
237 */
238export function delimitedSelector(
239 isDelimiterNode: (node: SyntaxNode) => boolean,
240 defaultDelimiter: string,
241 getStartNode: (node: SyntaxNode) => SyntaxNode = identity,
242 getEndNode: (node: SyntaxNode) => SyntaxNode = identity
243): SelectionExtractor {
244 return (editor: TextEditor, node: SyntaxNode) => {
245 let containingListDelimiter: string | null = null;
246 let leadingDelimiterRange: Range | null = null;
247 let trailingDelimiterRange: Range | null = null;
248 const startNode = getStartNode(node);
249 const endNode = getEndNode(node);
250
251 const nextNonDelimiterNode = getNextNonDelimiterNode(
252 endNode,
253 isDelimiterNode
254 );
255 const previousNonDelimiterNode = getPreviousNonDelimiterNode(
256 startNode,
257 isDelimiterNode
258 );
259
260 if (nextNonDelimiterNode != null) {
261 trailingDelimiterRange = makeRangeFromPositions(
262 endNode.endPosition,
263 nextNonDelimiterNode.startPosition
264 );
265
266 containingListDelimiter = editor.document.getText(trailingDelimiterRange);
267 }
268
269 if (previousNonDelimiterNode != null) {
270 leadingDelimiterRange = makeRangeFromPositions(
271 previousNonDelimiterNode.endPosition,
272 startNode.startPosition
273 );
274
275 if (containingListDelimiter == null) {
276 containingListDelimiter = editor.document.getText(
277 leadingDelimiterRange
278 );
279 }
280 }
281
282 if (containingListDelimiter == null) {
283 containingListDelimiter = defaultDelimiter;
284 }
285
286 return {
287 selection: new Selection(
288 new Position(
289 startNode.startPosition.row,
290 startNode.startPosition.column
291 ),
292 new Position(endNode.endPosition.row, endNode.endPosition.column)
293 ),
294 context: {
295 isInDelimitedList: true,

Callers 5

makeDelimitedSelectorFunction · 0.90
csharp.tsFile · 0.90
clojure.tsFile · 0.90
delimitersSelectorFunction · 0.85

Calls 3

getNextNonDelimiterNodeFunction · 0.85
makeRangeFromPositionsFunction · 0.85

Tested by

no test coverage detected