1
- ' use babel'
1
+ " use babel"
2
2
// TODO: docstrings
3
3
4
- import { forLines } from ' ./scopes'
4
+ import { forLines } from " ./scopes"
5
5
6
- export function getLine ( ed , l ) {
6
+ export function getLine ( ed , l ) {
7
7
return {
8
8
scope : ed . scopeDescriptorForBufferPosition ( [ l , 0 ] ) . scopes ,
9
- line : ed . getTextInBufferRange ( [ [ l , 0 ] , [ l , Infinity ] ] )
9
+ line : ed . getTextInBufferRange ( [
10
+ [ l , 0 ] ,
11
+ [ l , Infinity ]
12
+ ] )
10
13
}
11
14
}
12
15
13
- function isBlank ( { line, scope} , allowDocstrings = false ) {
16
+ function isBlank ( { line, scope } , allowDocstrings = false ) {
14
17
for ( const s of scope ) {
15
18
if ( / \b c o m m e n t \b / . test ( s ) || ( ! allowDocstrings && / \b d o c s t r i n g \b / . test ( s ) ) ) {
16
19
return true
17
20
}
18
21
}
19
22
return / ^ \s * ( # .* ) ? $ / . test ( line )
20
23
}
21
- function isEnd ( { line, scope } ) {
24
+ function isEnd ( { line, scope } ) {
22
25
if ( isStringEnd ( { line, scope } ) ) {
23
26
return true
24
27
}
25
28
return / ^ ( e n d \b | \) | \] | \} ) / . test ( line )
26
29
}
27
- function isStringEnd ( { line, scope } ) {
28
- scope = scope . join ( ' ' )
29
- return / \b s t r i n g \. m u l t i l i n e \. e n d \b / . test ( scope ) ||
30
- ( / \b s t r i n g \. e n d \b / . test ( scope ) && / \b b a c k t i c k \b / . test ( scope ) )
30
+ function isStringEnd ( { line, scope } ) {
31
+ scope = scope . join ( " " )
32
+ return / \b s t r i n g \. m u l t i l i n e \. e n d \b / . test ( scope ) || ( / \b s t r i n g \. e n d \b / . test ( scope ) && / \b b a c k t i c k \b / . test ( scope ) )
31
33
}
32
- function isCont ( { line, scope } ) {
33
- scope = scope . join ( ' ' )
34
- if ( / \b s t r i n g \b / . test ( scope ) && ! ( / \b p u n c t u a t i o n \. d e f i n i t i o n \. s t r i n g \b / . test ( scope ) ) ) {
34
+ function isCont ( { line, scope } ) {
35
+ scope = scope . join ( " " )
36
+ if ( / \b s t r i n g \b / . test ( scope ) && ! / \b p u n c t u a t i o n \. d e f i n i t i o n \. s t r i n g \b / . test ( scope ) ) {
35
37
return true
36
38
}
37
39
38
40
return line . match ( / ^ ( e l s e | e l s e i f | c a t c h | f i n a l l y ) \b / )
39
41
}
40
- function isStart ( lineInfo ) {
42
+ function isStart ( lineInfo ) {
41
43
return ! ( / ^ \s / . test ( lineInfo . line ) || isBlank ( lineInfo ) || isEnd ( lineInfo ) || isCont ( lineInfo ) )
42
44
}
43
45
44
46
function walkBack ( ed , row ) {
45
- while ( ( row > 0 ) && ! isStart ( getLine ( ed , row ) ) ) {
47
+ while ( row > 0 && ! isStart ( getLine ( ed , row ) ) ) {
46
48
row --
47
49
}
48
50
return row
49
51
}
50
52
51
- function walkForward ( ed , start ) {
53
+ function walkForward ( ed , start ) {
52
54
let end = start
53
55
let mark = start
54
56
while ( mark < ed . getLastBufferRow ( ) ) {
@@ -62,10 +64,7 @@ function walkForward (ed, start) {
62
64
// An `end` only counts when there still are unclosed blocks (indicated by `forLines`
63
65
// returning a non-empty array).
64
66
// If the line closes a multiline string we also take that as ending the block.
65
- if (
66
- ! ( forLines ( ed , start , mark - 1 ) . length === 0 ) ||
67
- isStringEnd ( lineInfo )
68
- ) {
67
+ if ( ! ( forLines ( ed , start , mark - 1 ) . length === 0 ) || isStringEnd ( lineInfo ) ) {
69
68
end = mark
70
69
}
71
70
} else if ( ! ( isBlank ( lineInfo ) || isStart ( lineInfo ) ) ) {
@@ -75,63 +74,73 @@ function walkForward (ed, start) {
75
74
return end
76
75
}
77
76
78
- function getRange ( ed , row ) {
77
+ function getRange ( ed , row ) {
79
78
const start = walkBack ( ed , row )
80
79
const end = walkForward ( ed , start )
81
80
if ( start <= row && row <= end ) {
82
- return [ [ start , 0 ] , [ end , Infinity ] ]
81
+ return [
82
+ [ start , 0 ] ,
83
+ [ end , Infinity ]
84
+ ]
83
85
}
84
86
}
85
87
86
- function getSelection ( ed , sel ) {
87
- const { start, end} = sel . getBufferRange ( )
88
- const range = [ [ start . row , start . column ] , [ end . row , end . column ] ]
89
- while ( isBlank ( getLine ( ed , range [ 0 ] [ 0 ] ) , true ) && ( range [ 0 ] [ 0 ] <= range [ 1 ] [ 0 ] ) ) {
88
+ function getSelection ( ed , sel ) {
89
+ const { start, end } = sel . getBufferRange ( )
90
+ const range = [
91
+ [ start . row , start . column ] ,
92
+ [ end . row , end . column ]
93
+ ]
94
+ while ( isBlank ( getLine ( ed , range [ 0 ] [ 0 ] ) , true ) && range [ 0 ] [ 0 ] <= range [ 1 ] [ 0 ] ) {
90
95
range [ 0 ] [ 0 ] ++
91
96
range [ 0 ] [ 1 ] = 0
92
97
}
93
- while ( isBlank ( getLine ( ed , range [ 1 ] [ 0 ] ) , true ) && ( range [ 1 ] [ 0 ] >= range [ 0 ] [ 0 ] ) ) {
98
+ while ( isBlank ( getLine ( ed , range [ 1 ] [ 0 ] ) , true ) && range [ 1 ] [ 0 ] >= range [ 0 ] [ 0 ] ) {
94
99
range [ 1 ] [ 0 ] --
95
100
range [ 1 ] [ 1 ] = Infinity
96
101
}
97
102
return range
98
103
}
99
104
100
- export function moveNext ( ed , sel , range ) {
105
+ export function moveNext ( ed , sel , range ) {
101
106
// Ensure enough room at the end of the buffer
102
107
const row = range [ 1 ] [ 0 ]
103
108
let last
104
- while ( ( last = ed . getLastBufferRow ( ) ) < ( row + 2 ) ) {
105
- if ( ( last !== row ) && ! isBlank ( getLine ( ed , last ) ) ) {
109
+ while ( ( last = ed . getLastBufferRow ( ) ) < row + 2 ) {
110
+ if ( last !== row && ! isBlank ( getLine ( ed , last ) ) ) {
106
111
break
107
112
}
108
- sel . setBufferRange ( [ [ last , Infinity ] , [ last , Infinity ] ] )
109
- sel . insertText ( '\n' )
113
+ sel . setBufferRange ( [
114
+ [ last , Infinity ] ,
115
+ [ last , Infinity ]
116
+ ] )
117
+ sel . insertText ( "\n" )
110
118
}
111
119
// Move the cursor
112
120
let to = row + 1
113
- while ( ( to < ed . getLastBufferRow ( ) ) && isBlank ( getLine ( ed , to ) ) ) {
121
+ while ( to < ed . getLastBufferRow ( ) && isBlank ( getLine ( ed , to ) ) ) {
114
122
to ++
115
123
}
116
124
to = walkForward ( ed , to )
117
- return sel . setBufferRange ( [ [ to , Infinity ] , [ to , Infinity ] ] )
125
+ return sel . setBufferRange ( [
126
+ [ to , Infinity ] ,
127
+ [ to , Infinity ]
128
+ ] )
118
129
}
119
130
120
- function getRanges ( ed ) {
131
+ function getRanges ( ed ) {
121
132
const ranges = ed . getSelections ( ) . map ( sel => {
122
133
return {
123
134
selection : sel ,
124
- range : sel . isEmpty ( ) ?
125
- getRange ( ed , sel . getHeadBufferPosition ( ) . row ) :
126
- getSelection ( ed , sel )
135
+ range : sel . isEmpty ( ) ? getRange ( ed , sel . getHeadBufferPosition ( ) . row ) : getSelection ( ed , sel )
127
136
}
128
137
} )
129
138
return ranges . filter ( ( { range } ) => {
130
139
return range && ed . getTextInBufferRange ( range ) . trim ( )
131
140
} )
132
141
}
133
142
134
- export function get ( ed ) {
143
+ export function get ( ed ) {
135
144
return getRanges ( ed ) . map ( ( { range, selection } ) => {
136
145
return {
137
146
range,
@@ -142,9 +151,9 @@ export function get (ed) {
142
151
} )
143
152
}
144
153
145
- export function getLocalContext ( editor , row ) {
154
+ export function getLocalContext ( editor , row ) {
146
155
const range = getRange ( editor , row )
147
- const context = range ? editor . getTextInBufferRange ( range ) : ''
156
+ const context = range ? editor . getTextInBufferRange ( range ) : ""
148
157
// NOTE:
149
158
// backend code expects startRow to be number for most cases, e.g.: `row = row - startRow`
150
159
// so let's just return `0` when there is no local context
@@ -156,7 +165,7 @@ export function getLocalContext (editor, row) {
156
165
}
157
166
}
158
167
159
- export function select ( ed = atom . workspace . getActiveTextEditor ( ) ) {
168
+ export function select ( ed = atom . workspace . getActiveTextEditor ( ) ) {
160
169
if ( ! ed ) return
161
170
return ed . mutateSelectedText ( selection => {
162
171
const range = getRange ( ed , selection . getHeadBufferPosition ( ) . row )
0 commit comments