diff options
author | 最萌小汐 <sumneko@hotmail.com> | 2024-07-15 14:20:03 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-15 14:20:03 +0800 |
commit | df30d05b5e4cd127cf44c9009664894edf907b8d (patch) | |
tree | 0d7db3bfdc2c6ff5ecf6279fb5db4317de1e238b | |
parent | 74a38036bc64940520502fc8f6a28f710ce42dbb (diff) | |
parent | 491ad2f40b2e2b6285dfe88558e3d8dd0c8395bd (diff) | |
download | lua-language-server-df30d05b5e4cd127cf44c9009664894edf907b8d.zip |
Merge branch 'master' into master
-rw-r--r-- | changelog.md | 4 | ||||
-rw-r--r-- | script/config/template.lua | 5 | ||||
-rw-r--r-- | script/core/diagnostics/inject-field.lua | 3 | ||||
-rw-r--r-- | script/core/hint.lua | 2 | ||||
-rw-r--r-- | script/provider/provider.lua | 4 | ||||
-rw-r--r-- | script/vm/visible.lua | 32 | ||||
-rw-r--r-- | test/diagnostics/inject-field.lua | 13 | ||||
-rw-r--r-- | test/diagnostics/invisible.lua | 56 |
8 files changed, 108 insertions, 11 deletions
diff --git a/changelog.md b/changelog.md index 68b6317b..a82efdab 100644 --- a/changelog.md +++ b/changelog.md @@ -8,6 +8,10 @@ * `FIX` Respect `completion.showParams` config for local function completion * `CHG` Improve performance of multithreaded `--check` and `undefined-field` diagnostic * `FIX` Addons can now self-recommend as expected. Fixed by correcting the `wholeMatch` function +* `FIX` Now correctly evaluates the visibility of fields in a class when they are defined directly in the object. use for completion and invisible dianostic. [#2752](https://github.com/LuaLS/lua-language-server/issues/2752) +* `NEW` added lua regular expression support for Lua.doc.<scope>Name [#2753](https://github.com/LuaLS/lua-language-server/pull/2753) +* `FIX` Bad triggering of the `inject-field` diagnostic, when the fields are declared at the creation of the object [#2746](https://github.com/LuaLS/lua-language-server/issues/2746) +* `CHG` Change spacing of parameter inlay hints to match other LSPs, like `rust-analyzer` ## 3.9.3 `2024-6-11` diff --git a/script/config/template.lua b/script/config/template.lua index e74a9f9c..7b044d7a 100644 --- a/script/config/template.lua +++ b/script/config/template.lua @@ -402,7 +402,10 @@ local template = { ['Lua.doc.privateName'] = Type.Array(Type.String), ['Lua.doc.protectedName'] = Type.Array(Type.String), ['Lua.doc.packageName'] = Type.Array(Type.String), - + ['Lua.doc.regengine'] = Type.String >> 'glob' << { + 'glob', + 'lua', + }, -- VSCode ["Lua.addonManager.enable"] = Type.Boolean >> true, ['files.associations'] = Type.Hash(Type.String, Type.String), diff --git a/script/core/diagnostics/inject-field.lua b/script/core/diagnostics/inject-field.lua index 2866eef8..e1ef02a3 100644 --- a/script/core/diagnostics/inject-field.lua +++ b/script/core/diagnostics/inject-field.lua @@ -68,6 +68,9 @@ return function (uri, callback) if def.type == 'doc.field' then return end + if def.type == 'tablefield' and not isExact then + return + end end local howToFix = '' diff --git a/script/core/hint.lua b/script/core/hint.lua index 67ac8516..9d098aa9 100644 --- a/script/core/hint.lua +++ b/script/core/hint.lua @@ -59,7 +59,7 @@ local function typeHint(uri, results, start, finish) end mark[src] = true results[#results+1] = { - text = ':' .. view, + text = ': ' .. view, offset = src.finish, kind = define.InlayHintKind.Type, where = 'right', diff --git a/script/provider/provider.lua b/script/provider/provider.lua index 15e78b9a..2e2fb5eb 100644 --- a/script/provider/provider.lua +++ b/script/provider/provider.lua @@ -1426,8 +1426,8 @@ m.register 'textDocument/inlayHint' { }, position = converter.packPosition(state, res.offset), kind = res.kind, - paddingLeft = res.kind == 1, - paddingRight = res.kind == 2, + paddingLeft = false, + paddingRight = res.kind == define.InlayHintKind.Parameter, } end return hintResults diff --git a/script/vm/visible.lua b/script/vm/visible.lua index 0f486d6b..518307a0 100644 --- a/script/vm/visible.lua +++ b/script/vm/visible.lua @@ -7,6 +7,19 @@ local glob = require 'glob' ---@class parser.object ---@field package _visibleType? parser.visibleType +local function globMatch(patterns, fieldName) + return glob.glob(patterns)(fieldName) +end + +local function luaMatch(patterns, fieldName) + for i = 1, #patterns do + if string.find(fieldName, patterns[i]) then + return true + end + end + return false +end + local function getVisibleType(source) if guide.isLiteral(source) then return 'public' @@ -42,21 +55,22 @@ local function getVisibleType(source) if type(fieldName) == 'string' then local uri = guide.getUri(source) - + local regengine = config.get(uri, 'Lua.doc.regengine') + local match = regengine == "glob" and globMatch or luaMatch local privateNames = config.get(uri, 'Lua.doc.privateName') - if #privateNames > 0 and glob.glob(privateNames)(fieldName) then + if #privateNames > 0 and match(privateNames, fieldName) then source._visibleType = 'private' return 'private' end - + local protectedNames = config.get(uri, 'Lua.doc.protectedName') - if #protectedNames > 0 and glob.glob(protectedNames)(fieldName) then + if #protectedNames > 0 and match(protectedNames, fieldName) then source._visibleType = 'protected' return 'protected' end - + local packageNames = config.get(uri, 'Lua.doc.packageName') - if #packageNames > 0 and glob.glob(packageNames)(fieldName) then + if #packageNames > 0 and match(packageNames, fieldName) then source._visibleType = 'package' return 'package' end @@ -96,10 +110,14 @@ function vm.getParentClass(source) if source.type == 'setfield' or source.type == 'setindex' or source.type == 'setmethod' - or source.type == 'tablefield' or source.type == 'tableindex' then return vm.getDefinedClass(guide.getUri(source), source.node) end + + if source.type == 'tablefield' then + return vm.getDefinedClass(guide.getUri(source), source.node) or + vm.getDefinedClass(guide.getUri(source), source.parent.parent) + end return nil end diff --git a/test/diagnostics/inject-field.lua b/test/diagnostics/inject-field.lua index 9bb0f8fc..d5b49701 100644 --- a/test/diagnostics/inject-field.lua +++ b/test/diagnostics/inject-field.lua @@ -82,3 +82,16 @@ function m:init() -- OK end end ]] + +TEST [[ +---@class Class +local m = { + xx = 1, -- OK +} + +---@type Class +local m + +m.xx = 1 -- OK +m.<!yy!> = 1 -- Warning +]] diff --git a/test/diagnostics/invisible.lua b/test/diagnostics/invisible.lua index 2fc6791e..4bb70fcc 100644 --- a/test/diagnostics/invisible.lua +++ b/test/diagnostics/invisible.lua @@ -85,11 +85,45 @@ local t2 print(t2.<!_id!>) ]] +TEST [[ +---@class A +local A = { + _id = 0 +} + +---@type A +local t + +print(t.<!_id!>) + +---@class B: A +local t2 + +print(t2.<!_id!>) +]] + config.set(nil, 'Lua.doc.privateName', nil) config.set(nil, 'Lua.doc.protectedName', { '_*' }) TEST [[ ---@class A +local A = { + _id = 0 +} + +---@type A +local t + +print(t.<!_id!>) + +---@class B: A +local t2 + +print(t2._id) +]] + +TEST [[ +---@class A ---@field _id number ---@type A @@ -104,6 +138,28 @@ print(t2._id) ]] config.set(nil, 'Lua.doc.protectedName', nil) +config.set(nil, 'Lua.doc.regengine', 'lua' ) +config.set(nil, 'Lua.doc.privateName', { '^_[%w_]*%w$' }) +config.set(nil, 'Lua.doc.protectedName', { '^_[%w_]*_$' }) +TEST [[ +---@class A +---@field _id_ number +---@field _user number + +---@type A +local t +print(t.<!_id_!>) +print(t.<!_user!>) + +---@class B: A +local t2 +print(t2._id_) +print(t2.<!_user!>) +]] +config.set(nil, 'Lua.doc.privateName', nil) +config.set(nil, 'Lua.doc.protectedName', nil) +config.set(nil, 'Lua.doc.regengine', nil ) + TEST [[ ---@class A ---@field private x number |