summaryrefslogtreecommitdiff
path: root/script/method/workspace/didChangeWatchedFiles.lua
blob: 3d8fc5992fd6785a41f1db24ad557319670b3b9e (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
local fs = require 'bee.filesystem'
local uric = require 'uri'

local FileChangeType = {
    Created = 1,
    Changed = 2,
    Deleted = 3,
}

--- @param lsp LSP
--- @param params table
return function (lsp, params)
    local needReset = {}
    local needRescan
    for _, change in ipairs(params.changes) do
        local ws = lsp:findWorkspaceFor(change.uri)
        if not ws then
            goto CONTINUE
        end
        local path = uric.decode(change.uri)
        if not path then
            goto CONTINUE
        end
        if change.type == FileChangeType.Created then
            ws:addFile(path)
            if lsp:getVM(change.uri) then
                needReset[ws] = true
            end
        elseif change.type == FileChangeType.Deleted then
            ws:removeFile(path)
            if lsp:getVM(change.uri) then
                needReset[ws] = true
            end
        end
        -- 排除类文件发生更改需要重新扫描
        local filename = path:filename():string()
        if ws:fileNameEq(filename, '.gitignore')
        or ws:fileNameEq(filename, '.gitmodules')
        then
            needRescan = true
        end
        ::CONTINUE::
    end
    if needRescan then
        lsp:reScanFiles()
    end
    -- 缓存过的文件发生变化后,重新计算
    for ws, _ in pairs(needReset) do
        ws:reset()
    end
end