summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreaWalchshoferSCCH <122894794+AndreaWalchshoferSCCH@users.noreply.github.com>2023-03-22 09:00:56 +0100
committerGitHub <noreply@github.com>2023-03-22 09:00:56 +0100
commit759e2f8c303ed9985b1a7cb9ad4886d705576476 (patch)
treeb46768fb781b04e65e5aca9890e23a7adc0c7513
parent5b6542e8ff276a195c502cc2479b53685429eb2e (diff)
downloadlua-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.md17
-rw-r--r--doc/pt-br/config.md17
-rw-r--r--doc/zh-cn/config.md17
-rw-r--r--doc/zh-tw/config.md17
-rw-r--r--locale/en-us/script.lua2
-rw-r--r--locale/en-us/setting.lua2
-rw-r--r--locale/pt-br/script.lua2
-rw-r--r--locale/pt-br/setting.lua2
-rw-r--r--locale/zh-cn/script.lua2
-rw-r--r--locale/zh-cn/setting.lua2
-rw-r--r--locale/zh-tw/script.lua2
-rw-r--r--locale/zh-tw/setting.lua2
-rw-r--r--script/core/diagnostics/global-element.lua57
-rw-r--r--script/proto/diagnostic.lua8
-rw-r--r--test/diagnostics/global-element.lua97
-rw-r--r--test/diagnostics/init.lua1
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