summaryrefslogtreecommitdiff
path: root/server/src/core/rename.lua
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/core/rename.lua')
-rw-r--r--server/src/core/rename.lua51
1 files changed, 51 insertions, 0 deletions
diff --git a/server/src/core/rename.lua b/server/src/core/rename.lua
new file mode 100644
index 00000000..459aabcc
--- /dev/null
+++ b/server/src/core/rename.lua
@@ -0,0 +1,51 @@
+local findResult = require 'core.find_result'
+local parser = require 'parser'
+
+local function parseResult(result, source, newName)
+ local positions = {}
+ local tp = result.type
+ if tp == 'local' or tp == 'field' then
+ local key = source[1]
+ if result.disableRename then
+ return positions
+ end
+ if source.index then
+ if not parser.grammar(newName, 'Exp') then
+ return positions
+ end
+ else
+ if not parser.grammar(newName, 'Name') then
+ return positions
+ end
+ end
+ local mark = {}
+ for _, info in ipairs(result) do
+ if not mark[info.source] then
+ mark[info.source] = info
+ if info.source[1] == key then
+ positions[#positions+1] = {info.source.start, info.source.finish}
+ end
+ end
+ end
+ elseif tp == 'label' then
+ if not parser.grammar(newName, 'Name') then
+ return positions
+ end
+ local label = result.label
+ for _, info in ipairs(label) do
+ positions[#positions+1] = {info.source.start, info.source.finish}
+ end
+ else
+ error('Unknow result type:' .. result.type)
+ end
+ return positions
+end
+
+return function (vm, pos, newName)
+ local result, source = findResult(vm, pos)
+ if not result then
+ return nil
+ end
+ local positions = parseResult(result, source, newName)
+ return positions
+end