diff --git a/changelog.md b/changelog.md index 3590906ea..8ad44ec0e 100644 --- a/changelog.md +++ b/changelog.md @@ -7,6 +7,7 @@ * `NEW` Add support for lambda style functions, `|paramList| expr` is syntactic sugar for `function(paramList) return expr end` * `FIX` Respect `completion.showParams` config for local function completion * `CHG` Improve performance of multithreaded `--check` and `undefined-field` diagnostic +* `NEW` added lua regular expression support for Lua.doc.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` diff --git a/script/config/template.lua b/script/config/template.lua index e74a9f9cd..7b044d7aa 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/vm/visible.lua b/script/vm/visible.lua index 0f486d6bb..a085be086 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 diff --git a/test/diagnostics/invisible.lua b/test/diagnostics/invisible.lua index 2fc6791e8..ed67df7e6 100644 --- a/test/diagnostics/invisible.lua +++ b/test/diagnostics/invisible.lua @@ -104,6 +104,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.) +print(t.) + +---@class B: A +local t2 +print(t2._id_) +print(t2.) +]] +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