Mercurial > vim
annotate runtime/indent/go.vim @ 33361:241a1c2d30fd v9.0.1942
patch 9.0.1942: Vim9: execution stack invalidated with null object
Commit: https://github.com/vim/vim/commit/c1946267f22efe3ec5eb0a1a914f30782a538983
Author: Yegappan Lakshmanan <yegappan@yahoo.com>
Date: Mon Sep 25 21:00:46 2023 +0200
patch 9.0.1942: Vim9: execution stack invalidated with null object
Problem: Vim9: execution stack invalidated with null object
Solution: Check for a null object before adjusting the execution stack
closes: #13186
Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Mon, 25 Sep 2023 21:15:07 +0200 |
parents | 5c220cf30f1f |
children |
rev | line source |
---|---|
6153 | 1 " Vim indent file |
2 " Language: Go | |
3 " Maintainer: David Barnett (https://github.com/google/vim-ft-go) | |
11518 | 4 " Last Change: 2017 Jun 13 |
33052
5c220cf30f1f
runtime: Set b:undo_indent where missing (#12944)
Christian Brabandt <cb@256bit.org>
parents:
11518
diff
changeset
|
5 " 2023 Aug 28 by Vim Project (undo_indent) |
6153 | 6 " |
7 " TODO: | |
8 " - function invocations split across lines | |
9 " - general line splits (line ends in an operator) | |
10 | |
11 if exists('b:did_indent') | |
12 finish | |
13 endif | |
14 let b:did_indent = 1 | |
15 | |
16 " C indentation is too far off useful, mainly due to Go's := operator. | |
17 " Let's just define our own. | |
18 setlocal nolisp | |
19 setlocal autoindent | |
20 setlocal indentexpr=GoIndent(v:lnum) | |
21 setlocal indentkeys+=<:>,0=},0=) | |
22 | |
33052
5c220cf30f1f
runtime: Set b:undo_indent where missing (#12944)
Christian Brabandt <cb@256bit.org>
parents:
11518
diff
changeset
|
23 let b:undo_indent = "setl ai< inde< indk< lisp<" |
5c220cf30f1f
runtime: Set b:undo_indent where missing (#12944)
Christian Brabandt <cb@256bit.org>
parents:
11518
diff
changeset
|
24 |
6153 | 25 if exists('*GoIndent') |
26 finish | |
27 endif | |
28 | |
29 function! GoIndent(lnum) | |
30 let l:prevlnum = prevnonblank(a:lnum-1) | |
31 if l:prevlnum == 0 | |
32 " top of file | |
33 return 0 | |
34 endif | |
35 | |
36 " grab the previous and current line, stripping comments. | |
37 let l:prevl = substitute(getline(l:prevlnum), '//.*$', '', '') | |
38 let l:thisl = substitute(getline(a:lnum), '//.*$', '', '') | |
39 let l:previ = indent(l:prevlnum) | |
40 | |
41 let l:ind = l:previ | |
42 | |
43 if l:prevl =~ '[({]\s*$' | |
44 " previous line opened a block | |
11518 | 45 let l:ind += shiftwidth() |
6153 | 46 endif |
47 if l:prevl =~# '^\s*\(case .*\|default\):$' | |
48 " previous line is part of a switch statement | |
11518 | 49 let l:ind += shiftwidth() |
6153 | 50 endif |
51 " TODO: handle if the previous line is a label. | |
52 | |
53 if l:thisl =~ '^\s*[)}]' | |
54 " this line closed a block | |
11518 | 55 let l:ind -= shiftwidth() |
6153 | 56 endif |
57 | |
58 " Colons are tricky. | |
59 " We want to outdent if it's part of a switch ("case foo:" or "default:"). | |
60 " We ignore trying to deal with jump labels because (a) they're rare, and | |
61 " (b) they're hard to disambiguate from a composite literal key. | |
62 if l:thisl =~# '^\s*\(case .*\|default\):$' | |
11518 | 63 let l:ind -= shiftwidth() |
6153 | 64 endif |
65 | |
66 return l:ind | |
67 endfunction | |
68 | |
69 " vim: sw=2 sts=2 et |