From 0b786e9a54574f74e53ef8e8b12df11dabf5b550 Mon Sep 17 00:00:00 2001 From: Pokey Rule <755842+pokey@users.noreply.github.com> Date: Tue, 7 Jun 2022 19:42:23 +0100 Subject: [PATCH 01/13] Fit interior range to content --- src/processTargets/targets/DocumentTarget.ts | 39 ++----------- src/processTargets/targets/InteriorTarget.ts | 22 +++++++ .../targets/SurroundingPairTarget.ts | 4 +- .../recorded/surroundingPair/chuckCore.yml | 29 ++++++++++ .../recorded/surroundingPair/chuckCore2.yml | 25 ++++++++ .../{clearMatching9.yml => clearInside.yml} | 6 +- .../parseTree/typescript/takeCore.yml | 8 +-- .../recorded/surroundingPair/takeCore.yml | 33 +++++++++++ .../recorded/surroundingPair/takeCore2.yml | 25 ++++++++ src/util/selectionUtils.ts | 57 ++++++++++++++++++- 10 files changed, 206 insertions(+), 42 deletions(-) create mode 100644 src/processTargets/targets/InteriorTarget.ts create mode 100644 src/test/suite/fixtures/recorded/surroundingPair/chuckCore.yml create mode 100644 src/test/suite/fixtures/recorded/surroundingPair/chuckCore2.yml rename src/test/suite/fixtures/recorded/surroundingPair/parseTree/python/{clearMatching9.yml => clearInside.yml} (91%) create mode 100644 src/test/suite/fixtures/recorded/surroundingPair/takeCore.yml create mode 100644 src/test/suite/fixtures/recorded/surroundingPair/takeCore2.yml diff --git a/src/processTargets/targets/DocumentTarget.ts b/src/processTargets/targets/DocumentTarget.ts index 7df946566c..4379e55081 100644 --- a/src/processTargets/targets/DocumentTarget.ts +++ b/src/processTargets/targets/DocumentTarget.ts @@ -1,7 +1,7 @@ -import { Range, TextEditor } from "vscode"; -import { fitRangeToLineContent } from "../modifiers/scopeTypeStages/LineStage"; +import { Range } from "vscode"; +import { shrinkRangeToFitContent } from "../../util/selectionUtils"; import BaseTarget, { CommonTargetParameters } from "./BaseTarget"; -import WeakTarget from "./WeakTarget"; +import PlainTarget from "./PlainTarget"; export default class DocumentTarget extends BaseTarget { insertionDelimiter = "\n"; @@ -23,10 +23,11 @@ export default class DocumentTarget extends BaseTarget { getInteriorStrict() { return [ - new WeakTarget({ + // Use plain target instead of interior target since we want the same content and removal range for a document interior. + new PlainTarget({ editor: this.editor, isReversed: this.isReversed, - contentRange: getDocumentContentRange(this.editor), + contentRange: shrinkRangeToFitContent(this.editor, this.contentRange), }), ]; } @@ -35,31 +36,3 @@ export default class DocumentTarget extends BaseTarget { return this.state; } } - -function getDocumentContentRange(editor: TextEditor) { - const { document } = editor; - let firstLineNum = 0; - let lastLineNum = document.lineCount - 1; - - for (let i = firstLineNum; i < document.lineCount; ++i) { - if (!document.lineAt(i).isEmptyOrWhitespace) { - firstLineNum = i; - break; - } - } - - for (let i = lastLineNum; i > -1; --i) { - if (!document.lineAt(i).isEmptyOrWhitespace) { - lastLineNum = i; - break; - } - } - - const firstLine = document.lineAt(firstLineNum); - const lastLine = document.lineAt(lastLineNum); - - return fitRangeToLineContent( - editor, - new Range(firstLine.range.start, lastLine.range.end) - ); -} diff --git a/src/processTargets/targets/InteriorTarget.ts b/src/processTargets/targets/InteriorTarget.ts new file mode 100644 index 0000000000..23896682fb --- /dev/null +++ b/src/processTargets/targets/InteriorTarget.ts @@ -0,0 +1,22 @@ +import { shrinkRangeToFitContent } from "../../util/selectionUtils"; +import BaseTarget, { CommonTargetParameters } from "./BaseTarget"; + +export default class InteriorTarget extends BaseTarget { + insertionDelimiter = ""; + + constructor(parameters: CommonTargetParameters) { + super(parameters); + } + + get contentRange() { + return shrinkRangeToFitContent(this.editor, this.state.contentRange); + } + + getLeadingDelimiterTarget = () => undefined; + getTrailingDelimiterTarget = () => undefined; + getRemovalRange = () => this.state.contentRange; + + protected getCloneParameters() { + return this.state; + } +} diff --git a/src/processTargets/targets/SurroundingPairTarget.ts b/src/processTargets/targets/SurroundingPairTarget.ts index c3bc151d74..e518f238e1 100644 --- a/src/processTargets/targets/SurroundingPairTarget.ts +++ b/src/processTargets/targets/SurroundingPairTarget.ts @@ -6,8 +6,8 @@ import { getTokenTrailingDelimiterTarget, } from "../targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior"; import BaseTarget, { CommonTargetParameters } from "./BaseTarget"; +import InteriorTarget from "./InteriorTarget"; import TokenTarget from "./TokenTarget"; -import WeakTarget from "./WeakTarget"; interface SurroundingPairTargetParameters extends CommonTargetParameters { /** @@ -48,7 +48,7 @@ export default class SurroundingPairTarget extends BaseTarget { getInteriorStrict() { return [ - new WeakTarget({ + new InteriorTarget({ editor: this.editor, isReversed: this.isReversed, contentRange: this.interiorRange_, diff --git a/src/test/suite/fixtures/recorded/surroundingPair/chuckCore.yml b/src/test/suite/fixtures/recorded/surroundingPair/chuckCore.yml new file mode 100644 index 0000000000..95daa00b2f --- /dev/null +++ b/src/test/suite/fixtures/recorded/surroundingPair/chuckCore.yml @@ -0,0 +1,29 @@ +languageId: typescript +command: + spokenForm: chuck core + version: 2 + targets: + - type: primitive + modifiers: + - {type: interiorOnly} + usePrePhraseSnapshot: true + action: {name: remove} +initialState: + documentContents: |- + [ + "foo", + "bar" + ] + selections: + - anchor: {line: 1, character: 10} + active: {line: 1, character: 10} + marks: {} +finalState: + documentContents: "[]" + selections: + - anchor: {line: 0, character: 1} + active: {line: 0, character: 1} + thatMark: + - anchor: {line: 0, character: 1} + active: {line: 0, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, modifiers: [{type: interiorOnly}]}] diff --git a/src/test/suite/fixtures/recorded/surroundingPair/chuckCore2.yml b/src/test/suite/fixtures/recorded/surroundingPair/chuckCore2.yml new file mode 100644 index 0000000000..ba6fc0f9ed --- /dev/null +++ b/src/test/suite/fixtures/recorded/surroundingPair/chuckCore2.yml @@ -0,0 +1,25 @@ +languageId: plaintext +command: + spokenForm: chuck core + version: 2 + targets: + - type: primitive + modifiers: + - {type: interiorOnly} + usePrePhraseSnapshot: true + action: {name: remove} +initialState: + documentContents: ( hello ) + selections: + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} + marks: {} +finalState: + documentContents: () + selections: + - anchor: {line: 0, character: 1} + active: {line: 0, character: 1} + thatMark: + - anchor: {line: 0, character: 1} + active: {line: 0, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, modifiers: [{type: interiorOnly}]}] diff --git a/src/test/suite/fixtures/recorded/surroundingPair/parseTree/python/clearMatching9.yml b/src/test/suite/fixtures/recorded/surroundingPair/parseTree/python/clearInside.yml similarity index 91% rename from src/test/suite/fixtures/recorded/surroundingPair/parseTree/python/clearMatching9.yml rename to src/test/suite/fixtures/recorded/surroundingPair/parseTree/python/clearInside.yml index c034896041..4a6692ff58 100644 --- a/src/test/suite/fixtures/recorded/surroundingPair/parseTree/python/clearMatching9.yml +++ b/src/test/suite/fixtures/recorded/surroundingPair/parseTree/python/clearInside.yml @@ -1,7 +1,7 @@ languageId: python command: version: 1 - spokenForm: clear matching + spokenForm: clear inside action: clearAndSetSelection targets: - type: primitive @@ -17,7 +17,9 @@ initialState: active: {line: 1, character: 0} marks: {} finalState: - documentContents: "\"\"\"\"\"\"" + documentContents: |- + """ + """ selections: - anchor: {line: 0, character: 3} active: {line: 0, character: 3} diff --git a/src/test/suite/fixtures/recorded/surroundingPair/parseTree/typescript/takeCore.yml b/src/test/suite/fixtures/recorded/surroundingPair/parseTree/typescript/takeCore.yml index cf8ae2f724..11382b9bb1 100644 --- a/src/test/suite/fixtures/recorded/surroundingPair/parseTree/typescript/takeCore.yml +++ b/src/test/suite/fixtures/recorded/surroundingPair/parseTree/typescript/takeCore.yml @@ -29,9 +29,9 @@ finalState: ) } selections: - - anchor: {line: 1, character: 45} - active: {line: 3, character: 4} + - anchor: {line: 2, character: 4} + active: {line: 2, character: 30} thatMark: - - anchor: {line: 1, character: 45} - active: {line: 3, character: 4} + - anchor: {line: 2, character: 4} + active: {line: 2, character: 30} fullTargets: [{type: primitive, mark: {type: cursor}, modifiers: [{type: containingScope, scopeType: {type: surroundingPair, delimiter: any}}, {type: interiorOnly}]}] diff --git a/src/test/suite/fixtures/recorded/surroundingPair/takeCore.yml b/src/test/suite/fixtures/recorded/surroundingPair/takeCore.yml new file mode 100644 index 0000000000..516048dcd8 --- /dev/null +++ b/src/test/suite/fixtures/recorded/surroundingPair/takeCore.yml @@ -0,0 +1,33 @@ +languageId: typescript +command: + spokenForm: take core + version: 2 + targets: + - type: primitive + modifiers: + - {type: interiorOnly} + usePrePhraseSnapshot: true + action: {name: setSelection} +initialState: + documentContents: |- + [ + "foo", + "bar" + ] + selections: + - anchor: {line: 1, character: 10} + active: {line: 1, character: 10} + marks: {} +finalState: + documentContents: |- + [ + "foo", + "bar" + ] + selections: + - anchor: {line: 1, character: 4} + active: {line: 2, character: 9} + thatMark: + - anchor: {line: 1, character: 4} + active: {line: 2, character: 9} +fullTargets: [{type: primitive, mark: {type: cursor}, modifiers: [{type: interiorOnly}]}] diff --git a/src/test/suite/fixtures/recorded/surroundingPair/takeCore2.yml b/src/test/suite/fixtures/recorded/surroundingPair/takeCore2.yml new file mode 100644 index 0000000000..6e978c8f4e --- /dev/null +++ b/src/test/suite/fixtures/recorded/surroundingPair/takeCore2.yml @@ -0,0 +1,25 @@ +languageId: plaintext +command: + spokenForm: take core + version: 2 + targets: + - type: primitive + modifiers: + - {type: interiorOnly} + usePrePhraseSnapshot: true + action: {name: setSelection} +initialState: + documentContents: ( hello ) + selections: + - anchor: {line: 0, character: 6} + active: {line: 0, character: 6} + marks: {} +finalState: + documentContents: ( hello ) + selections: + - anchor: {line: 0, character: 2} + active: {line: 0, character: 7} + thatMark: + - anchor: {line: 0, character: 2} + active: {line: 0, character: 7} +fullTargets: [{type: primitive, mark: {type: cursor}, modifiers: [{type: interiorOnly}]}] diff --git a/src/util/selectionUtils.ts b/src/util/selectionUtils.ts index 8e443b0ef4..158378ac93 100644 --- a/src/util/selectionUtils.ts +++ b/src/util/selectionUtils.ts @@ -1,4 +1,4 @@ -import { Position, Range, Selection } from "vscode"; +import { Position, Range, Selection, TextEditor } from "vscode"; import { SelectionWithEditor } from "../typings/Types"; export function isForward(selection: Selection) { @@ -42,3 +42,58 @@ export function selectionFromRange(isReversed: boolean, range: Range) { const { start, end } = range; return isReversed ? new Selection(end, start) : new Selection(start, end); } + +export function shrinkRangeToFitContent(editor: TextEditor, range: Range) { + const { lineAt } = editor.document; + + const start = (() => { + const firstLine = lineAt(range.start); + const text = firstLine.text.substring(range.start.character); + if (text.trim().length === 0) { + for (let i = firstLine.lineNumber + 1; i <= range.end.line; ++i) { + const line = lineAt(i); + if (!line.isEmptyOrWhitespace) { + return new Position(i, line.firstNonWhitespaceCharacterIndex); + } + } + return range.start; + } + return new Position( + firstLine.lineNumber, + firstNonWhitespaceCharacterIndex(range, text) + ); + })(); + + const end = (() => { + const endLine = lineAt(range.end); + const text = endLine.text.substring(0, range.end.character); + if (text.trim().length === 0) { + for (let i = endLine.lineNumber - 1; i >= range.start.line; --i) { + const line = lineAt(i); + if (!line.isEmptyOrWhitespace) { + return new Position( + i, + lastNonWhitespaceCharacterIndex(line.range, line.text) + ); + } + } + return range.end; + } + return new Position( + endLine.lineNumber, + lastNonWhitespaceCharacterIndex(range, text) + ); + })(); + + return new Range(start, end); +} + +function firstNonWhitespaceCharacterIndex(range: Range, text: string) { + const characterDelta = text.length - text.trimStart().length; + return range.start.character + characterDelta; +} + +function lastNonWhitespaceCharacterIndex(range: Range, text: string) { + const characterDelta = text.length - text.trimEnd().length; + return range.end.character - characterDelta; +} From 0336b56c9a2a43dbb8ebc6a0ca2912dfea4577a0 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Mon, 13 Jun 2022 11:22:14 +0200 Subject: [PATCH 02/13] Updated shrink range to fit content --- src/util/selectionUtils.ts | 59 ++++++-------------------------------- 1 file changed, 8 insertions(+), 51 deletions(-) diff --git a/src/util/selectionUtils.ts b/src/util/selectionUtils.ts index 158378ac93..a1dadde4a6 100644 --- a/src/util/selectionUtils.ts +++ b/src/util/selectionUtils.ts @@ -44,56 +44,13 @@ export function selectionFromRange(isReversed: boolean, range: Range) { } export function shrinkRangeToFitContent(editor: TextEditor, range: Range) { - const { lineAt } = editor.document; - - const start = (() => { - const firstLine = lineAt(range.start); - const text = firstLine.text.substring(range.start.character); - if (text.trim().length === 0) { - for (let i = firstLine.lineNumber + 1; i <= range.end.line; ++i) { - const line = lineAt(i); - if (!line.isEmptyOrWhitespace) { - return new Position(i, line.firstNonWhitespaceCharacterIndex); - } - } - return range.start; - } - return new Position( - firstLine.lineNumber, - firstNonWhitespaceCharacterIndex(range, text) - ); - })(); - - const end = (() => { - const endLine = lineAt(range.end); - const text = endLine.text.substring(0, range.end.character); - if (text.trim().length === 0) { - for (let i = endLine.lineNumber - 1; i >= range.start.line; --i) { - const line = lineAt(i); - if (!line.isEmptyOrWhitespace) { - return new Position( - i, - lastNonWhitespaceCharacterIndex(line.range, line.text) - ); - } - } - return range.end; - } - return new Position( - endLine.lineNumber, - lastNonWhitespaceCharacterIndex(range, text) - ); - })(); - + const { document } = editor; + const text = document.getText(range); + const startDelta = text.length - text.trimStart().length; + const endDelta = text.length - text.trimEnd().length; + const startOffset = document.offsetAt(range.start) + startDelta; + const endOffset = document.offsetAt(range.end) - endDelta; + const start = document.positionAt(startOffset); + const end = document.positionAt(endOffset); return new Range(start, end); } - -function firstNonWhitespaceCharacterIndex(range: Range, text: string) { - const characterDelta = text.length - text.trimStart().length; - return range.start.character + characterDelta; -} - -function lastNonWhitespaceCharacterIndex(range: Range, text: string) { - const characterDelta = text.length - text.trimEnd().length; - return range.end.character - characterDelta; -} From 53c0264aa4242ee204a58353cd76c73e77a95951 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Mon, 13 Jun 2022 12:26:23 +0200 Subject: [PATCH 03/13] Added a lfcr test --- .../lineEndings/clearCoreFileLFCR.yml | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/test/suite/fixtures/recorded/lineEndings/clearCoreFileLFCR.yml diff --git a/src/test/suite/fixtures/recorded/lineEndings/clearCoreFileLFCR.yml b/src/test/suite/fixtures/recorded/lineEndings/clearCoreFileLFCR.yml new file mode 100644 index 0000000000..9021d73122 --- /dev/null +++ b/src/test/suite/fixtures/recorded/lineEndings/clearCoreFileLFCR.yml @@ -0,0 +1,27 @@ +languageId: plaintext +command: + spokenForm: clear core file + version: 2 + targets: + - type: primitive + modifiers: + - {type: interiorOnly} + - type: containingScope + scopeType: {type: document} + usePrePhraseSnapshot: true + action: {name: clearAndSetSelection} +initialState: + documentContents: "\r\n abc \r\n" + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} + marks: {} +finalState: + documentContents: "\r\n \r\n" + selections: + - anchor: {line: 1, character: 1} + active: {line: 1, character: 1} + thatMark: + - anchor: {line: 1, character: 1} + active: {line: 1, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, modifiers: [{type: interiorOnly}, {type: containingScope, scopeType: {type: document}}]}] From 07a6298d1dd55479afc042cb7f050d2485deded3 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Mon, 13 Jun 2022 14:12:26 +0200 Subject: [PATCH 04/13] Added dock string --- src/util/selectionUtils.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/util/selectionUtils.ts b/src/util/selectionUtils.ts index a1dadde4a6..7d83c3d90f 100644 --- a/src/util/selectionUtils.ts +++ b/src/util/selectionUtils.ts @@ -43,6 +43,13 @@ export function selectionFromRange(isReversed: boolean, range: Range) { return isReversed ? new Selection(end, start) : new Selection(start, end); } +/** + * Shrink given range to fit text content. + * If the given range has no text content the given range will be returned unchanged. + * @param editor The text editor to use + * @param range The range to shrink down + * @returns A new range equal or smaller to the given range + */ export function shrinkRangeToFitContent(editor: TextEditor, range: Range) { const { document } = editor; const text = document.getText(range); From 49cdcdd20c253d7f7590b6486c73246c4df2dded Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Mon, 20 Jun 2022 20:31:29 +0200 Subject: [PATCH 05/13] Added argument full interior range to interior target --- src/processTargets/targets/BaseTarget.ts | 2 +- src/processTargets/targets/InteriorTarget.ts | 29 ++++++++++++++----- .../targets/SurroundingPairTarget.ts | 2 +- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/processTargets/targets/BaseTarget.ts b/src/processTargets/targets/BaseTarget.ts index 58ea6f4573..e4e16c29f3 100644 --- a/src/processTargets/targets/BaseTarget.ts +++ b/src/processTargets/targets/BaseTarget.ts @@ -11,7 +11,7 @@ import { createContinuousRangeWeakTarget, } from "../targetUtil/createContinuousRange"; -/** Parameters supported by all target classes */ +/** Parameters supported by most target classes */ export interface CommonTargetParameters { readonly editor: TextEditor; readonly isReversed: boolean; diff --git a/src/processTargets/targets/InteriorTarget.ts b/src/processTargets/targets/InteriorTarget.ts index 23896682fb..bf41916bda 100644 --- a/src/processTargets/targets/InteriorTarget.ts +++ b/src/processTargets/targets/InteriorTarget.ts @@ -1,22 +1,35 @@ +import { Range } from "vscode"; import { shrinkRangeToFitContent } from "../../util/selectionUtils"; import BaseTarget, { CommonTargetParameters } from "./BaseTarget"; +export interface InteriorTargetParameters + extends Omit { + readonly fullInteriorRange: Range; +} + export default class InteriorTarget extends BaseTarget { insertionDelimiter = ""; + private readonly fullInteriorRange: Range; - constructor(parameters: CommonTargetParameters) { - super(parameters); - } - - get contentRange() { - return shrinkRangeToFitContent(this.editor, this.state.contentRange); + constructor(parameters: InteriorTargetParameters) { + super({ + ...parameters, + contentRange: shrinkRangeToFitContent( + parameters.editor, + parameters.fullInteriorRange + ), + }); + this.fullInteriorRange = parameters.fullInteriorRange; } getLeadingDelimiterTarget = () => undefined; getTrailingDelimiterTarget = () => undefined; - getRemovalRange = () => this.state.contentRange; + getRemovalRange = () => this.fullInteriorRange; protected getCloneParameters() { - return this.state; + return { + ...this.state, + fullInteriorRange: this.fullInteriorRange, + }; } } diff --git a/src/processTargets/targets/SurroundingPairTarget.ts b/src/processTargets/targets/SurroundingPairTarget.ts index e518f238e1..d089bad289 100644 --- a/src/processTargets/targets/SurroundingPairTarget.ts +++ b/src/processTargets/targets/SurroundingPairTarget.ts @@ -51,7 +51,7 @@ export default class SurroundingPairTarget extends BaseTarget { new InteriorTarget({ editor: this.editor, isReversed: this.isReversed, - contentRange: this.interiorRange_, + fullInteriorRange: this.interiorRange_, }), ]; } From a6f49300ef152f2523f5f1738991883a45efe2a1 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Mon, 20 Jun 2022 20:45:02 +0200 Subject: [PATCH 06/13] Updated test --- .../recorded/selectionTypes/clearHeadCoreCurly.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/test/suite/fixtures/recorded/selectionTypes/clearHeadCoreCurly.yml b/src/test/suite/fixtures/recorded/selectionTypes/clearHeadCoreCurly.yml index eba314f3a4..02ac7443c1 100644 --- a/src/test/suite/fixtures/recorded/selectionTypes/clearHeadCoreCurly.yml +++ b/src/test/suite/fixtures/recorded/selectionTypes/clearHeadCoreCurly.yml @@ -23,12 +23,13 @@ initialState: marks: {} finalState: documentContents: |- - {z) + { + z) } selections: - - anchor: {line: 0, character: 1} - active: {line: 0, character: 1} + - anchor: {line: 1, character: 4} + active: {line: 1, character: 4} thatMark: - - anchor: {line: 0, character: 1} - active: {line: 0, character: 1} + - anchor: {line: 1, character: 4} + active: {line: 1, character: 4} fullTargets: [{type: primitive, mark: {type: cursor}, modifiers: [{type: extendThroughStartOf, modifiers: [{type: interiorOnly}, {type: containingScope, scopeType: {type: surroundingPair, delimiter: curlyBrackets}}]}]}] From 744536f082b1367392d9fd35158ffa9fd5d04372 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Mon, 20 Jun 2022 20:45:44 +0200 Subject: [PATCH 07/13] Cleanup --- src/processTargets/modifiers/HeadTailStage.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/processTargets/modifiers/HeadTailStage.ts b/src/processTargets/modifiers/HeadTailStage.ts index 1b246a436b..74babdd55b 100644 --- a/src/processTargets/modifiers/HeadTailStage.ts +++ b/src/processTargets/modifiers/HeadTailStage.ts @@ -1,4 +1,4 @@ -import { Range, TextEditor } from "vscode"; +import { Range } from "vscode"; import { Target } from "../../typings/target.types"; import { HeadTailModifier, From 8ab34dd105b6e6cefa5305c46c371757b75d3968 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Tue, 21 Jun 2022 08:18:19 +0200 Subject: [PATCH 08/13] Update src/util/selectionUtils.ts Co-authored-by: Pokey Rule <755842+pokey@users.noreply.github.com> --- src/util/selectionUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/selectionUtils.ts b/src/util/selectionUtils.ts index 7d83c3d90f..8f524c3108 100644 --- a/src/util/selectionUtils.ts +++ b/src/util/selectionUtils.ts @@ -44,7 +44,7 @@ export function selectionFromRange(isReversed: boolean, range: Range) { } /** - * Shrink given range to fit text content. + * Return a copy of {@link range} excluding any leading or trailing whitespace. * If the given range has no text content the given range will be returned unchanged. * @param editor The text editor to use * @param range The range to shrink down From 59d73bd7250f3129c32bfcc86196286ea0ee4f91 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Tue, 21 Jun 2022 08:19:10 +0200 Subject: [PATCH 09/13] Update src/processTargets/targets/InteriorTarget.ts Co-authored-by: Pokey Rule <755842+pokey@users.noreply.github.com> --- src/processTargets/targets/InteriorTarget.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/processTargets/targets/InteriorTarget.ts b/src/processTargets/targets/InteriorTarget.ts index bf41916bda..629a22fc5c 100644 --- a/src/processTargets/targets/InteriorTarget.ts +++ b/src/processTargets/targets/InteriorTarget.ts @@ -8,7 +8,7 @@ export interface InteriorTargetParameters } export default class InteriorTarget extends BaseTarget { - insertionDelimiter = ""; + insertionDelimiter = " "; private readonly fullInteriorRange: Range; constructor(parameters: InteriorTargetParameters) { From 075c1ad549262ce0095a43997f2e638bd98bfb8d Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Tue, 21 Jun 2022 08:21:25 +0200 Subject: [PATCH 10/13] Updated comment --- src/util/selectionUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/selectionUtils.ts b/src/util/selectionUtils.ts index 8f524c3108..4c006ccec1 100644 --- a/src/util/selectionUtils.ts +++ b/src/util/selectionUtils.ts @@ -45,7 +45,7 @@ export function selectionFromRange(isReversed: boolean, range: Range) { /** * Return a copy of {@link range} excluding any leading or trailing whitespace. - * If the given range has no text content the given range will be returned unchanged. + * If the given range contains only whitespace or is empty {@link range} will be returned unchanged. * @param editor The text editor to use * @param range The range to shrink down * @returns A new range equal or smaller to the given range From 812e33dce6ac34bf20318e7610133edf28734572 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Tue, 21 Jun 2022 08:27:00 +0200 Subject: [PATCH 11/13] Added tests for empty and whitespace core --- .../recorded/selectionTypes/clearCore.yml | 25 +++++++++++++++++++ .../recorded/selectionTypes/clearCore2.yml | 25 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 src/test/suite/fixtures/recorded/selectionTypes/clearCore.yml create mode 100644 src/test/suite/fixtures/recorded/selectionTypes/clearCore2.yml diff --git a/src/test/suite/fixtures/recorded/selectionTypes/clearCore.yml b/src/test/suite/fixtures/recorded/selectionTypes/clearCore.yml new file mode 100644 index 0000000000..a343f2313a --- /dev/null +++ b/src/test/suite/fixtures/recorded/selectionTypes/clearCore.yml @@ -0,0 +1,25 @@ +languageId: plaintext +command: + spokenForm: clear core + version: 2 + targets: + - type: primitive + modifiers: + - {type: interiorOnly} + usePrePhraseSnapshot: true + action: {name: clearAndSetSelection} +initialState: + documentContents: ( ) + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} + marks: {} +finalState: + documentContents: () + selections: + - anchor: {line: 0, character: 1} + active: {line: 0, character: 1} + thatMark: + - anchor: {line: 0, character: 1} + active: {line: 0, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, modifiers: [{type: interiorOnly}]}] diff --git a/src/test/suite/fixtures/recorded/selectionTypes/clearCore2.yml b/src/test/suite/fixtures/recorded/selectionTypes/clearCore2.yml new file mode 100644 index 0000000000..ba4959b448 --- /dev/null +++ b/src/test/suite/fixtures/recorded/selectionTypes/clearCore2.yml @@ -0,0 +1,25 @@ +languageId: plaintext +command: + spokenForm: clear core + version: 2 + targets: + - type: primitive + modifiers: + - {type: interiorOnly} + usePrePhraseSnapshot: true + action: {name: clearAndSetSelection} +initialState: + documentContents: () + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} + marks: {} +finalState: + documentContents: () + selections: + - anchor: {line: 0, character: 1} + active: {line: 0, character: 1} + thatMark: + - anchor: {line: 0, character: 1} + active: {line: 0, character: 1} +fullTargets: [{type: primitive, mark: {type: cursor}, modifiers: [{type: interiorOnly}]}] From a484a3aac63605d49c18cc25bbccd4310cca2a0e Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Tue, 21 Jun 2022 08:40:25 +0200 Subject: [PATCH 12/13] Updated comment --- src/util/selectionUtils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/util/selectionUtils.ts b/src/util/selectionUtils.ts index 4c006ccec1..18d490c8f6 100644 --- a/src/util/selectionUtils.ts +++ b/src/util/selectionUtils.ts @@ -45,10 +45,10 @@ export function selectionFromRange(isReversed: boolean, range: Range) { /** * Return a copy of {@link range} excluding any leading or trailing whitespace. - * If the given range contains only whitespace or is empty {@link range} will be returned unchanged. + * If {@link range} contains only whitespace or is empty {@link range} will be returned unchanged. * @param editor The text editor to use * @param range The range to shrink down - * @returns A new range equal or smaller to the given range + * @returns A new range equal or smaller to {@link range} */ export function shrinkRangeToFitContent(editor: TextEditor, range: Range) { const { document } = editor; From 6328a64843ba028012437d2ea63060f2e6e22c3d Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Tue, 21 Jun 2022 09:54:49 +0200 Subject: [PATCH 13/13] Empty commit