summaryrefslogtreecommitdiff
path: root/script/core/rename.lua
diff options
context:
space:
mode:
Diffstat (limited to 'script/core/rename.lua')
-rw-r--r--script/core/rename.lua72
1 files changed, 72 insertions, 0 deletions
diff --git a/script/core/rename.lua b/script/core/rename.lua
new file mode 100644
index 00000000..3a2e8532
--- /dev/null
+++ b/script/core/rename.lua
@@ -0,0 +1,72 @@
+local findSource = require 'core.find_source'
+local parser = require 'parser'
+
+local function parseResult(source, newName)
+ local positions = {}
+ if source:bindLabel() then
+ if not parser:grammar(newName, 'Name') then
+ return nil
+ end
+ source:bindLabel():eachInfo(function (info, src)
+ positions[#positions+1] = { src.start, src.finish, src:getUri() }
+ end)
+ return positions
+ end
+ if source:bindLocal() then
+ local loc = source:bindLocal()
+ if loc:get 'hide' then
+ return nil
+ end
+ if source:get 'in 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 = {}
+ loc:eachInfo(function (info, src)
+ if not mark[src] then
+ mark[src] = info
+ positions[#positions+1] = { src.start, src.finish, src:getUri() }
+ end
+ end)
+ return positions
+ end
+ if source:bindValue() and source:get 'parent' then
+ if source:get 'in 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 parent = source:get 'parent'
+ local mark = {}
+ parent:eachInfo(function (info, src)
+ if not mark[src] then
+ mark[src] = info
+ if info.type == 'get child' or info.type == 'set child' then
+ if info[1] == source[1] then
+ positions[#positions+1] = {src.start, src.finish, src:getUri()}
+ end
+ end
+ end
+ end)
+ return positions
+ end
+ return nil
+end
+
+return function (vm, pos, newName)
+ local source = findSource(vm, pos)
+ if not source then
+ return nil
+ end
+ local positions = parseResult(source, newName)
+ return positions
+end