summaryrefslogtreecommitdiff
path: root/stowables-dotlocal/share/nvim/site/pack/manual/start/nvim-cmp-v0.0.1/lua/cmp/config/context.lua
blob: 584f38abefd8a06b3d19faed934705f535e055d7 (plain)
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
local context = {}

---Check if cursor is in syntax group
---@param group string
---@return boolean
context.in_syntax_group = function(group)
  local lnum, col = vim.fn.line('.'), math.min(vim.fn.col('.'), #vim.fn.getline('.'))
  for _, syn_id in ipairs(vim.fn.synstack(lnum, col)) do
    syn_id = vim.fn.synIDtrans(syn_id) -- Resolve :highlight links
    if vim.fn.synIDattr(syn_id, 'name') == group then
      return true
    end
  end
  return false
end

---Check if cursor is in treesitter capture
---@param capture string
---@return boolean
context.in_treesitter_capture = function(capture)
  local highlighter = require('vim.treesitter.highlighter')
  local ts_utils = require('nvim-treesitter.ts_utils')
  local buf = vim.api.nvim_get_current_buf()

  local row, col = unpack(vim.api.nvim_win_get_cursor(0))
  row = row - 1
  if vim.api.nvim_get_mode().mode == 'i' then
    col = col - 1
  end

  local self = highlighter.active[buf]
  if not self then
    return false
  end

  local node_types = {}

  self.tree:for_each_tree(function(tstree, tree)
    if not tstree then
      return
    end

    local root = tstree:root()
    local root_start_row, _, root_end_row, _ = root:range()
    if root_start_row > row or root_end_row < row then
      return
    end

    local query = self:get_query(tree:lang())
    if not query:query() then
      return
    end

    local iter = query:query():iter_captures(root, self.bufnr, row, row + 1)
    for _, node, _ in iter do
      if ts_utils.is_in_node_range(node, row, col) then
        table.insert(node_types, node:type())
      end
    end
  end, true)

  return vim.tbl_contains(node_types, capture)
end

return context