" 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.
  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
