diff options
author | sumneko <sumneko@hotmail.com> | 2019-04-19 17:55:08 +0800 |
---|---|---|
committer | sumneko <sumneko@hotmail.com> | 2019-04-19 17:55:08 +0800 |
commit | ffeb9df51d7f440c004d41522990c6ebbadcc569 (patch) | |
tree | 1698ab520e6dfd3be74e60ce335973c31335076f /server | |
parent | 02631f902a8230e173bd46dd83193c69e06bb7f1 (diff) | |
download | lua-language-server-ffeb9df51d7f440c004d41522990c6ebbadcc569.zip |
暂存一下:type共用通过merge value实现,还要标记global
Diffstat (limited to 'server')
-rw-r--r-- | server/src/emmy/class.lua | 11 | ||||
-rw-r--r-- | server/src/emmy/manager.lua | 4 | ||||
-rw-r--r-- | server/src/emmy/type.lua | 10 | ||||
-rw-r--r-- | server/src/vm/local.lua | 1 | ||||
-rw-r--r-- | server/src/vm/value.lua | 9 | ||||
-rw-r--r-- | server/test/definition/emmy.lua | 11 |
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!>() +]] |