summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authorsumneko <sumneko@hotmail.com>2019-04-19 17:55:08 +0800
committersumneko <sumneko@hotmail.com>2019-04-19 17:55:08 +0800
commitffeb9df51d7f440c004d41522990c6ebbadcc569 (patch)
tree1698ab520e6dfd3be74e60ce335973c31335076f /server
parent02631f902a8230e173bd46dd83193c69e06bb7f1 (diff)
downloadlua-language-server-ffeb9df51d7f440c004d41522990c6ebbadcc569.zip
暂存一下:type共用通过merge value实现,还要标记global
Diffstat (limited to 'server')
-rw-r--r--server/src/emmy/class.lua11
-rw-r--r--server/src/emmy/manager.lua4
-rw-r--r--server/src/emmy/type.lua10
-rw-r--r--server/src/vm/local.lua1
-rw-r--r--server/src/vm/value.lua9
-rw-r--r--server/test/definition/emmy.lua11
6 files changed, 40 insertions, 6 deletions
diff --git a/server/src/emmy/class.lua b/server/src/emmy/class.lua
index f1101e91..5e87181d 100644
--- a/server/src/emmy/class.lua
+++ b/server/src/emmy/class.lua
@@ -16,11 +16,20 @@ function mt:getSource()
return listMgr.get(self.source)
end
-return function (source)
+function mt:setValue(value)
+ self.value = value
+end
+
+function mt:getValue()
+ return self.value
+end
+
+return function (manager, source)
local self = setmetatable({
name = source[1][1],
source = source.id,
extends = source[2] and source[2][1],
+ _manager = manager,
}, mt)
return self
end
diff --git a/server/src/emmy/manager.lua b/server/src/emmy/manager.lua
index cd5c97f7..a3de42df 100644
--- a/server/src/emmy/manager.lua
+++ b/server/src/emmy/manager.lua
@@ -70,12 +70,12 @@ function mt:addClass(source)
}
self._class[className] = list
end
- list[source.id] = newClass(source)
+ list[source.id] = newClass(self, source)
return list[source.id]
end
function mt:createType(source)
- return newType(source)
+ return newType(self, source)
end
function mt:remove()
diff --git a/server/src/emmy/type.lua b/server/src/emmy/type.lua
index 84b43144..c2195810 100644
--- a/server/src/emmy/type.lua
+++ b/server/src/emmy/type.lua
@@ -24,10 +24,18 @@ function mt:getSource()
return listMgr.get(self.source)
end
-return function (source)
+function mt:getClass()
+ local class = self._manager:eachClass(self.name, function (class)
+ return class
+ end)
+ return class
+end
+
+return function (manager, source)
local self = setmetatable({
name = buildName(source),
source = source.id,
+ _manager = manager,
}, mt)
return self
end
diff --git a/server/src/vm/local.lua b/server/src/vm/local.lua
index d047b106..618214ff 100644
--- a/server/src/vm/local.lua
+++ b/server/src/vm/local.lua
@@ -143,7 +143,6 @@ function mt:setEmmy(emmy)
if emmy.type ~= 'emmy.class' and emmy.type ~= 'emmy.type' then
return
end
- self._emmy = emmy
if self.value then
self.value:setEmmy(emmy)
end
diff --git a/server/src/vm/value.lua b/server/src/vm/value.lua
index b3cc5f80..19aa1ee4 100644
--- a/server/src/vm/value.lua
+++ b/server/src/vm/value.lua
@@ -522,7 +522,14 @@ function mt:setEmmy(emmy)
if not emmy then
return
end
- if emmy.type ~= 'emmy.class' and emmy.type ~= 'emmy.type' then
+ if emmy.type == 'emmy.class' then
+ emmy:setValue(self)
+ elseif emmy.type == 'emmy.type' then
+ local class = emmy:getClass()
+ if class then
+ self:mergeValue(class:getValue())
+ end
+ else
return
end
self._emmy = emmy
diff --git a/server/test/definition/emmy.lua b/server/test/definition/emmy.lua
index 5761d312..8b6e8036 100644
--- a/server/test/definition/emmy.lua
+++ b/server/test/definition/emmy.lua
@@ -7,3 +7,14 @@ TEST [[
---@class <!A!>
---@type B|<?A?>
]]
+
+TEST [[
+---@class A
+local mt = {}
+function mt:<?cast?>()
+end
+
+---@type A
+local obj
+obj:<!cast!>()
+]]