reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
" Vim indent file
" Language:   llvm
" Maintainer: The LLVM team, http://llvm.org/
" What this indent plugin currently does:
"  - If no other rule matches copy indent from previous non-empty,
"    non-commented line
"  - On '}' align the same as the line containing the matching '{'
"  - If previous line ends with ':' increase indentation
"  - If the current line ends with ':' indent at the same level as the
"    enclosing '{'/'}' block
" Stuff that would be nice to add:
"  - Continue comments on next line
"  - If there is an opening+unclosed parenthesis on previous line indent to that
if exists("b:did_indent")
  finish
endif
let b:did_indent = 1

setlocal shiftwidth=2 expandtab

setlocal indentkeys=0{,0},<:>,!^F,o,O,e
setlocal indentexpr=GetLLVMIndent()

if exists("*GetLLVMIndent")
  finish
endif

function! FindOpenBrace(lnum)
  call cursor(a:lnum, 1)
  return searchpair('{', '', '}', 'bW')
endfun

function! GetLLVMIndent()
  " On '}' align the same as the line containing the matching '{'
  let thisline = getline(v:lnum)
  if thisline =~ '^\s*}'
    call cursor(v:lnum, 1)
    silent normal %
    let opening_lnum = line('.')
    if opening_lnum != v:lnum
      return indent(opening_lnum)
    endif
  endif

  " Indent labels the same as the current opening block
  if thisline =~ ':\s*$'
    let blockbegin = FindOpenBrace(v:lnum)
    if blockbegin > 0
      return indent(blockbegin)
    endif
  endif

  " Find a non-blank not-completely commented line above the current line.
  let prev_lnum = prevnonblank(v:lnum - 1)
  while prev_lnum > 0 && synIDattr(synID(prev_lnum, indent(prev_lnum)+1, 0), "name") =? "string\|comment"
    let prev_lnum = prevnonblank(prev_lnum-1)
  endwhile
  " Hit the start of the file, use zero indent.
  if prev_lnum == 0
    return 0
  endif

  let ind = indent(prev_lnum)
  let prevline = getline(prev_lnum)

  " Add a 'shiftwidth' after lines that start a block or labels
  if prevline =~ '{\s*$' || prevline =~ ':\s*$'
    let ind = ind + &shiftwidth
  endif

  return ind
endfunction