xref: /aosp_15_r20/external/llvm/utils/vim/indent/llvm.vim (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker" Vim indent file
2*9880d681SAndroid Build Coastguard Worker" Language:   llvm
3*9880d681SAndroid Build Coastguard Worker" Maintainer: The LLVM team, http://llvm.org/
4*9880d681SAndroid Build Coastguard Worker" What this indent plugin currently does:
5*9880d681SAndroid Build Coastguard Worker"  - If no other rule matches copy indent from previous non-empty,
6*9880d681SAndroid Build Coastguard Worker"    non-commented line
7*9880d681SAndroid Build Coastguard Worker"  - On '}' align the same as the line containing the matching '{'
8*9880d681SAndroid Build Coastguard Worker"  - If previous line ends with ':' increase indentation
9*9880d681SAndroid Build Coastguard Worker"  - If the current line ends with ':' indent at the same level as the
10*9880d681SAndroid Build Coastguard Worker"    enclosing '{'/'}' block
11*9880d681SAndroid Build Coastguard Worker" Stuff that would be nice to add:
12*9880d681SAndroid Build Coastguard Worker"  - Continue comments on next line
13*9880d681SAndroid Build Coastguard Worker"  - If there is an opening+unclosed parenthesis on previous line indent to that
14*9880d681SAndroid Build Coastguard Workerif exists("b:did_indent")
15*9880d681SAndroid Build Coastguard Worker  finish
16*9880d681SAndroid Build Coastguard Workerendif
17*9880d681SAndroid Build Coastguard Workerlet b:did_indent = 1
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Workersetlocal shiftwidth=2 expandtab
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workersetlocal indentkeys=0{,0},<:>,!^F,o,O,e
22*9880d681SAndroid Build Coastguard Workersetlocal indentexpr=GetLLVMIndent()
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Workerif exists("*GetLLVMIndent")
25*9880d681SAndroid Build Coastguard Worker  finish
26*9880d681SAndroid Build Coastguard Workerendif
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerfunction! FindOpenBrace(lnum)
29*9880d681SAndroid Build Coastguard Worker  call cursor(a:lnum, 1)
30*9880d681SAndroid Build Coastguard Worker  return searchpair('{', '', '}', 'bW')
31*9880d681SAndroid Build Coastguard Workerendfun
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Workerfunction! GetLLVMIndent()
34*9880d681SAndroid Build Coastguard Worker  " On '}' align the same as the line containing the matching '{'
35*9880d681SAndroid Build Coastguard Worker  let thisline = getline(v:lnum)
36*9880d681SAndroid Build Coastguard Worker  if thisline =~ '^\s*}'
37*9880d681SAndroid Build Coastguard Worker    call cursor(v:lnum, 1)
38*9880d681SAndroid Build Coastguard Worker    silent normal %
39*9880d681SAndroid Build Coastguard Worker    let opening_lnum = line('.')
40*9880d681SAndroid Build Coastguard Worker    if opening_lnum != v:lnum
41*9880d681SAndroid Build Coastguard Worker      return indent(opening_lnum)
42*9880d681SAndroid Build Coastguard Worker    endif
43*9880d681SAndroid Build Coastguard Worker  endif
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker  " Indent labels the same as the current opening block
46*9880d681SAndroid Build Coastguard Worker  if thisline =~ ':\s*$'
47*9880d681SAndroid Build Coastguard Worker    let blockbegin = FindOpenBrace(v:lnum)
48*9880d681SAndroid Build Coastguard Worker    if blockbegin > 0
49*9880d681SAndroid Build Coastguard Worker      return indent(blockbegin)
50*9880d681SAndroid Build Coastguard Worker    endif
51*9880d681SAndroid Build Coastguard Worker  endif
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker  " Find a non-blank not-completely commented line above the current line.
54*9880d681SAndroid Build Coastguard Worker  let prev_lnum = prevnonblank(v:lnum - 1)
55*9880d681SAndroid Build Coastguard Worker  while prev_lnum > 0 && synIDattr(synID(prev_lnum, indent(prev_lnum)+1, 0), "name") =? "string\|comment"
56*9880d681SAndroid Build Coastguard Worker    let prev_lnum = prevnonblank(prev_lnum-1)
57*9880d681SAndroid Build Coastguard Worker  endwhile
58*9880d681SAndroid Build Coastguard Worker  " Hit the start of the file, use zero indent.
59*9880d681SAndroid Build Coastguard Worker  if prev_lnum == 0
60*9880d681SAndroid Build Coastguard Worker    return 0
61*9880d681SAndroid Build Coastguard Worker  endif
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Worker  let ind = indent(prev_lnum)
64*9880d681SAndroid Build Coastguard Worker  let prevline = getline(prev_lnum)
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker  " Add a 'shiftwidth' after lines that start a block or labels
67*9880d681SAndroid Build Coastguard Worker  if prevline =~ '{\s*$' || prevline =~ ':\s*$'
68*9880d681SAndroid Build Coastguard Worker    let ind = ind + &shiftwidth
69*9880d681SAndroid Build Coastguard Worker  endif
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker  return ind
72*9880d681SAndroid Build Coastguard Workerendfunction
73