diff options
author | AndreaWalchshoferSCCH <122894794+AndreaWalchshoferSCCH@users.noreply.github.com> | 2023-03-22 09:00:56 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-22 09:00:56 +0100 |
commit | 759e2f8c303ed9985b1a7cb9ad4886d705576476 (patch) | |
tree | b46768fb781b04e65e5aca9890e23a7adc0c7513 | |
parent | 5b6542e8ff276a195c502cc2479b53685429eb2e (diff) | |
download | lua-language-server-759e2f8c303ed9985b1a7cb9ad4886d705576476.zip |
Add diagnostic warning about any global (#1)
* Add warning for any global variable via diagnostic
* Add messages in en-US
TODO: add messages in languages other than en-us as well
* fallback: enable/disable diagnostics w/ annotation
* Add tests for the new diagnostic
* Add diagnostic and group to config.md
-rw-r--r-- | doc/en-us/config.md | 17 | ||||
-rw-r--r-- | doc/pt-br/config.md | 17 | ||||
-rw-r--r-- | doc/zh-cn/config.md | 17 | ||||
-rw-r--r-- | doc/zh-tw/config.md | 17 | ||||
-rw-r--r-- | locale/en-us/script.lua | 2 | ||||
-rw-r--r-- | locale/en-us/setting.lua | 2 | ||||
-rw-r--r-- | locale/pt-br/script.lua | 2 | ||||
-rw-r--r-- | locale/pt-br/setting.lua | 2 | ||||
-rw-r--r-- | locale/zh-cn/script.lua | 2 | ||||
-rw-r--r-- | locale/zh-cn/setting.lua | 2 | ||||
-rw-r--r-- | locale/zh-tw/script.lua | 2 | ||||
-rw-r--r-- | locale/zh-tw/setting.lua | 2 | ||||
-rw-r--r-- | script/core/diagnostics/global-element.lua | 57 | ||||
-rw-r--r-- | script/proto/diagnostic.lua | 8 | ||||
-rw-r--r-- | test/diagnostics/global-element.lua | 97 | ||||
-rw-r--r-- | test/diagnostics/init.lua | 1 |
16 files changed, 247 insertions, 0 deletions
diff --git a/doc/en-us/config.md b/doc/en-us/config.md index 2d519824..0e5d09ee 100644 --- a/doc/en-us/config.md +++ b/doc/en-us/config.md @@ -238,6 +238,7 @@ Array<string> * ``"err-nonstandard-symbol"`` * ``"err-then-as-do"`` * ``"exp-in-action"`` +* ``"global-element"`` * ``"global-in-nil-env"`` * ``"index-in-func-name"`` * ``"invisible"`` @@ -468,6 +469,10 @@ object<string, string> */ "strict": "Fallback", /* + * global-element + */ + "strict-convention": "None", + /* * no-unknown */ "strong": "Fallback", @@ -587,6 +592,10 @@ object<string, string> */ "strict": "Fallback", /* + * global-element + */ + "strict-convention": "Fallback", + /* * no-unknown */ "strong": "Fallback", @@ -775,6 +784,10 @@ object<string, string> */ "empty-block": "Opened", /* + Enable diagnostics to warn about global elements. + */ + "global-element": "None", + /* Enable cannot use global variables ( `_ENV` is set to `nil`) diagnostics. */ "global-in-nil-env": "Any", @@ -1023,6 +1036,10 @@ object<string, string> */ "empty-block": "Hint", /* + Enable diagnostics to warn about global elements. + */ + "global-element": "Warning", + /* Enable cannot use global variables ( `_ENV` is set to `nil`) diagnostics. */ "global-in-nil-env": "Warning", diff --git a/doc/pt-br/config.md b/doc/pt-br/config.md index 24cf8d3b..762f2259 100644 --- a/doc/pt-br/config.md +++ b/doc/pt-br/config.md @@ -238,6 +238,7 @@ Array<string> * ``"err-nonstandard-symbol"`` * ``"err-then-as-do"`` * ``"exp-in-action"`` +* ``"global-element"`` * ``"global-in-nil-env"`` * ``"index-in-func-name"`` * ``"invisible"`` @@ -468,6 +469,10 @@ object<string, string> */ "strict": "Fallback", /* + * global-element + */ + "strict-convention": "None", + /* * no-unknown */ "strong": "Fallback", @@ -587,6 +592,10 @@ object<string, string> */ "strict": "Fallback", /* + * global-element + */ + "strict-convention": "Fallback", + /* * no-unknown */ "strong": "Fallback", @@ -775,6 +784,10 @@ object<string, string> */ "empty-block": "Opened", /* + Enable diagnostics to warn about global elements. + */ + "global-element": "None", + /* 不能使用全局变量( `_ENV` 被设置为了 `nil`) */ "global-in-nil-env": "Any", @@ -1023,6 +1036,10 @@ object<string, string> */ "empty-block": "Hint", /* + Enable diagnostics to warn about global elements. + */ + "global-element": "Warning", + /* 不能使用全局变量( `_ENV` 被设置为了 `nil`) */ "global-in-nil-env": "Warning", diff --git a/doc/zh-cn/config.md b/doc/zh-cn/config.md index 991932b6..869e2506 100644 --- a/doc/zh-cn/config.md +++ b/doc/zh-cn/config.md @@ -238,6 +238,7 @@ Array<string> * ``"err-nonstandard-symbol"`` * ``"err-then-as-do"`` * ``"exp-in-action"`` +* ``"global-element"`` * ``"global-in-nil-env"`` * ``"index-in-func-name"`` * ``"invisible"`` @@ -468,6 +469,10 @@ object<string, string> */ "strict": "Fallback", /* + * global-element + */ + "strict-convention": "None", + /* * no-unknown */ "strong": "Fallback", @@ -587,6 +592,10 @@ object<string, string> */ "strict": "Fallback", /* + * global-element + */ + "strict-convention": "Fallback", + /* * no-unknown */ "strong": "Fallback", @@ -775,6 +784,10 @@ object<string, string> */ "empty-block": "Opened", /* + Enable diagnostics to warn about global elements. + */ + "global-element": "None", + /* 不能使用全局变量( `_ENV` 被设置为了 `nil`) */ "global-in-nil-env": "Any", @@ -1022,6 +1035,10 @@ object<string, string> */ "empty-block": "Hint", /* + Enable diagnostics to warn about global elements. + */ + "global-element": "Warning", + /* 不能使用全局变量( `_ENV` 被设置为了 `nil`) */ "global-in-nil-env": "Warning", diff --git a/doc/zh-tw/config.md b/doc/zh-tw/config.md index 83cef315..c922ad6b 100644 --- a/doc/zh-tw/config.md +++ b/doc/zh-tw/config.md @@ -238,6 +238,7 @@ Array<string> * ``"err-nonstandard-symbol"`` * ``"err-then-as-do"`` * ``"exp-in-action"`` +* ``"global-element"`` * ``"global-in-nil-env"`` * ``"index-in-func-name"`` * ``"invisible"`` @@ -468,6 +469,10 @@ object<string, string> */ "strict": "Fallback", /* + * global-element + */ + "strict-convention": "None", + /* * no-unknown */ "strong": "Fallback", @@ -587,6 +592,10 @@ object<string, string> */ "strict": "Fallback", /* + * global-element + */ + "strict-convention": "Fallback", + /* * no-unknown */ "strong": "Fallback", @@ -775,6 +784,10 @@ object<string, string> */ "empty-block": "Opened", /* + Enable diagnostics to warn about global elements. + */ + "global-element": "None", + /* 不能使用全域變數( `_ENV` 被設定為 `nil`) */ "global-in-nil-env": "Any", @@ -1022,6 +1035,10 @@ object<string, string> */ "empty-block": "Hint", /* + Enable diagnostics to warn about global elements. + */ + "global-element": "Warning", + /* 不能使用全域變數( `_ENV` 被設定為 `nil`) */ "global-in-nil-env": "Warning", diff --git a/locale/en-us/script.lua b/locale/en-us/script.lua index 4b74fa51..2a13214f 100644 --- a/locale/en-us/script.lua +++ b/locale/en-us/script.lua @@ -150,6 +150,8 @@ DIAG_INVISIBLE_PROTECTED = 'Field `{field}` is protected, it can only be accessed in class `{class}` and its subclasses.' DIAG_INVISIBLE_PACKAGE = 'Field `{field}` can only be accessed in same file `{uri}`.' +DIAG_GLOBAL_ELEMENT = +'Element is global.' MWS_NOT_SUPPORT = '{} does not support multi workspace for now, I may need to restart to support the new workspace ...' diff --git a/locale/en-us/setting.lua b/locale/en-us/setting.lua index 18840e94..9f606cd7 100644 --- a/locale/en-us/setting.lua +++ b/locale/en-us/setting.lua @@ -415,6 +415,8 @@ config.diagnostics['unknown-operator'] = 'Enable diagnostics for unknown operators.' config.diagnostics['unreachable-code'] = 'Enable diagnostics for unreachable code.' +config.diagnostics['global-element'] = +'Enable diagnostics to warn about global elements.' config.typeFormat.config = 'Configures the formatting behavior while typing Lua code.' config.typeFormat.config.auto_complete_end = diff --git a/locale/pt-br/script.lua b/locale/pt-br/script.lua index d2a7c314..affcd893 100644 --- a/locale/pt-br/script.lua +++ b/locale/pt-br/script.lua @@ -150,6 +150,8 @@ DIAG_INVISIBLE_PROTECTED = -- TODO: need translate! 'Field `{field}` is protected, it can only be accessed in class `{class}` and its subclasses.' DIAG_INVISIBLE_PACKAGE = -- TODO: need translate! 'Field `{field}` can only be accessed in same file `{uri}`.' +DIAG_GLOBAL_ELEMENT = -- TODO: need translate! +'Element is global.' MWS_NOT_SUPPORT = '{} não é suportado múltiplos espaços de trabalho por enquanto, posso precisar reiniciar para estabelecer um novo espaço de trabalho ...' diff --git a/locale/pt-br/setting.lua b/locale/pt-br/setting.lua index 75904872..95f26b76 100644 --- a/locale/pt-br/setting.lua +++ b/locale/pt-br/setting.lua @@ -415,6 +415,8 @@ config.diagnostics['unknown-operator'] = -- TODO: need translate! 'Enable diagnostics for unknown operators.' config.diagnostics['unreachable-code'] = -- TODO: need translate! 'Enable diagnostics for unreachable code.' +config.diagnostics['global-element'] = -- TODO: need translate! +'Enable diagnostics to warn about global elements.' config.typeFormat.config = -- TODO: need translate! 'Configures the formatting behavior while typing Lua code.' config.typeFormat.config.auto_complete_end = -- TODO: need translate! diff --git a/locale/zh-cn/script.lua b/locale/zh-cn/script.lua index 531b54ae..f6f639ea 100644 --- a/locale/zh-cn/script.lua +++ b/locale/zh-cn/script.lua @@ -150,6 +150,8 @@ DIAG_INVISIBLE_PROTECTED = '字段 `{field}` 受到保护,只能在 `{class}` 类极其子类中才能访问。' DIAG_INVISIBLE_PACKAGE = '字段 `{field}` 只能在相同的文件 `{uri}` 中才能访问。' +DIAG_GLOBAL_ELEMENT = -- TODO: need translate! +'Element is global.' MWS_NOT_SUPPORT = '{} 目前还不支持多工作目录,我可能需要重启才能支持新的工作目录...' diff --git a/locale/zh-cn/setting.lua b/locale/zh-cn/setting.lua index d488ac3f..731190e2 100644 --- a/locale/zh-cn/setting.lua +++ b/locale/zh-cn/setting.lua @@ -414,6 +414,8 @@ config.diagnostics['unknown-operator'] = -- TODO: need translate! 'Enable diagnostics for unknown operators.' config.diagnostics['unreachable-code'] = -- TODO: need translate! 'Enable diagnostics for unreachable code.' +config.diagnostics['global-element'] = -- TODO: need translate! +'Enable diagnostics to warn about global elements.' config.typeFormat.config = -- TODO: need translate! 'Configures the formatting behavior while typing Lua code.' config.typeFormat.config.auto_complete_end = -- TODO: need translate! diff --git a/locale/zh-tw/script.lua b/locale/zh-tw/script.lua index d6e93a43..4d9a89ad 100644 --- a/locale/zh-tw/script.lua +++ b/locale/zh-tw/script.lua @@ -150,6 +150,8 @@ DIAG_INVISIBLE_PROTECTED = -- TODO: need translate! 'Field `{field}` is protected, it can only be accessed in class `{class}` and its subclasses.' DIAG_INVISIBLE_PACKAGE = -- TODO: need translate! 'Field `{field}` can only be accessed in same file `{uri}`.' +DIAG_GLOBAL_ELEMENT = -- TODO: need translate! +'Element is global.' MWS_NOT_SUPPORT = '{} 目前還不支援多工作目錄,我可能需要重新啟動才能支援新的工作目錄...' diff --git a/locale/zh-tw/setting.lua b/locale/zh-tw/setting.lua index 8c74668d..fd363d3f 100644 --- a/locale/zh-tw/setting.lua +++ b/locale/zh-tw/setting.lua @@ -414,6 +414,8 @@ config.diagnostics['unknown-operator'] = -- TODO: need translate! 'Enable diagnostics for unknown operators.' config.diagnostics['unreachable-code'] = -- TODO: need translate! 'Enable diagnostics for unreachable code.' +config.diagnostics['global-element'] = -- TODO: need translate! +'Enable diagnostics to warn about global elements.' config.typeFormat.config = -- TODO: need translate! 'Configures the formatting behavior while typing Lua code.' config.typeFormat.config.auto_complete_end = -- TODO: need translate! diff --git a/script/core/diagnostics/global-element.lua b/script/core/diagnostics/global-element.lua new file mode 100644 index 00000000..e9dd46ce --- /dev/null +++ b/script/core/diagnostics/global-element.lua @@ -0,0 +1,57 @@ +local files = require 'files' +local guide = require 'parser.guide' +local lang = require 'language' +local config = require 'config' +local vm = require 'vm' +local util = require 'utility' + +local function isDocClass(source) + if not source.bindDocs then + return false + end + for _, doc in ipairs(source.bindDocs) do + if doc.type == 'doc.class' then + return true + end + end + return false +end + +-- If global elements are discouraged by coding convention, this diagnostic helps with reminding about that +-- Exceptions may be added to Lua.diagnostics.globals +return function (uri, callback) + local ast = files.getState(uri) + if not ast then + return + end + + local definedGlobal = util.arrayToHash(config.get(uri, 'Lua.diagnostics.globals')) + + guide.eachSourceType(ast.ast, 'setglobal', function (source) + local name = guide.getKeyName(source) + if not name or definedGlobal[name] then + return + end + -- If the assignment is marked as doc.class, then it is considered allowed + if isDocClass(source) then + return + end + if definedGlobal[name] == nil then + definedGlobal[name] = false + local global = vm.getGlobal('variable', name) + if global then + for _, set in ipairs(global:getSets(uri)) do + if vm.isMetaFile(guide.getUri(set)) then + definedGlobal[name] = true + return + end + end + end + end + callback { + start = source.start, + finish = source.finish, + message = lang.script.DIAG_GLOBAL_ELEMENT, + } + end) +end diff --git a/script/proto/diagnostic.lua b/script/proto/diagnostic.lua index ceb42f8b..bea7c160 100644 --- a/script/proto/diagnostic.lua +++ b/script/proto/diagnostic.lua @@ -172,6 +172,14 @@ m.register { } m.register { + 'global-element', +} { + group = 'strict-conventions', + severity = 'Warning', + status = 'None' +} + +m.register { 'duplicate-index', } { group = 'duplicate', diff --git a/test/diagnostics/global-element.lua b/test/diagnostics/global-element.lua new file mode 100644 index 00000000..176fda79 --- /dev/null +++ b/test/diagnostics/global-element.lua @@ -0,0 +1,97 @@ +local config = require 'config' +local util = require 'utility' + +-- disable all default groups to make isolated tests +config.set(nil, 'Lua.diagnostics.groupFileStatus', +{ + ['ambiguity'] = 'None', + ['await'] = 'None', + ['codestyle'] = 'None', + ['strict-conventions'] = 'None', + ['duplicate'] = 'None', + ['global'] = 'None', + ['luadoc'] = 'None', + ['redefined'] = 'None', + ['strict'] = 'None', + ['strong'] = 'None', + ['type-check'] = 'None', + ['unbalanced'] = 'None', + ['unused'] = 'None' +}) + +-- enable single diagnostic that is to be tested +config.set(nil, 'Lua.diagnostics.neededFileStatus', +{ + ['global-element'] = 'Any!' -- override groupFileStatus +}) + +-- check that local elements are not warned about +TEST [[ +local x = 123 +x = 321 +<!Y!> = "global" +<!z!> = "global" +]] + +TEST [[ +local function test1() + print() +end + +function <!Test2!>() + print() +end +]] + +TEST [[ +local function closure1() + local elem1 = 1 + <!elem2!> = 2 +end + +function <!Closure2!>() + local elem1 = 1 + <!elem2!> = 2 +end +]] + +-- add elements to exemption list +config.set(nil, 'Lua.diagnostics.globals', +{ + 'GLOBAL1', + 'GLOBAL2', + 'GLOBAL_CLOSURE' +}) + +TEST [[ +GLOBAL1 = "allowed" +<!global2!> = "not allowed" +<!GLOBAL3!> = "not allowed" +]] + +TEST [[ +function GLOBAL1() + print() +end +]] + +TEST [[ +local function closure1() + local elem1 = 1 + GLOBAL1 = 2 +end + +function GLOBAL_CLOSURE() + local elem1 = 1 + GLOBAL2 = 2 + <!elem2!> = 2 +end +]] + +-- reset configurations +config.set(nil, 'Lua.diagnostics.groupFileStatus', +{}) +config.set(nil, 'Lua.diagnostics.neededFileStatus', +{}) +config.set(nil, 'Lua.diagnostics.globals', +{})
\ No newline at end of file diff --git a/test/diagnostics/init.lua b/test/diagnostics/init.lua index 827d4d08..4025dd8c 100644 --- a/test/diagnostics/init.lua +++ b/test/diagnostics/init.lua @@ -86,3 +86,4 @@ end require 'diagnostics.common' require 'diagnostics.type-check' +require 'diagnostics.global-element'
\ No newline at end of file |