diff --git a/extensions/markdown-language-features/src/features/smartSelect.ts b/extensions/markdown-language-features/src/features/smartSelect.ts index 9516abba8f705fe44e829bb6dd5ef113736bb547..2fd483edf7dd1c6b368d48fc2002347a0a6d6bf4 100644 --- a/extensions/markdown-language-features/src/features/smartSelect.ts +++ b/extensions/markdown-language-features/src/features/smartSelect.ts @@ -112,34 +112,11 @@ function createBlockRange(block: Token, document: vscode.TextDocument, cursorLin } else if (isList(block) && document.lineAt(endLine).isEmptyOrWhitespace) { endLine = endLine - 1; } - const startPos = new vscode.Position(startLine, 0); - const endPos = new vscode.Position(endLine, document.lineAt(endLine).text?.length ?? 0); - const range = new vscode.Range(startPos, endPos); - if (parent && parent.range.contains(range) && !parent.range.isEqual(range)) { + const range = new vscode.Range(startLine, 0, endLine, document.lineAt(endLine).text?.length ?? 0); + if (parent?.range.contains(range) && !parent.range.isEqual(range)) { return new vscode.SelectionRange(range, parent); } else if (parent?.range.isEqual(range)) { return parent; - } else if (parent) { - // parent doesn't contain range - if (rangeLinesEqual(range, parent.range)) { - return range.end.character > parent.range.end.character ? new vscode.SelectionRange(range) : parent; - } else if (parent.range.end.line + 1 === range.end.line) { - const adjustedRange = new vscode.Range(range.start, range.end.translate(-1, parent.range.end.character)); - if (adjustedRange.isEqual(parent.range)) { - return parent; - } else { - return new vscode.SelectionRange(adjustedRange, parent); - } - } else if (parent.range.end.line === range.end.line) { - const adjustedRange = new vscode.Range(parent.range.start, range.end.translate(undefined, range.end.character)); - if (adjustedRange.isEqual(parent.range)) { - return parent; - } else { - return new vscode.SelectionRange(adjustedRange, parent.parent); - } - } else { - return parent; - } } else { return new vscode.SelectionRange(range); } @@ -150,36 +127,17 @@ function createFencedRange(token: Token, cursorLine: number, document: vscode.Te const startLine = token.map[0]; const endLine = token.map[1] - 1; const onFenceLine = cursorLine === startLine || cursorLine === endLine; - const fenceRange = new vscode.Range(new vscode.Position(startLine, 0), new vscode.Position(endLine, document.lineAt(endLine).text.length)); - const contentRange = endLine - startLine > 2 && !onFenceLine ? new vscode.Range(new vscode.Position(startLine + 1, 0), new vscode.Position(endLine - 1, document.lineAt(endLine - 1).text.length)) : undefined; - if (parent && contentRange) { - if (parent.range.contains(fenceRange) && !parent.range.isEqual(fenceRange)) { - return new vscode.SelectionRange(contentRange, new vscode.SelectionRange(fenceRange, parent)); - } else if (parent.range.isEqual(fenceRange)) { - return new vscode.SelectionRange(contentRange, parent); - } else if (rangeLinesEqual(fenceRange, parent.range)) { - const revisedRange = fenceRange.end.character > parent.range.end.character ? fenceRange : parent.range; - return new vscode.SelectionRange(contentRange, new vscode.SelectionRange(revisedRange, getRealParent(parent, revisedRange))); - } else if (parent.range.end.line === fenceRange.end.line) { - parent.range.end.translate(undefined, fenceRange.end.character); - return new vscode.SelectionRange(contentRange, new vscode.SelectionRange(fenceRange, parent)); - } - } else if (contentRange) { - return new vscode.SelectionRange(contentRange, new vscode.SelectionRange(fenceRange)); - } else if (parent) { - if (parent.range.contains(fenceRange) && !parent.range.isEqual(fenceRange)) { - return new vscode.SelectionRange(fenceRange, parent); - } else if (parent.range.isEqual(fenceRange)) { + const fenceRange = new vscode.Range(startLine, 0, endLine, document.lineAt(endLine).text.length); + const contentRange = endLine - startLine > 2 && !onFenceLine ? new vscode.Range(startLine + 1, 0, endLine - 1, document.lineAt(endLine - 1).text.length) : undefined; + if (contentRange) { + return new vscode.SelectionRange(contentRange, new vscode.SelectionRange(fenceRange, parent)); + } else { + if (parent?.range.isEqual(fenceRange)) { return parent; - } else if (rangeLinesEqual(fenceRange, parent.range)) { - const revisedRange = fenceRange.end.character > parent.range.end.character ? fenceRange : parent.range; - return new vscode.SelectionRange(revisedRange, parent.parent); - } else if (parent.range.end.line === fenceRange.end.line) { - parent.range.end.translate(undefined, fenceRange.end.character); + } else { return new vscode.SelectionRange(fenceRange, parent); } } - return new vscode.SelectionRange(fenceRange, parent); } function isList(token: Token): boolean { @@ -190,14 +148,6 @@ function isBlockElement(token: Token): boolean { return !['list_item_close', 'paragraph_close', 'bullet_list_close', 'inline', 'heading_close', 'heading_open'].includes(token.type); } -function getRealParent(parent: vscode.SelectionRange, range: vscode.Range) { - let currentParent: vscode.SelectionRange | undefined = parent; - while (currentParent && !currentParent.range.contains(range)) { - currentParent = currentParent.parent; - } - return currentParent; -} - function getFirstChildHeader(document: vscode.TextDocument, header?: TocEntry, toc?: TocEntry[]): vscode.Position | undefined { let childRange: vscode.Position | undefined; if (header && toc) { @@ -210,7 +160,3 @@ function getFirstChildHeader(document: vscode.TextDocument, header?: TocEntry, t } return undefined; } - -function rangeLinesEqual(range: vscode.Range, parent: vscode.Range) { - return range.start.line === parent.start.line && range.end.line === parent.end.line; -} diff --git a/extensions/markdown-language-features/src/test/smartSelect.test.ts b/extensions/markdown-language-features/src/test/smartSelect.test.ts index 3849f47cb19c7272091df94cec4c8d9f7e5e7946..df2efba5e03c9881a0d974bbb0dd4a212d16557a 100644 --- a/extensions/markdown-language-features/src/test/smartSelect.test.ts +++ b/extensions/markdown-language-features/src/test/smartSelect.test.ts @@ -335,7 +335,7 @@ suite('markdown.SmartSelect', () => { `- content 2`, `- content 2`)); - assertNestedLineNumbersEqual(ranges![0], [9, 11], [8, 12], [7, 17], [1, 17], [0, 17]); + assertNestedLineNumbersEqual(ranges![0], [9, 11], [8, 12], [8, 12], [7, 17], [1, 17], [0, 17]); }); test('Smart select fenced code block then list then rest of content on fenced line', async () => { const ranges = await getSelectionRangesForDocument(