@@ -4,20 +4,25 @@ import type {
44 ScopeType ,
55 TextEditor ,
66} from "@cursorless/common" ;
7- import { Range } from "@cursorless/common" ;
8- import { LineTarget } from "../../targets" ;
7+ import { createLineTarget } from "../../targets" ;
98import { BaseScopeHandler } from "./BaseScopeHandler" ;
109import type { TargetScope } from "./scope.types" ;
1110
11+ interface LineScopeType {
12+ type : "line" | "fullLine" ;
13+ }
14+
1215export class LineScopeHandler extends BaseScopeHandler {
13- public readonly scopeType = { type : "line" } as const ;
1416 public readonly iterationScopeType : ScopeType = {
1517 type : "paragraph" ,
1618 } as const ;
1719 protected readonly isHierarchical = false ;
1820 public readonly includeAdjacentInEvery = true ;
1921
20- constructor ( _scopeType : ScopeType , _languageId : string ) {
22+ constructor (
23+ public readonly scopeType : LineScopeType ,
24+ _languageId : string ,
25+ ) {
2126 super ( ) ;
2227 }
2328
@@ -26,48 +31,32 @@ export class LineScopeHandler extends BaseScopeHandler {
2631 position : Position ,
2732 direction : Direction ,
2833 ) : Iterable < TargetScope > {
34+ const useFullLine = this . scopeType . type === "fullLine" ;
35+
2936 if ( direction === "forward" ) {
3037 for ( let i = position . line ; i < editor . document . lineCount ; i ++ ) {
31- yield lineNumberToScope ( editor , i ) ;
38+ yield lineNumberToScope ( editor , useFullLine , i ) ;
3239 }
3340 } else {
3441 for ( let i = position . line ; i >= 0 ; i -- ) {
35- yield lineNumberToScope ( editor , i ) ;
42+ yield lineNumberToScope ( editor , useFullLine , i ) ;
3643 }
3744 }
3845 }
3946}
4047
4148function lineNumberToScope (
4249 editor : TextEditor ,
50+ useFullLine : boolean ,
4351 lineNumber : number ,
4452) : TargetScope {
45- const { range } = editor . document . lineAt ( lineNumber ) ;
53+ const line = editor . document . lineAt ( lineNumber ) ;
4654
4755 return {
4856 editor,
49- domain : range ,
50- getTargets : ( isReversed ) => [ createLineTarget ( editor , isReversed , range ) ] ,
57+ domain : line . range ,
58+ getTargets : ( isReversed ) => [
59+ createLineTarget ( editor , isReversed , line , useFullLine ) ,
60+ ] ,
5161 } ;
5262}
53-
54- export function createLineTarget (
55- editor : TextEditor ,
56- isReversed : boolean ,
57- range : Range ,
58- ) {
59- return new LineTarget ( {
60- editor,
61- isReversed,
62- contentRange : fitRangeToLineContent ( editor , range ) ,
63- } ) ;
64- }
65-
66- export function fitRangeToLineContent ( editor : TextEditor , range : Range ) {
67- const startLine = editor . document . lineAt ( range . start ) ;
68- const endLine = editor . document . lineAt ( range . end ) ;
69- return new Range (
70- startLine . rangeTrimmed ?. start ?? startLine . range . start ,
71- endLine . rangeTrimmed ?. end ?? endLine . range . end ,
72- ) ;
73- }
0 commit comments