summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/en-us/config.md22
-rw-r--r--doc/pt-br/config.md21
-rw-r--r--doc/zh-cn/config.md22
-rw-r--r--doc/zh-tw/config.md22
-rw-r--r--locale/en-us/script.lua10
-rw-r--r--locale/en-us/setting.lua4
-rw-r--r--locale/pt-br/script.lua12
-rw-r--r--locale/pt-br/setting.lua4
-rw-r--r--locale/zh-cn/script.lua10
-rw-r--r--locale/zh-cn/setting.lua4
-rw-r--r--locale/zh-tw/script.lua10
-rw-r--r--locale/zh-tw/setting.lua4
-rw-r--r--script/core/diagnostics/incomplete-signature-doc.lua91
-rw-r--r--script/core/diagnostics/missing-global-doc.lua98
-rw-r--r--script/proto/diagnostic.lua9
-rw-r--r--test/diagnostics/incomplete-signature-doc.lua331
-rw-r--r--test/diagnostics/init.lua3
-rw-r--r--test/diagnostics/missing-global-doc.lua333
18 files changed, 1009 insertions, 1 deletions
diff --git a/doc/en-us/config.md b/doc/en-us/config.md
index 9e6fa64c..4319901c 100644
--- a/doc/en-us/config.md
+++ b/doc/en-us/config.md
@@ -240,6 +240,7 @@ Array<string>
* ``"exp-in-action"``
* ``"global-element"``
* ``"global-in-nil-env"``
+* ``"incomplete-signature-doc"``
* ``"index-in-func-name"``
* ``"invisible"``
* ``"jump-local-scope"``
@@ -284,6 +285,7 @@ Array<string>
* ``"miss-sep-in-table"``
* ``"miss-space-between"``
* ``"miss-symbol"``
+* ``"missing-global-doc"``
* ``"missing-parameter"``
* ``"missing-return"``
* ``"missing-return-value"``
@@ -450,6 +452,8 @@ object<string, string>
* duplicate-doc-alias
* duplicate-doc-field
* duplicate-doc-param
+ * incomplete-signature-doc
+ * missing-global-doc
* undefined-doc-class
* undefined-doc-name
* undefined-doc-param
@@ -574,6 +578,8 @@ object<string, string>
* duplicate-doc-alias
* duplicate-doc-field
* duplicate-doc-param
+ * incomplete-signature-doc
+ * missing-global-doc
* undefined-doc-class
* undefined-doc-name
* undefined-doc-param
@@ -795,6 +801,10 @@ object<string, string>
*/
"global-in-nil-env": "Any",
/*
+ Enable diagnostics for function definitions which are not fully annotated.
+ */
+ "incomplete-signature-doc": "None",
+ /*
Enable diagnostics for accesses to fields which are invisible.
*/
"invisible": "Any",
@@ -803,6 +813,10 @@ object<string, string>
*/
"lowercase-global": "Any",
/*
+ Enable diagnostics for global function definitions which are not fully annotated.
+ */
+ "missing-global-doc": "None",
+ /*
Enable diagnostics for function calls where the number of arguments is less than the number of annotated function parameters.
*/
"missing-parameter": "Any",
@@ -1051,6 +1065,10 @@ object<string, string>
*/
"global-in-nil-env": "Warning",
/*
+ Enable diagnostics for function definitions which are not fully annotated.
+ */
+ "incomplete-signature-doc": "Warning",
+ /*
Enable diagnostics for accesses to fields which are invisible.
*/
"invisible": "Warning",
@@ -1059,6 +1077,10 @@ object<string, string>
*/
"lowercase-global": "Information",
/*
+ Enable diagnostics for global function definitions which are not annotated.
+ */
+ "missing-global-doc": "Warning",
+ /*
Enable diagnostics for function calls where the number of arguments is less than the number of annotated function parameters.
*/
"missing-parameter": "Warning",
diff --git a/doc/pt-br/config.md b/doc/pt-br/config.md
index 6e2f58a0..c3ab1107 100644
--- a/doc/pt-br/config.md
+++ b/doc/pt-br/config.md
@@ -240,6 +240,7 @@ Array<string>
* ``"exp-in-action"``
* ``"global-element"``
* ``"global-in-nil-env"``
+* ``"incomplete-signature-doc"``
* ``"index-in-func-name"``
* ``"invisible"``
* ``"jump-local-scope"``
@@ -284,6 +285,7 @@ Array<string>
* ``"miss-sep-in-table"``
* ``"miss-space-between"``
* ``"miss-symbol"``
+* ``"missing-global-doc"``
* ``"missing-parameter"``
* ``"missing-return"``
* ``"missing-return-value"``
@@ -450,6 +452,8 @@ object<string, string>
* duplicate-doc-alias
* duplicate-doc-field
* duplicate-doc-param
+ * incomplete-signature-doc
+ * missing-global-doc
* undefined-doc-class
* undefined-doc-name
* undefined-doc-param
@@ -574,6 +578,7 @@ object<string, string>
* duplicate-doc-alias
* duplicate-doc-field
* duplicate-doc-param
+ * incomplete-signature-doc
* undefined-doc-class
* undefined-doc-name
* undefined-doc-param
@@ -795,6 +800,10 @@ object<string, string>
*/
"global-in-nil-env": "Any",
/*
+ Enable diagnostics for function definitions which are not fully annotated.
+ */
+ "incomplete-signature-doc": "None",
+ /*
Enable diagnostics for accesses to fields which are invisible.
*/
"invisible": "Any",
@@ -803,6 +812,10 @@ object<string, string>
*/
"lowercase-global": "Any",
/*
+ Enable diagnostics for global function definitions which are not fully annotated.
+ */
+ "missing-global-doc": "None",
+ /*
Enable diagnostics for function calls where the number of arguments is less than the number of annotated function parameters.
*/
"missing-parameter": "Any",
@@ -1051,6 +1064,10 @@ object<string, string>
*/
"global-in-nil-env": "Warning",
/*
+ Enable diagnostics for function definitions which are not fully annotated.
+ */
+ "incomplete-signature-doc": "Warning",
+ /*
Enable diagnostics for accesses to fields which are invisible.
*/
"invisible": "Warning",
@@ -1059,6 +1076,10 @@ object<string, string>
*/
"lowercase-global": "Information",
/*
+ Enable diagnostics for global function definitions which are not annotated.
+ */
+ "missing-global-doc": "Warning",
+ /*
Enable diagnostics for function calls where the number of arguments is less than the number of annotated function parameters.
*/
"missing-parameter": "Warning",
diff --git a/doc/zh-cn/config.md b/doc/zh-cn/config.md
index 1cacfed3..32a6db68 100644
--- a/doc/zh-cn/config.md
+++ b/doc/zh-cn/config.md
@@ -240,6 +240,7 @@ Array<string>
* ``"exp-in-action"``
* ``"global-element"``
* ``"global-in-nil-env"``
+* ``"incomplete-signature-doc"``
* ``"index-in-func-name"``
* ``"invisible"``
* ``"jump-local-scope"``
@@ -284,6 +285,7 @@ Array<string>
* ``"miss-sep-in-table"``
* ``"miss-space-between"``
* ``"miss-symbol"``
+* ``"missing-global-doc"``
* ``"missing-parameter"``
* ``"missing-return"``
* ``"missing-return-value"``
@@ -450,6 +452,8 @@ object<string, string>
* duplicate-doc-alias
* duplicate-doc-field
* duplicate-doc-param
+ * incomplete-signature-doc
+ * missing-global-doc
* undefined-doc-class
* undefined-doc-name
* undefined-doc-param
@@ -574,6 +578,8 @@ object<string, string>
* duplicate-doc-alias
* duplicate-doc-field
* duplicate-doc-param
+ * incomplete-signature-doc
+ * missing-global-doc
* undefined-doc-class
* undefined-doc-name
* undefined-doc-param
@@ -795,6 +801,10 @@ object<string, string>
*/
"global-in-nil-env": "Any",
/*
+ Enable diagnostics for function definitions which are not fully annotated.
+ */
+ "incomplete-signature-doc": "None",
+ /*
Enable diagnostics for accesses to fields which are invisible.
*/
"invisible": "Any",
@@ -803,6 +813,10 @@ object<string, string>
*/
"lowercase-global": "Any",
/*
+ Enable diagnostics for global function definitions which are not fully annotated.
+ */
+ "missing-global-doc": "None",
+ /*
Enable diagnostics for function calls where the number of arguments is less than the number of annotated function parameters.
*/
"missing-parameter": "Any",
@@ -1050,6 +1064,10 @@ object<string, string>
*/
"global-in-nil-env": "Warning",
/*
+ Enable diagnostics for function definitions which are not fully annotated.
+ */
+ "incomplete-signature-doc": "Warning",
+ /*
Enable diagnostics for accesses to fields which are invisible.
*/
"invisible": "Warning",
@@ -1058,6 +1076,10 @@ object<string, string>
*/
"lowercase-global": "Information",
/*
+ Enable diagnostics for global function definitions which are not annotated.
+ */
+ "missing-global-doc": "Warning",
+ /*
Enable diagnostics for function calls where the number of arguments is less than the number of annotated function parameters.
*/
"missing-parameter": "Warning",
diff --git a/doc/zh-tw/config.md b/doc/zh-tw/config.md
index 78e565f2..bc9dae01 100644
--- a/doc/zh-tw/config.md
+++ b/doc/zh-tw/config.md
@@ -240,6 +240,7 @@ Array<string>
* ``"exp-in-action"``
* ``"global-element"``
* ``"global-in-nil-env"``
+* ``"incomplete-signature-doc"``
* ``"index-in-func-name"``
* ``"invisible"``
* ``"jump-local-scope"``
@@ -284,6 +285,7 @@ Array<string>
* ``"miss-sep-in-table"``
* ``"miss-space-between"``
* ``"miss-symbol"``
+* ``"missing-global-doc"``
* ``"missing-parameter"``
* ``"missing-return"``
* ``"missing-return-value"``
@@ -450,6 +452,8 @@ object<string, string>
* duplicate-doc-alias
* duplicate-doc-field
* duplicate-doc-param
+ * incomplete-signature-doc
+ * missing-global-doc
* undefined-doc-class
* undefined-doc-name
* undefined-doc-param
@@ -574,6 +578,8 @@ object<string, string>
* duplicate-doc-alias
* duplicate-doc-field
* duplicate-doc-param
+ * incomplete-signature-doc
+ * missing-global-doc
* undefined-doc-class
* undefined-doc-name
* undefined-doc-param
@@ -795,6 +801,10 @@ object<string, string>
*/
"global-in-nil-env": "Any",
/*
+ Enable diagnostics for function definitions which are not fully annotated.
+ */
+ "incomplete-signature-doc": "None",
+ /*
Enable diagnostics for accesses to fields which are invisible.
*/
"invisible": "Any",
@@ -803,6 +813,10 @@ object<string, string>
*/
"lowercase-global": "Any",
/*
+ Enable diagnostics for global function definitions which are not fully annotated.
+ */
+ "missing-global-doc": "None",
+ /*
Enable diagnostics for function calls where the number of arguments is less than the number of annotated function parameters.
*/
"missing-parameter": "Any",
@@ -1050,6 +1064,10 @@ object<string, string>
*/
"global-in-nil-env": "Warning",
/*
+ Enable diagnostics for function definitions which are not fully annotated.
+ */
+ "incomplete-signature-doc": "Warning",
+ /*
Enable diagnostics for accesses to fields which are invisible.
*/
"invisible": "Warning",
@@ -1058,6 +1076,10 @@ object<string, string>
*/
"lowercase-global": "Information",
/*
+ Enable diagnostics for global function definitions which are not annotated.
+ */
+ "missing-global-doc": "Warning",
+ /*
Enable diagnostics for function calls where the number of arguments is less than the number of annotated function parameters.
*/
"missing-parameter": "Warning",
diff --git a/locale/en-us/script.lua b/locale/en-us/script.lua
index e7f4b98b..6742b784 100644
--- a/locale/en-us/script.lua
+++ b/locale/en-us/script.lua
@@ -114,6 +114,16 @@ DIAG_UNDEFINED_DOC_NAME =
'Undefined type or alias `{}`.'
DIAG_UNDEFINED_DOC_PARAM =
'Undefined param `{}`.'
+DIAG_MISSING_GLOBAL_DOC_COMMENT =
+'Missing comment for global function `{}`.'
+DIAG_MISSING_GLOBAL_DOC_PARAM =
+'Missing @param annotation for parameter `{}` in global function `{}`.'
+DIAG_MISSING_GLOBAL_DOC_RETURN =
+'Missing @return annotation at index `{}` in global function `{}`.'
+DIAG_INCOMPLETE_SIGNATURE_DOC_PARAM =
+'Incomplete signature. Missing @param annotation for parameter `{}` in function `{}`.'
+DIAG_INCOMPLETE_SIGNATURE_DOC_RETURN =
+'Incomplete signature. Missing @return annotation at index `{}` in function `{}`.'
DIAG_UNKNOWN_DIAG_CODE =
'Unknown diagnostic code `{}`.'
DIAG_CAST_LOCAL_TYPE =
diff --git a/locale/en-us/setting.lua b/locale/en-us/setting.lua
index b03e3e43..4b34042f 100644
--- a/locale/en-us/setting.lua
+++ b/locale/en-us/setting.lua
@@ -373,8 +373,12 @@ config.diagnostics['duplicate-doc-param'] =
'Enable diagnostics for a duplicated param annotation name.'
config.diagnostics['duplicate-set-field'] =
'Enable diagnostics for setting the same field in a class more than once.'
+config.diagnostics['incomplete-signature-doc'] =
+'Incomplete @param or @return annotations for functions.'
config.diagnostics['invisible'] =
'Enable diagnostics for accesses to fields which are invisible.'
+config.diagnostics['missing-global-doc'] =
+'Missing annotations for globals! Global functions must have a comment and annotations for all parameters and return values.'
config.diagnostics['missing-parameter'] =
'Enable diagnostics for function calls where the number of arguments is less than the number of annotated function parameters.'
config.diagnostics['missing-return'] =
diff --git a/locale/pt-br/script.lua b/locale/pt-br/script.lua
index 6497c520..be6de9b2 100644
--- a/locale/pt-br/script.lua
+++ b/locale/pt-br/script.lua
@@ -114,7 +114,17 @@ DIAG_UNDEFINED_DOC_NAME =
'Tipo ou alias indefinido `{}`.'
DIAG_UNDEFINED_DOC_PARAM =
'Parâmetro indefinido `{}`.'
-DIAG_UNKNOWN_DIAG_CODE =
+DIAG_MISSING_GLOBAL_DOC_COMMENT = -- TODO: need translate!
+'Missing comment for global function `{}`.'
+DIAG_MISSING_GLOBAL_DOC_PARAM = -- TODO: need translate!
+'Missing @param annotation for parameter `{}` in global function `{}`.'
+DIAG_MISSING_GLOBAL_DOC_RETURN = -- TODO: need translate!
+'Missing @return annotation at index `{}` in global function `{}`.'
+DIAG_INCOMPLETE_SIGNATURE_DOC_PARAM = -- TODO: need translate!
+'Incomplete signature. Missing @param annotation for parameter `{}` in function `{}`.'
+DIAG_INCOMPLETE_SIGNATURE_DOC_RETURN = -- TODO: need translate!
+'Incomplete signature. Missing @return annotation at index `{}` in function `{}`.'
+DIAG_UNKNOWN_DIAG_CODE = -- TODO: need translate!
'Código de diagnóstico desconhecido `{}`.'
DIAG_CAST_LOCAL_TYPE = -- TODO: need translate!
'This variable is defined as type `{def}`. Cannot convert its type to `{ref}`.'
diff --git a/locale/pt-br/setting.lua b/locale/pt-br/setting.lua
index ec94f575..5038a5da 100644
--- a/locale/pt-br/setting.lua
+++ b/locale/pt-br/setting.lua
@@ -373,8 +373,12 @@ config.diagnostics['duplicate-doc-param'] = -- TODO: need translate!
'Enable diagnostics for a duplicated param annotation name.'
config.diagnostics['duplicate-set-field'] = -- TODO: need translate!
'Enable diagnostics for setting the same field in a class more than once.'
+config.diagnostics['incomplete-signature-doc'] = -- TODO: need translate!
+'Incomplete @param or @return annotations for functions.'
config.diagnostics['invisible'] = -- TODO: need translate!
'Enable diagnostics for accesses to fields which are invisible.'
+config.diagnostics['missing-global-doc'] = -- TODO: need translate!
+'Missing annotations for globals! Global functions must have a comment and annotations for all parameters and return values.'
config.diagnostics['missing-parameter'] = -- TODO: need translate!
'Enable diagnostics for function calls where the number of arguments is less than the number of annotated function parameters.'
config.diagnostics['missing-return'] = -- TODO: need translate!
diff --git a/locale/zh-cn/script.lua b/locale/zh-cn/script.lua
index da817698..40a8d35d 100644
--- a/locale/zh-cn/script.lua
+++ b/locale/zh-cn/script.lua
@@ -114,6 +114,16 @@ DIAG_UNDEFINED_DOC_NAME =
'未定义的类型或别名 `{}`。'
DIAG_UNDEFINED_DOC_PARAM =
'指向了未定义的参数 `{}`。'
+DIAG_MISSING_GLOBAL_DOC_COMMENT = -- TODO: need translate!
+'Missing comment for global function `{}`.'
+DIAG_MISSING_GLOBAL_DOC_PARAM = -- TODO: need translate!
+'Missing @param annotation for parameter `{}` in global function `{}`.'
+DIAG_MISSING_GLOBAL_DOC_RETURN = -- TODO: need translate!
+'Missing @return annotation at index `{}` in global function `{}`.'
+DIAG_INCOMPLETE_SIGNATURE_DOC_PARAM = -- TODO: need translate!
+'Incomplete signature. Missing @param annotation for parameter `{}` in function `{}`.'
+DIAG_INCOMPLETE_SIGNATURE_DOC_RETURN = -- TODO: need translate!
+'Incomplete signature. Missing @return annotation at index `{}` in function `{}`.'
DIAG_UNKNOWN_DIAG_CODE =
'未知的诊断代号 `{}`。'
DIAG_CAST_LOCAL_TYPE =
diff --git a/locale/zh-cn/setting.lua b/locale/zh-cn/setting.lua
index e1eb7de9..bece9a80 100644
--- a/locale/zh-cn/setting.lua
+++ b/locale/zh-cn/setting.lua
@@ -372,8 +372,12 @@ config.diagnostics['duplicate-doc-param'] = -- TODO: need translate!
'Enable diagnostics for a duplicated param annotation name.'
config.diagnostics['duplicate-set-field'] = -- TODO: need translate!
'Enable diagnostics for setting the same field in a class more than once.'
+config.diagnostics['incomplete-signature-doc'] = -- TODO: need translate!
+'Incomplete @param or @return annotations for functions.'
config.diagnostics['invisible'] = -- TODO: need translate!
'Enable diagnostics for accesses to fields which are invisible.'
+config.diagnostics['missing-global-doc'] = -- TODO: need translate!
+'Missing annotations for globals! Global functions must have a comment and annotations for all parameters and return values.'
config.diagnostics['missing-parameter'] = -- TODO: need translate!
'Enable diagnostics for function calls where the number of arguments is less than the number of annotated function parameters.'
config.diagnostics['missing-return'] = -- TODO: need translate!
diff --git a/locale/zh-tw/script.lua b/locale/zh-tw/script.lua
index 77ff6fea..7bc9e8a4 100644
--- a/locale/zh-tw/script.lua
+++ b/locale/zh-tw/script.lua
@@ -114,6 +114,16 @@ DIAG_UNDEFINED_DOC_NAME =
'未定義的類型或別名 `{}`。'
DIAG_UNDEFINED_DOC_PARAM =
'指向了未定義的參數 `{}`。'
+DIAG_MISSING_GLOBAL_DOC_COMMENT = -- TODO: need translate!
+'Missing comment for global function `{}`.'
+DIAG_MISSING_GLOBAL_DOC_PARAM = -- TODO: need translate!
+'Missing @param annotation for parameter `{}` in global function `{}`.'
+DIAG_MISSING_GLOBAL_DOC_RETURN = -- TODO: need translate!
+'Missing @return annotation at index `{}` in global function `{}`.'
+DIAG_INCOMPLETE_SIGNATURE_DOC_PARAM = -- TODO: need translate!
+'Incomplete signature. Missing @param annotation for parameter `{}` in function `{}`.'
+DIAG_INCOMPLETE_SIGNATURE_DOC_RETURN = -- TODO: need translate!
+'Incomplete signature. Missing @return annotation at index `{}` in function `{}`.'
DIAG_UNKNOWN_DIAG_CODE =
'未知的診斷代碼 `{}`。'
DIAG_CAST_LOCAL_TYPE =
diff --git a/locale/zh-tw/setting.lua b/locale/zh-tw/setting.lua
index ebf615ac..26ddc932 100644
--- a/locale/zh-tw/setting.lua
+++ b/locale/zh-tw/setting.lua
@@ -372,8 +372,12 @@ config.diagnostics['duplicate-doc-param'] = -- TODO: need translate!
'Enable diagnostics for a duplicated param annotation name.'
config.diagnostics['duplicate-set-field'] = -- TODO: need translate!
'Enable diagnostics for setting the same field in a class more than once.'
+config.diagnostics['incomplete-signature-doc'] = -- TODO: need translate!
+'Incomplete @param or @return annotations for functions.'
config.diagnostics['invisible'] = -- TODO: need translate!
'Enable diagnostics for accesses to fields which are invisible.'
+config.diagnostics['missing-global-doc'] = -- TODO: need translate!
+'Missing annotations for globals! Global functions must have a comment and annotations for all parameters and return values.'
config.diagnostics['missing-parameter'] = -- TODO: need translate!
'Enable diagnostics for function calls where the number of arguments is less than the number of annotated function parameters.'
config.diagnostics['missing-return'] = -- TODO: need translate!
diff --git a/script/core/diagnostics/incomplete-signature-doc.lua b/script/core/diagnostics/incomplete-signature-doc.lua
new file mode 100644
index 00000000..91f2db74
--- /dev/null
+++ b/script/core/diagnostics/incomplete-signature-doc.lua
@@ -0,0 +1,91 @@
+-- incomplete-signature-doc
+local files = require 'files'
+local lang = require 'language'
+local guide = require "parser.guide"
+local await = require 'await'
+
+local function findParam(docs, param)
+ if not docs then
+ return false
+ end
+
+ for _, doc in ipairs(docs) do
+ if doc.type == 'doc.param' then
+ if doc.param[1] == param then
+ return true
+ end
+ end
+ end
+
+ return false
+end
+
+local function findReturn(docs, index)
+ if not docs then
+ return false
+ end
+
+ for _, doc in ipairs(docs) do
+ if doc.type == 'doc.return' then
+ for _, ret in ipairs(doc.returns) do
+ if ret.returnIndex == index then
+ return true
+ end
+ end
+ end
+ end
+
+ return false
+end
+
+---@async
+return function (uri, callback)
+ local state = files.getState(uri)
+ if not state then
+ return
+ end
+
+ if not state.ast then
+ return
+ end
+
+ ---@async
+ guide.eachSourceType(state.ast, 'function', function (source)
+ await.delay()
+
+ if not source.bindDocs then
+ return
+ end
+
+ local functionName = source.parent[1]
+
+ if #source.args > 0 then
+ for _, arg in ipairs(source.args) do
+ local argName = arg[1]
+ if argName ~= 'self' then
+ if not findParam(source.bindDocs, argName) then
+ callback {
+ start = arg.start,
+ finish = arg.finish,
+ message = lang.script('DIAG_INCOMPLETE_SIGNATURE_DOC_PARAM', argName, functionName),
+ }
+ end
+ end
+ end
+ end
+
+ if source.returns then
+ for _, ret in ipairs(source.returns) do
+ for index, expr in ipairs(ret) do
+ if not findReturn(source.bindDocs, index) then
+ callback {
+ start = expr.start,
+ finish = expr.finish,
+ message = lang.script('DIAG_INCOMPLETE_SIGNATURE_DOC_RETURN', index, functionName),
+ }
+ end
+ end
+ end
+ end
+ end)
+end
diff --git a/script/core/diagnostics/missing-global-doc.lua b/script/core/diagnostics/missing-global-doc.lua
new file mode 100644
index 00000000..adcdf404
--- /dev/null
+++ b/script/core/diagnostics/missing-global-doc.lua
@@ -0,0 +1,98 @@
+local files = require 'files'
+local lang = require 'language'
+local guide = require "parser.guide"
+local await = require 'await'
+
+local function findParam(docs, param)
+ if not docs then
+ return false
+ end
+
+ for _, doc in ipairs(docs) do
+ if doc.type == 'doc.param' then
+ if doc.param[1] == param then
+ return true
+ end
+ end
+ end
+
+ return false
+end
+
+local function findReturn(docs, index)
+ if not docs then
+ return false
+ end
+
+ for _, doc in ipairs(docs) do
+ if doc.type == 'doc.return' then
+ for _, ret in ipairs(doc.returns) do
+ if ret.returnIndex == index then
+ return true
+ end
+ end
+ end
+ end
+
+ return false
+end
+
+---@async
+return function (uri, callback)
+ local state = files.getState(uri)
+ if not state then
+ return
+ end
+
+ if not state.ast then
+ return
+ end
+
+ ---@async
+ guide.eachSourceType(state.ast, 'function', function (source)
+ await.delay()
+
+ if source.parent.type ~= 'setglobal' then
+ return
+ end
+
+ local functionName = source.parent[1]
+
+ if #source.args == 0 and not source.returns and not source.bindDocs then
+ callback {
+ start = source.start,
+ finish = source.finish,
+ message = lang.script('DIAG_MISSING_GLOBAL_DOC_COMMENT', functionName),
+ }
+ end
+
+ if #source.args > 0 then
+ for _, arg in ipairs(source.args) do
+ local argName = arg[1]
+ if argName ~= 'self' then
+ if not findParam(source.bindDocs, argName) then
+ callback {
+ start = arg.start,
+ finish = arg.finish,
+ message = lang.script('DIAG_MISSING_GLOBAL_DOC_PARAM', argName, functionName),
+ }
+ end
+ end
+ end
+ end
+
+ if source.returns then
+ for _, ret in ipairs(source.returns) do
+ for index, expr in ipairs(ret) do
+ if not findReturn(source.bindDocs, index) then
+ callback {
+ start = expr.start,
+ finish = expr.finish,
+ message = lang.script('DIAG_MISSING_GLOBAL_DOC_RETURN', index, functionName),
+ }
+ end
+ end
+ end
+ end
+ end)
+end
diff --git a/script/proto/diagnostic.lua b/script/proto/diagnostic.lua
index 48a9094c..7f76c435 100644
--- a/script/proto/diagnostic.lua
+++ b/script/proto/diagnostic.lua
@@ -101,6 +101,15 @@ m.register {
}
m.register {
+ 'incomplete-signature-doc',
+ 'missing-global-doc',
+} {
+ group = 'luadoc',
+ severity = 'Warning',
+ status = 'None',
+}
+
+m.register {
'codestyle-check'
} {
group = 'codestyle',
diff --git a/test/diagnostics/incomplete-signature-doc.lua b/test/diagnostics/incomplete-signature-doc.lua
new file mode 100644
index 00000000..c3099cd2
--- /dev/null
+++ b/test/diagnostics/incomplete-signature-doc.lua
@@ -0,0 +1,331 @@
+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',
+ ['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',
+{
+ ['incomplete-signature-doc'] = 'Any!' -- override groupFileStatus
+})
+
+-- check global functions
+TEST [[
+function FG0()
+end
+
+---comment
+function FG1()
+end
+]]
+
+TEST [[
+function FGP0(p)
+ print(p)
+end
+
+---comment
+function FGP1(<!p!>)
+ print(p)
+end
+
+---comment
+---@param p any
+function FGP2(p)
+ print(p)
+end
+]]
+
+TEST [[
+function FGPP0(p0, p1)
+ print(p0, p1)
+end
+
+---comment
+function FGPP1(<!p0!>, <!p1!>)
+ print(p0, p1)
+end
+
+---comment
+---@param p0 any
+function FGPP2(p0, <!p1!>)
+ print(p0, p1)
+end
+
+---comment
+---@param p0 any
+---@param p1 any
+function FGPP3(p0, p1)
+ print(p0, p1)
+end
+]]
+
+TEST [[
+function FGR0()
+ return 0
+end
+
+---comment
+function FGR1()
+ return <!0!>
+end
+
+---comment
+---@return integer
+function FGR2()
+ return 0
+end
+]]
+
+TEST [[
+function FGRR0()
+ return 0, 1
+end
+
+---comment
+function FGRR1()
+ return <!0!>, <!1!>
+end
+
+---comment
+---@return integer
+function FGRR2()
+ return 0, <!1!>
+end
+
+---comment
+---@return integer
+---@return integer
+function FGRR3()
+ return 0, 1
+end
+]]
+
+TEST [[
+function FGPR0(p)
+ print(p)
+ return 0
+end
+
+---comment
+function FGPR1(<!p!>)
+ print(p)
+ return <!0!>
+end
+
+---comment
+---@param p any
+function FGPR2(p)
+ print(p)
+ return <!0!>
+end
+
+---comment
+---@return integer
+function FGPR3(<!p!>)
+ print(p)
+ return 0
+end
+
+---comment
+---@param p any
+---@return integer
+function FGPR4(p)
+ print(p)
+ return 0
+end
+]]
+
+-- check local functions
+
+TEST [[
+local function FL0()
+end
+
+FL0()
+
+---comment
+local function FL1()
+end
+
+FL1()
+]]
+
+TEST [[
+local function FLP0(p)
+ print(p)
+end
+
+FLP0(0)
+
+---comment
+local function FLP1(<!p!>)
+ print(p)
+end
+
+FLP1(0)
+
+---comment
+---@param p any
+local function FLP2(p)
+ print(p)
+end
+
+FLP2(0)
+]]
+
+TEST [[
+local function FLPP0(p0, p1)
+ print(p0, p1)
+end
+
+FLPP0(0, 1)
+
+---comment
+local function FLPP1(<!p0!>, <!p1!>)
+ print(p0, p1)
+end
+
+FLPP1(0, 1)
+
+---comment
+---@param p0 any
+local function FLPP2(p0, <!p1!>)
+ print(p0, p1)
+end
+
+FLPP2(0, 1)
+
+---comment
+---@param p0 any
+---@param p1 any
+local function FLPP3(p0, p1)
+ print(p0, p1)
+end
+
+FLPP3(0, 1)
+]]
+
+TEST [[
+local function FLR0()
+ return 0
+end
+
+local vr0 = FLR0()
+
+---comment
+local function FLR1()
+ return <!0!>
+end
+
+local vr1 = FLR1()
+
+---comment
+---@return integer
+local function FLR2()
+ return 0
+end
+
+local vr2 = FLR2()
+]]
+
+TEST [[
+local function FLRR0()
+ return 0, 1
+end
+
+local vrr0, _ = FLRR0()
+
+---comment
+local function FLRR1()
+ return <!0!>, <!1!>
+end
+
+local vrr1, _ = FLRR1()
+
+---comment
+---@return integer
+local function FLRR2()
+ return 0, <!1!>
+end
+
+local vrr2, _ = FLRR2()
+
+---comment
+---@return integer
+---@return integer
+local function FLRR3()
+ return 0, 1
+end
+
+local vrr3, _ = FLRR3()
+]]
+
+TEST [[
+local function FLPR0(p)
+ print(p)
+ return 0
+end
+
+local vpr0 = FLPR0(0)
+
+---comment
+local function FLPR1(<!p!>)
+ print(p)
+ return <!0!>
+end
+
+local vpr1 = FLPR1(0)
+
+---comment
+---@param p any
+local function FLPR2(p)
+ print(p)
+ return <!0!>
+end
+
+local vpr2 = FLPR2(0)
+
+---comment
+---@return integer
+local function FLPR3(<!p!>)
+ print(p)
+ return 0
+end
+
+local vpr3 = FLPR3(0)
+
+---comment
+---@param p any
+---@return integer
+local function FLPR4(p)
+ print(p)
+ return 0
+end
+
+local vpr4 = FLPR4(0)
+]]
+
+-- 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 5e8abf7d..821685f0 100644
--- a/test/diagnostics/init.lua
+++ b/test/diagnostics/init.lua
@@ -86,5 +86,8 @@ end
require 'diagnostics.common'
require 'diagnostics.type-check'
+require 'diagnostics.incomplete-signature-doc'
+require 'diagnostics.missing-global-doc'
require 'diagnostics.global-element'
require 'diagnostics.uppercase-local'
+
diff --git a/test/diagnostics/missing-global-doc.lua b/test/diagnostics/missing-global-doc.lua
new file mode 100644
index 00000000..2ebc237a
--- /dev/null
+++ b/test/diagnostics/missing-global-doc.lua
@@ -0,0 +1,333 @@
+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',
+ ['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',
+{
+ ['missing-global-doc'] = 'Any!' -- override groupFileStatus
+})
+
+
+-- check global functions
+TEST [[
+<!function FG0()
+end!>
+
+---comment
+function FG1()
+end
+]]
+
+TEST [[
+function FGP0(<!p!>)
+ print(p)
+end
+
+---comment
+function FGP1(<!p!>)
+ print(p)
+end
+
+---comment
+---@param p any
+function FGP2(p)
+ print(p)
+end
+]]
+
+TEST [[
+function FGPP0(<!p0!>, <!p1!>)
+ print(p0, p1)
+end
+
+---comment
+function FGPP1(<!p0!>, <!p1!>)
+ print(p0, p1)
+end
+
+---comment
+---@param p0 any
+function FGPP2(p0, <!p1!>)
+ print(p0, p1)
+end
+
+---comment
+---@param p0 any
+---@param p1 any
+function FGPP3(p0, p1)
+ print(p0, p1)
+end
+]]
+
+TEST [[
+function FGR0()
+ return <!0!>
+end
+
+---comment
+function FGR1()
+ return <!0!>
+end
+
+---comment
+---@return integer
+function FGR2()
+ return 0
+end
+]]
+
+TEST [[
+function FGRR0()
+ return <!0!>, <!1!>
+end
+
+---comment
+function FGRR1()
+ return <!0!>, <!1!>
+end
+
+---comment
+---@return integer
+function FGRR2()
+ return 0, <!1!>
+end
+
+---comment
+---@return integer
+---@return integer
+function FGRR3()
+ return 0, 1
+end
+]]
+
+
+TEST [[
+function FGPR0(<!p!>)
+ print(p)
+ return <!0!>
+end
+
+---comment
+function FGPR1(<!p!>)
+ print(p)
+ return <!0!>
+end
+
+---comment
+---@param p any
+function FGPR2(p)
+ print(p)
+ return <!0!>
+end
+
+---comment
+---@return integer
+function FGPR3(<!p!>)
+ print(p)
+ return 0
+end
+
+---comment
+---@param p any
+---@return integer
+function FGPR4(p)
+ print(p)
+ return 0
+end
+]]
+
+-- check local functions
+
+TEST [[
+local function FL0()
+end
+
+FL0()
+
+---comment
+local function FL1()
+end
+
+FL1()
+]]
+
+TEST [[
+local function FLP0(p)
+ print(p)
+end
+
+FLP0(0)
+
+---comment
+local function FLP1(p)
+ print(p)
+end
+
+FLP1(0)
+
+---comment
+---@param p any
+local function FLP2(p)
+ print(p)
+end
+
+FLP2(0)
+]]
+
+TEST [[
+local function FLPP0(p0, p1)
+ print(p0, p1)
+end
+
+FLPP0(0, 1)
+
+---comment
+local function FLPP1(p0, p1)
+ print(p0, p1)
+end
+
+FLPP1(0, 1)
+
+---comment
+---@param p0 any
+local function FLPP2(p0, p1)
+ print(p0, p1)
+end
+
+FLPP2(0, 1)
+
+---comment
+---@param p0 any
+---@param p1 any
+local function FLPP3(p0, p1)
+ print(p0, p1)
+end
+
+FLPP3(0, 1)
+]]
+
+TEST [[
+local function FLR0()
+ return 0
+end
+
+local vr0 = FLR0()
+
+---comment
+local function FLR1()
+ return 0
+end
+
+local vr1 = FLR1()
+
+---comment
+---@return integer
+local function FLR2()
+ return 0
+end
+
+local vr2 = FLR2()
+]]
+
+TEST [[
+local function FLRR0()
+ return 0, 1
+end
+
+local vrr0, _ = FLRR0()
+
+---comment
+local function FLRR1()
+ return 0, 1
+end
+
+local vrr1, _ = FLRR1()
+
+---comment
+---@return integer
+local function FLRR2()
+ return 0, 1
+end
+
+local vrr2, _ = FLRR2()
+
+---comment
+---@return integer
+---@return integer
+local function FLRR3()
+ return 0, 1
+end
+
+local vrr3, _ = FLRR3()
+]]
+
+TEST [[
+local function FLPR0(p)
+ print(p)
+ return 0
+end
+
+local vpr0 = FLPR0(0)
+
+---comment
+local function FLPR1(p)
+ print(p)
+ return 0
+end
+
+local vpr1 = FLPR1(0)
+
+---comment
+---@param p any
+local function FLPR2(p)
+ print(p)
+ return 0
+end
+
+local vpr2 = FLPR2(0)
+
+---comment
+---@return integer
+local function FLPR3(p)
+ print(p)
+ return 0
+end
+
+local vpr3 = FLPR3(0)
+
+---comment
+---@param p any
+---@return integer
+local function FLPR4(p)
+ print(p)
+ return 0
+end
+
+local vpr4 = FLPR4(0)
+]]
+
+-- 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