" Copyright (c) 2017 The Fuchsia Authors. All rights reserved.
" Use of this source code is governed by a BSD-style license that can be
" found in the LICENSE file.

" Use `fx build` to build when you type :make
" Helper to clean up quickfix list in make.vim
let &makeprg="fx build"

" Look for the fuchsia root containing the current directory by looking for a
" .jiri_manifest file
let jiri_manifest = findfile(".jiri_manifest", ".;")
if jiri_manifest != ""
  let g:fuchsia_dir = fnamemodify(jiri_manifest, ":p:h")
  " Get the current build dir from fx
  let g:fuchsia_build_dir = systemlist(g:fuchsia_dir . "/scripts/fx get-build-dir")[0]
  " Tell YCM where to find its configuration script
  let g:ycm_global_ycm_extra_conf = g:fuchsia_dir . '/scripts/youcompleteme/ycm_extra_conf.py'
  " Do not load fuchsia/.ycm_extra_conf in case the user created a symlink for
  " other editors.
  let g:ycm_extra_conf_globlist = [ '!' . g:fuchsia_dir . '/*']
  " Google-internal options - use clangd completer if the user has a compilation
  " database (built with `fx compdb`).
  if filereadable(g:fuchsia_dir . '/compile_commands.json')
    let g:ycm_use_clangd = 1
    let g:ycm_clangd_binary_path = systemlist(g:fuchsia_dir . "/scripts/youcompleteme/paths.py CLANG_PATH")[0] . '/bin/clangd'
    " Disable clang tidy warnings for YCM, they're too noisy and cause you to quickly hit the YCM
    " diagnostics limit
    let g:ycm_clangd_args = ["-clang-tidy=false"]
  else
    let g:ycm_use_clangd = 0
  endif


  let &runtimepath .= "," .
        \ g:fuchsia_dir . "/scripts/vim/," .
        \ g:fuchsia_dir . "/garnet/public/lib/fidl/tools/vim/," .
        \ g:fuchsia_dir . "/third_party/json5.vim/"

  " The "filetype plugin" line must come AFTER the changes to runtimepath
  " above (so the proper directories are searched), but must come BEFORE the
  " FuchsiaBuffer function below (to work around a bug on MacOS where
  " Ctrl-] does not work because filetype is undefined instead of being
  " equal to "cpp".)
  filetype plugin indent on

  function! FuchsiaBuffer()
    let full_path = expand("%:p")
    let extension = expand("%:e")

    " Only run if the buffer is inside the Fuchsia dir
    if full_path !~ '^\V' . escape(g:fuchsia_dir, '\')
      return
    endif

    let b:is_fuchsia = 1

    " Set up path so that 'gf' and :find do what we want.
    " This includes the directory of the file, cwd, all layers, layer public
    " directories, the build directory, the gen directory and the zircon
    " sysroot include directory.
    let &l:path = ".,," .
          \ $PWD . "/**/," .
          \ g:fuchsia_dir . "," .
          \ g:fuchsia_dir . "/*/," .
          \ g:fuchsia_dir . "/*/public/," .
          \ g:fuchsia_build_dir . "," .
          \ g:fuchsia_build_dir . "/gen," .
          \ g:fuchsia_build_dir . "/sdk/exported/zircon_sysroot/arch/*/sysroot/include"

    " Make sure Dart files are recognized as such.
    if extension == "dart"
      set filetype=dart
    endif

    " The Buf* autocmds sometimes run before and sometimes after FileType.
    if &filetype == "cpp"
      call FuchsiaCppBuffer()
    endif
  endfunction

  " This may be called twice because autocmds arrive in different orders on
  " different platforms.
  function! FuchsiaCppBuffer()
    if !exists("b:is_fuchsia") || !b:is_fuchsia
      return
    endif
    if exists('g:loaded_youcompleteme')
      " Replace the normal go to tag key with YCM when editing C/CPP.
      nnoremap <C-]> :YcmCompleter GoTo<cr>
    endif
    set textwidth=100
  endfunction

  augroup fuchsia
    au!
    autocmd BufRead,BufNewFile * call FuchsiaBuffer()
    autocmd Filetype cpp call FuchsiaCppBuffer()

    " .cmx files are JSON
    autocmd BufRead,BufNewFile *.cmx set syntax=json
    " .cml files are JSON5
    autocmd BufRead,BufNewFile *.cml set syntax=json5

    " zsh completion functions are zsh scripts
    autocmd BufRead,BufNewFile */scripts/zsh-completion/_* set filetype=zsh

    " .tmpl.go files are Go template files
    autocmd BufRead,BufNewFile *.tmpl.go set syntax=gotmpl

    " If this is a golden file, strip the .golden and run autocommands
    " This will allow syntax highlighting of FIDL goldens.
    autocmd BufNewFile *.golden execute "doautocmd BufNewFile " . expand("%:r")
    autocmd BufRead *.golden execute "doautocmd BufRead " . expand("%:r")
  augroup END

endif
