summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--server/src/matcher/definition.lua58
-rw-r--r--server/src/matcher/vm.lua1
3 files changed, 35 insertions, 26 deletions
diff --git a/README.md b/README.md
index d0b2fef4..d6e4e709 100644
--- a/README.md
+++ b/README.md
@@ -12,10 +12,10 @@
- [x] Diagnostics
- [x] Rename
- [x] Auto Completion
+- [x] Intelligent
- [ ] Support Dirty Script
- [ ] Syntax Check
- [ ] Signature Help
-- [ ] Intelligent
- [ ] Multi Workspace
### Locale
diff --git a/server/src/matcher/definition.lua b/server/src/matcher/definition.lua
index 2f52c9b8..c31f817c 100644
--- a/server/src/matcher/definition.lua
+++ b/server/src/matcher/definition.lua
@@ -1,13 +1,38 @@
local findResult = require 'matcher.find_result'
+local function parseResultAcrossUri(positions, vm, result)
+ -- 跨越文件时,遍历的是值的绑定信息
+ for _, info in ipairs(result.value) do
+ if info.type == 'set' and info.source.uri == result.value.uri then
+ positions[#positions+1] = {
+ info.source.start,
+ info.source.finish,
+ info.source.uri,
+ }
+ end
+ end
+ if #positions == 0 then
+ for _, info in ipairs(result.value) do
+ if info.type == 'return' and info.source.uri == result.value.uri then
+ positions[#positions+1] = {
+ info.source.start,
+ info.source.finish,
+ info.source.uri,
+ }
+ end
+ end
+ end
+end
+
local function parseResult(vm, result)
local positions = {}
local tp = result.type
if tp == 'local' then
if result.value.uri ~= vm.uri then
- -- 跨越文件时,遍历的是值的绑定信息
- for _, info in ipairs(result.value) do
- if info.type == 'set'then
+ parseResultAcrossUri(positions, vm, result)
+ else
+ for _, info in ipairs(result) do
+ if info.type == 'local' then
positions[#positions+1] = {
info.source.start,
info.source.finish,
@@ -15,20 +40,13 @@ local function parseResult(vm, result)
}
end
end
- if #positions == 0 then
- for _, info in ipairs(result.value) do
- if info.type == 'return'then
- positions[#positions+1] = {
- info.source.start,
- info.source.finish,
- info.source.uri,
- }
- end
- end
- end
+ end
+ elseif tp == 'field' then
+ if result.value.uri ~= vm.uri then
+ parseResultAcrossUri(positions, vm, result)
else
for _, info in ipairs(result) do
- if info.type == 'local' then
+ if info.type == 'set' then
positions[#positions+1] = {
info.source.start,
info.source.finish,
@@ -37,16 +55,6 @@ local function parseResult(vm, result)
end
end
end
- elseif tp == 'field' then
- for _, info in ipairs(result) do
- if info.type == 'set' then
- positions[#positions+1] = {
- info.source.start,
- info.source.finish,
- info.source.uri,
- }
- end
- end
elseif tp == 'label' then
for _, info in ipairs(result) do
if info.type == 'set' then
diff --git a/server/src/matcher/vm.lua b/server/src/matcher/vm.lua
index ecb07bd5..2eef1da2 100644
--- a/server/src/matcher/vm.lua
+++ b/server/src/matcher/vm.lua
@@ -580,6 +580,7 @@ function mt:createValue(tp, source, v)
type = tp,
source = source or DefaultSource,
value = v,
+ uri = self.uri,
}
local lib = library.object[tp]
if lib then