Skip to content

Fit interior range to content #715

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 19 commits into from
Jun 21, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/processTargets/modifiers/HeadTailStage.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Range, TextEditor } from "vscode";
import { Range } from "vscode";
import { Target } from "../../typings/target.types";
import {
HeadTailModifier,
Expand Down
2 changes: 1 addition & 1 deletion src/processTargets/targets/BaseTarget.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
39 changes: 6 additions & 33 deletions src/processTargets/targets/DocumentTarget.ts
Original file line number Diff line number Diff line change
@@ -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";
Expand All @@ -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),
}),
];
}
Expand All @@ -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)
);
}
35 changes: 35 additions & 0 deletions src/processTargets/targets/InteriorTarget.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { Range } from "vscode";
import { shrinkRangeToFitContent } from "../../util/selectionUtils";
import BaseTarget, { CommonTargetParameters } from "./BaseTarget";

export interface InteriorTargetParameters
extends Omit<CommonTargetParameters, "contentRange"> {
readonly fullInteriorRange: Range;
}

export default class InteriorTarget extends BaseTarget {
insertionDelimiter = " ";
private readonly fullInteriorRange: Range;

constructor(parameters: InteriorTargetParameters) {
super({
...parameters,
contentRange: shrinkRangeToFitContent(
parameters.editor,
parameters.fullInteriorRange
),
});
this.fullInteriorRange = parameters.fullInteriorRange;
}

getLeadingDelimiterTarget = () => undefined;
getTrailingDelimiterTarget = () => undefined;
getRemovalRange = () => this.fullInteriorRange;

protected getCloneParameters() {
return {
...this.state,
fullInteriorRange: this.fullInteriorRange,
};
}
}
6 changes: 3 additions & 3 deletions src/processTargets/targets/SurroundingPairTarget.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
/**
Expand Down Expand Up @@ -48,10 +48,10 @@ export default class SurroundingPairTarget extends BaseTarget {

getInteriorStrict() {
return [
new WeakTarget({
new InteriorTarget({
editor: this.editor,
isReversed: this.isReversed,
contentRange: this.interiorRange_,
fullInteriorRange: this.interiorRange_,
}),
];
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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}}]}]
25 changes: 25 additions & 0 deletions src/test/suite/fixtures/recorded/selectionTypes/clearCore.yml
Original file line number Diff line number Diff line change
@@ -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}]}]
25 changes: 25 additions & 0 deletions src/test/suite/fixtures/recorded/selectionTypes/clearCore2.yml
Original file line number Diff line number Diff line change
@@ -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}]}]
Original file line number Diff line number Diff line change
Expand Up @@ -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}}]}]}]
29 changes: 29 additions & 0 deletions src/test/suite/fixtures/recorded/surroundingPair/chuckCore.yml
Original file line number Diff line number Diff line change
@@ -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}]}]
25 changes: 25 additions & 0 deletions src/test/suite/fixtures/recorded/surroundingPair/chuckCore2.yml
Original file line number Diff line number Diff line change
@@ -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}]}]
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
languageId: python
command:
version: 1
spokenForm: clear matching
spokenForm: clear inside
action: clearAndSetSelection
targets:
- type: primitive
Expand All @@ -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}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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}]}]
33 changes: 33 additions & 0 deletions src/test/suite/fixtures/recorded/surroundingPair/takeCore.yml
Original file line number Diff line number Diff line change
@@ -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}]}]
25 changes: 25 additions & 0 deletions src/test/suite/fixtures/recorded/surroundingPair/takeCore2.yml
Original file line number Diff line number Diff line change
@@ -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}]}]
Loading