summaryrefslogtreecommitdiff
path: root/script/files
diff options
context:
space:
mode:
author最萌小汐 <sumneko@hotmail.com>2019-11-23 00:05:30 +0800
committer最萌小汐 <sumneko@hotmail.com>2019-11-23 00:05:30 +0800
commit6da2b175e20ed3c03b0dfcfc9046de1e0e5d4444 (patch)
treefdc22d78150fd1c5edc46732c8b151ccfefb519f /script/files
parentd0ff66c9abe9d6abbca12fd811e0c3cb69c1033a (diff)
downloadlua-language-server-6da2b175e20ed3c03b0dfcfc9046de1e0e5d4444.zip
正路目录
Diffstat (limited to 'script/files')
-rw-r--r--script/files/file.lua158
-rw-r--r--script/files/files.lua115
-rw-r--r--script/files/init.lua1
3 files changed, 274 insertions, 0 deletions
diff --git a/script/files/file.lua b/script/files/file.lua
new file mode 100644
index 00000000..81aabba5
--- /dev/null
+++ b/script/files/file.lua
@@ -0,0 +1,158 @@
+---@class file
+local mt = {}
+mt.__index = mt
+mt.type = 'file'
+mt._uri = ''
+mt._oldText = ''
+mt._text = ''
+mt._version = -1
+mt._vmCost = 0.0
+mt._lineCost = 0.0
+
+---@param buf string
+function mt:setText(buf)
+ self._oldText = self._text
+ self._text = buf
+end
+
+---@return string
+function mt:getText()
+ return self._text
+end
+
+---@return string
+function mt:getOldText()
+ return self._oldText
+end
+
+function mt:clearOldText()
+ self._oldText = nil
+end
+
+---@param version integer
+function mt:setVersion(version)
+ self._version = version
+end
+
+---@return integer
+function mt:getVersion()
+ return self._version
+end
+
+function mt:remove()
+ if self._removed then
+ return
+ end
+ self._removed = true
+ self._text = nil
+ self._version = nil
+ if self._vm then
+ self._vm:remove()
+ end
+end
+
+---@return boolean
+function mt:isRemoved()
+ return self._removed == true
+end
+
+---@param vm VM
+---@param version integer
+---@param cost number
+function mt:saveVM(vm, version, cost)
+ if self._vm then
+ self._vm:remove()
+ end
+ self._vm = vm
+ if vm then
+ vm:setVersion(version)
+ end
+ self._vmCost = cost
+end
+
+---@return VM
+function mt:getVM()
+ return self._vm
+end
+
+---@return number
+function mt:getVMCost()
+ return self._vmCost
+end
+
+function mt:removeVM()
+ if not self._vm then
+ return
+ end
+ self._vm:remove()
+ self._vm = nil
+end
+
+---@param lines table
+---@param cost number
+function mt:saveLines(lines, cost)
+ self._lines = lines
+ self._lineCost = cost
+end
+
+---@return table
+function mt:getLines()
+ return self._lines
+end
+
+function mt:getComments()
+ return self.comments
+end
+
+---@return file
+function mt:getParent()
+ return self._parent
+end
+
+---@param uri uri
+function mt:addChild(uri)
+ self._child[uri] = true
+end
+
+---@param uri uri
+function mt:removeChild(uri)
+ self._child[uri] = nil
+end
+
+---@param uri uri
+function mt:addParent(uri)
+ self._parent[uri] = true
+end
+
+---@param uri uri
+function mt:removeParent(uri)
+ self._parent[uri] = nil
+end
+
+function mt:eachChild()
+ return pairs(self._child)
+end
+
+function mt:eachParent()
+ return pairs(self._parent)
+end
+
+---@param err table
+function mt:setAstErr(err)
+ self._astErr = err
+end
+
+---@return table
+function mt:getAstErr()
+ return self._astErr
+end
+
+---@param uri string
+return function (uri)
+ local self = setmetatable({
+ _uri = uri,
+ _parent = {},
+ _child = {},
+ }, mt)
+ return self
+end
diff --git a/script/files/files.lua b/script/files/files.lua
new file mode 100644
index 00000000..88ff7444
--- /dev/null
+++ b/script/files/files.lua
@@ -0,0 +1,115 @@
+local file = require 'files.file'
+
+---@class files
+local mt = {}
+mt.__index = mt
+mt.type = 'files'
+mt._fileCount = 0
+---@type table<uri, file>
+mt._files = nil
+
+---@param uri uri
+---@param text string
+function mt:save(uri, text, version)
+ local f = self._files[uri]
+ if not f then
+ f = file(uri)
+ self._files[uri] = f
+ self._fileCount = self._fileCount + 1
+ end
+ f:setText(text)
+ f:setVersion(version)
+end
+
+---@param uri uri
+function mt:remove(uri)
+ local f = self._files[uri]
+ if not f then
+ return
+ end
+
+ f:remove()
+ self._files[uri] = nil
+ self._fileCount = self._fileCount - 1
+end
+
+---@param uri uri
+function mt:open(uri, text)
+ self._open[uri] = text
+end
+
+---@param uri uri
+function mt:close(uri)
+ self._open[uri] = nil
+end
+
+---@param uri uri
+---@return boolean
+function mt:isOpen(uri)
+ return self._open[uri] ~= nil
+end
+
+---@param uri uri
+function mt:setLibrary(uri)
+ self._library[uri] = true
+end
+
+---@param uri uri
+---@return uri
+function mt:isLibrary(uri)
+ return self._library[uri] == true
+end
+
+---@param uri uri
+function mt:isDead(uri)
+ local f = self._files[uri]
+ if not f then
+ return true
+ end
+ if f:isRemoved() then
+ return true
+ end
+ return f:getVersion() == -1
+end
+
+---@param uri uri
+---@return file
+function mt:get(uri)
+ return self._files[uri]
+end
+
+function mt:clear()
+ for _, f in pairs(self._files) do
+ f:remove()
+ end
+ self._files = {}
+ self._library = {}
+ self._fileCount = nil
+end
+
+function mt:clearVM()
+ for _, f in pairs(self._files) do
+ f:removeVM()
+ end
+end
+
+function mt:eachFile()
+ return pairs(self._files)
+end
+
+function mt:eachOpened()
+ return pairs(self._open)
+end
+
+function mt:count()
+ return self._fileCount
+end
+
+return function ()
+ local self = setmetatable({
+ _files = {},
+ _open = {},
+ _library = {},
+ }, mt)
+ return self
+end
diff --git a/script/files/init.lua b/script/files/init.lua
new file mode 100644
index 00000000..e090874d
--- /dev/null
+++ b/script/files/init.lua
@@ -0,0 +1 @@
+return require 'files.files'