" ==================================================
" COC configuration and mapping
" ==================================================

" Use `lp` and `ln` for navigate diagnostics
nmap <silent> <leader>lp <Plug>(coc-diagnostic-prev)
nmap <silent> <leader>ln <Plug>(coc-diagnostic-next)

" Remap keys for gotos
nmap <silent> <leader>ld <Plug>(coc-definition)
nmap <silent> <leader>lt <Plug>(coc-type-definition)
nmap <silent> <leader>li <Plug>(coc-implementation)
nmap <silent> <leader>lf <Plug>(coc-references)

" Remap for rename current word
nmap <leader>lr <Plug>(coc-rename)

" Use K for show documentation in preview window
nnoremap <silent> K :call <SID>show_documentation()<CR>

function! s:show_documentation()
  if &filetype == 'vim'
    execute 'h '.expand('<cword>')
  else
    call CocAction('doHover')
  endif
endfunction

augroup Coc
  " Highlight symbol under cursor on CursorHold
  autocmd CursorHold * silent call CocActionAsync('highlight')

  " Update signature help on jump placeholder
  autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')
augroup END

" See yank list
nnoremap <silent> <space>y  :<C-u>CocList -A --normal yank<cr>

vmap <leader>fp  <Plug>(coc-format-selected)
nmap <leader>fp  <Plug>(coc-format-selected)

" Remap for rename current word
nmap <leader>rn <Plug>(coc-rename)

"
inoremap <silent><expr> <TAB>
      \ pumvisible() ? coc#_select_confirm() :
      \ coc#expandableOrJumpable() ? "\<C-r>=coc#rpc#request('doKeymap', ['snippets-expand-jump',''])\<CR>" :
      \ <SID>check_back_space() ? "\<TAB>" :
      \ coc#refresh()

function! s:check_back_space() abort
  let col = col('.') - 1
  return !col || getline('.')[col - 1]  =~# '\s'
endfunction

let g:coc_snippet_next = '<tab>'

call coc#config('languageserver', {
      \ 'ccls': {
      \   'command': 'ccls',
      \   'trace.server': 'verbose',
      \   'filetypes': ['c', 'cpp', 'objc', 'objcpp']
      \ },
      \ 'sorbet': {
      \   'command': 'srb',
      \   'args': ['tc', '--lsp', '--enable-all-experimental-lsp-features'],
      \   'filetypes': ['ruby'],
      \   'rootPatterns': ["sorbet/config"]
      \ }
      \})

call coc#config('eslint', {
      \ 'filetype': [
      \ 'javascript',
      \ 'typescript',
      \ 'typescriptreact',
      \ 'typescript.tsx',
      \ 'vue'
      \ ] })