" Support for Python indenting, see runtime/indent/python.vim

let s:keepcpo= &cpo
set cpo&vim

" need to inspect some old g:pyindent_* variables to be backward compatible
let g:python_indent = extend(get(g:, 'python_indent', {}), #{
  \ closed_paren_align_last_line: v:true,
  \ open_paren: get(g:, 'pyindent_open_paren', 'shiftwidth() * 2'),
  \ nested_paren: get(g:, 'pyindent_nested_paren', 'shiftwidth()'),
  \ continue: get(g:, 'pyindent_continue', 'shiftwidth() * 2'),
  "\ searchpair() can be slow, limit the time to 150 msec or what is put in
  "\ g:python_indent.searchpair_timeout
  \ searchpair_timeout: get(g:, 'pyindent_searchpair_timeout', 150),
  "\ Identing inside parentheses can be very slow, regardless of the searchpair()
  "\ timeout, so let the user disable this feature if he doesn't need it
  \ disable_parentheses_indenting: get(g:, 'pyindent_disable_parentheses_indenting', v:false),
  \ }, 'keep')

let s:maxoff = 50       " maximum number of lines to look backwards for ()

function s:SearchBracket(fromlnum, flags)
  return searchpairpos('[[({]', '', '[])}]', a:flags,
          \ {-> synstack('.', col('.'))
          \   ->map({_, id -> id->synIDattr('name')})
          \   ->match('\%(Comment\|Todo\|String\)$') >= 0},
          \ [0, a:fromlnum - s:maxoff]->max(), g:python_indent.searchpair_timeout)
endfunction

" See if the specified line is already user-dedented from the expected value.
function s:Dedented(lnum, expected)
  return indent(a:lnum) <= a:expected - shiftwidth()
endfunction

" Some other filetypes which embed Python have slightly different indent
" rules (e.g. bitbake). Those filetypes can pass an extra funcref to this
" function which is evaluated below.
function python#GetIndent(lnum, ...)
  let ExtraFunc = a:0 > 0 ? a:1 : 0

  " If this line is explicitly joined: If the previous line was also joined,
  " line it up with that one, otherwise add two 'shiftwidth'
  if getline(a:lnum - 1) =~ '\\$'
    if a:lnum > 1 && getline(a:lnum - 2) =~ '\\$'
      return indent(a:lnum - 1)
    endif
    return indent(a:lnum - 1) + get(g:, 'pyindent_continue', g:python_indent.continue)->eval()
  endif

  " If the start of the line is in a string don't change the indent.
  if has('syntax_items')
	\ && synIDattr(synID(a:lnum, 1, 1), "name") =~ "String$"
    return -1
  endif

  " Search backwards for the previous non-empty line.
  let plnum = prevnonblank(v:lnum - 1)

  if plnum == 0
    " This is the first non-empty line, use zero indent.
    return 0
  endif

  if g:python_indent.disable_parentheses_indenting == 1
    let plindent = indent(plnum)
    let plnumstart = plnum
  else
    " Indent inside parens.
    " Align with the open paren unless it is at the end of the line.
    " E.g.
    "     open_paren_not_at_EOL(100,
    "                           (200,
    "                            300),
    "                           400)
    "     open_paren_at_EOL(
    "         100, 200, 300, 400)
    call cursor(a:lnum, 1)
    let [parlnum, parcol] = s:SearchBracket(a:lnum, 'nbW')
    if parlnum > 0
      if parcol != col([parlnum, '$']) - 1
        return parcol
      elseif getline(a:lnum) =~ '^\s*[])}]' && !g:python_indent.closed_paren_align_last_line
        return indent(parlnum)
      endif
    endif

    call cursor(plnum, 1)

    " If the previous line is inside parenthesis, use the indent of the starting
    " line.
    let [parlnum, _] = s:SearchBracket(plnum, 'nbW')
    if parlnum > 0
      if a:0 > 0 && ExtraFunc(parlnum)
        " We may have found the opening brace of a bitbake Python task, e.g. 'python do_task {'
        " If so, ignore it here - it will be handled later.
        let parlnum = 0
        let plindent = indent(plnum)
        let plnumstart = plnum
      else
        let plindent = indent(parlnum)
        let plnumstart = parlnum
      endif
    else
      let plindent = indent(plnum)
      let plnumstart = plnum
    endif

    " When inside parenthesis: If at the first line below the parenthesis add
    " two 'shiftwidth', otherwise same as previous line.
    " i = (a
    "       + b
    "       + c)
    call cursor(a:lnum, 1)
    let [p, _] = s:SearchBracket(a:lnum, 'bW')
    if p > 0
      if a:0 > 0 && ExtraFunc(p)
        " Currently only used by bitbake
        " Handle first non-empty line inside a bitbake Python task
        if p == plnum
          return shiftwidth()
        endif

        " Handle the user actually trying to close a bitbake Python task
        let line = getline(a:lnum)
        if line =~ '^\s*}'
          return -2
        endif

        " Otherwise ignore the brace
        let p = 0
      else
        if p == plnum
          " When the start is inside parenthesis, only indent one 'shiftwidth'.
          let [pp, _] = s:SearchBracket(a:lnum, 'bW')
          if pp > 0
            return indent(plnum)
              \ + get(g:, 'pyindent_nested_paren', g:python_indent.nested_paren)->eval()
          endif
          return indent(plnum)
            \ + get(g:, 'pyindent_open_paren', g:python_indent.open_paren)->eval()
        endif
        if plnumstart == p
          return indent(plnum)
        endif
        return plindent
      endif
    endif
  endif


  " Get the line and remove a trailing comment.
  " Use syntax highlighting attributes when possible.
  let pline = getline(plnum)
  let pline_len = strlen(pline)
  if has('syntax_items')
    " If the last character in the line is a comment, do a binary search for
    " the start of the comment.  synID() is slow, a linear search would take
    " too long on a long line.
    if synstack(plnum, pline_len)
    \ ->map({_, id -> id->synIDattr('name')})
    \ ->match('\%(Comment\|Todo\)$') >= 0
      let min = 1
      let max = pline_len
      while min < max
	let col = (min + max) / 2
        if synstack(plnum, col)
        \ ->map({_, id -> id->synIDattr('name')})
        \ ->match('\%(Comment\|Todo\)$') >= 0
	  let max = col
	else
	  let min = col + 1
	endif
      endwhile
      let pline = strpart(pline, 0, min - 1)
    endif
  else
    let col = 0
    while col < pline_len
      if pline[col] == '#'
	let pline = strpart(pline, 0, col)
	break
      endif
      let col = col + 1
    endwhile
  endif

  " If the previous line ended with a colon, indent this line
  if pline =~ ':\s*$'
    return plindent + shiftwidth()
  endif

  " If the previous line was a stop-execution statement...
  if getline(plnum) =~ '^\s*\(break\|continue\|raise\|return\|pass\)\>'
    " See if the user has already dedented
    if s:Dedented(a:lnum, indent(plnum))
      " If so, trust the user
      return -1
    endif
    " If not, recommend one dedent
    return indent(plnum) - shiftwidth()
  endif

  " If the current line begins with a keyword that lines up with "try"
  if getline(a:lnum) =~ '^\s*\(except\|finally\)\>'
    let lnum = a:lnum - 1
    while lnum >= 1
      if getline(lnum) =~ '^\s*\(try\|except\)\>'
	let ind = indent(lnum)
	if ind >= indent(a:lnum)
	  return -1	" indent is already less than this
	endif
	return ind	" line up with previous try or except
      endif
      let lnum = lnum - 1
    endwhile
    return -1		" no matching "try"!
  endif

  " If the current line begins with a header keyword, dedent
  if getline(a:lnum) =~ '^\s*\(elif\|else\)\>'

    " Unless the previous line was a one-liner
    if getline(plnumstart) =~ '^\s*\(for\|if\|elif\|try\)\>'
      return plindent
    endif

    " Or the user has already dedented
    if s:Dedented(a:lnum, plindent)
      return -1
    endif

    return plindent - shiftwidth()
  endif

  " When after a () construct we probably want to go back to the start line.
  " a = (b
  "       + c)
  " here
  if parlnum > 0
    " ...unless the user has already dedented
    if s:Dedented(a:lnum, plindent)
        return -1
    else
        return plindent
    endif
  endif

  return -1
endfunction

let &cpo = s:keepcpo
unlet s:keepcpo
