|
| 1 | +let s:skip_syntax = sj#SkipSyntax(['String', 'Comment']) |
| 2 | +let s:eol_pattern = '\s*\%(//.*\)\=$' |
| 3 | + |
| 4 | +function! sj#hare#SplitQuestionMark() |
| 5 | + if sj#SearchSkip('.?', s:skip_syntax, 'Wc', line('.')) <= 0 |
| 6 | + return 0 |
| 7 | + endif |
| 8 | + |
| 9 | + let current_line = line('.') |
| 10 | + let end_col = col('.') |
| 11 | + let question_mark_col = col('.') + 1 |
| 12 | + let char = getline('.')[end_col - 1] |
| 13 | + |
| 14 | + let previous_start_col = -2 |
| 15 | + let start_col = -1 |
| 16 | + |
| 17 | + while previous_start_col != start_col |
| 18 | + let previous_start_col = start_col |
| 19 | + |
| 20 | + if char =~ '\k' |
| 21 | + call search('\k\+?;', 'bWc', line('.')) |
| 22 | + let start_col = col('.') |
| 23 | + elseif char == '}' |
| 24 | + " go to opening bracket |
| 25 | + normal! % |
| 26 | + let start_col = col('.') |
| 27 | + elseif char == ')' |
| 28 | + " go to opening bracket |
| 29 | + normal! % |
| 30 | + " find first method-call char |
| 31 | + call search('\%(\k\|\.\|::\)\+!\?(', 'bWc') |
| 32 | + |
| 33 | + if line('.') != current_line |
| 34 | + " multiline expression, let's just ignore it |
| 35 | + return 0 |
| 36 | + endif |
| 37 | + |
| 38 | + let start_col = col('.') |
| 39 | + else |
| 40 | + break |
| 41 | + endif |
| 42 | + |
| 43 | + if start_col <= 1 |
| 44 | + " first character, no previous one |
| 45 | + break |
| 46 | + endif |
| 47 | + |
| 48 | + " move backwards one step from the start |
| 49 | + let pos = getpos('.') |
| 50 | + let pos[2] = start_col - 1 |
| 51 | + call setpos('.', pos) |
| 52 | + let char = getline('.')[col('.') - 1] |
| 53 | + endwhile |
| 54 | + |
| 55 | + let expr = sj#GetCols(start_col, end_col) |
| 56 | + |
| 57 | + let replacement = join([ |
| 58 | + \ "match (".expr.") {", |
| 59 | + \ "case error => abort();", |
| 60 | + \ "case let t: type =>", |
| 61 | + \ " yield t;", |
| 62 | + \ "}" |
| 63 | + \ ], "\n") |
| 64 | + |
| 65 | + call sj#ReplaceCols(start_col, question_mark_col, replacement) |
| 66 | + return 1 |
| 67 | +endfunction |
0 commit comments