( isDelimiterNode: (node: SyntaxNode) => boolean, defaultDelimiter: string, getStartNode: (node: SyntaxNode) => SyntaxNode = identity, getEndNode: (node: SyntaxNode) => SyntaxNode = identity )
| 236 | * @returns A selection extractor |
| 237 | */ |
| 238 | export 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, |
no test coverage detected