From 358e23befd2d3364257d505f2b84f78892029cf0 Mon Sep 17 00:00:00 2001 From: Abhinav Tamaskar Date: Tue, 3 Mar 2026 19:19:19 -0500 Subject: [PATCH 1/3] feat: update incomplete-signature-doc to also error on non-global functions --- .../checker/incomplete_signature_doc.rs | 33 +++++++++++-------- .../test/incomplete_signature_doc_test.rs | 11 ++++--- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/crates/emmylua_code_analysis/src/diagnostic/checker/incomplete_signature_doc.rs b/crates/emmylua_code_analysis/src/diagnostic/checker/incomplete_signature_doc.rs index 9a9b0fca7..5ae82d724 100644 --- a/crates/emmylua_code_analysis/src/diagnostic/checker/incomplete_signature_doc.rs +++ b/crates/emmylua_code_analysis/src/diagnostic/checker/incomplete_signature_doc.rs @@ -44,16 +44,29 @@ fn check_doc( let comment = get_closure_expr_comment(closure_expr); - if comment.is_none() && is_global { + let code = if is_global { + DiagnosticCode::MissingGlobalDoc + } else { + DiagnosticCode::IncompleteSignatureDoc + }; + + if comment.is_none() { + let message = if is_global { + t!( + "Missing comment for global function `%{name}`.", + name = function_name + ) + } else { + t!( + "Missing comment for function `%{name}`.", + name = function_name + ) + }; if let Some(stat) = closure_expr.get_parent::() { context.add_diagnostic( - DiagnosticCode::MissingGlobalDoc, + code, stat.get_range(), - t!( - "Missing comment for global function `%{name}`.", - name = function_name - ) - .to_string(), + message.to_string(), None, ); } @@ -64,12 +77,6 @@ fn check_doc( return Some(()); }; - let code = if is_global { - DiagnosticCode::MissingGlobalDoc - } else { - DiagnosticCode::IncompleteSignatureDoc - }; - let doc_param_names: HashSet = comment .children::() .filter_map(|param| { diff --git a/crates/emmylua_code_analysis/src/diagnostic/test/incomplete_signature_doc_test.rs b/crates/emmylua_code_analysis/src/diagnostic/test/incomplete_signature_doc_test.rs index 4986fd185..1e714e6c0 100644 --- a/crates/emmylua_code_analysis/src/diagnostic/test/incomplete_signature_doc_test.rs +++ b/crates/emmylua_code_analysis/src/diagnostic/test/incomplete_signature_doc_test.rs @@ -27,9 +27,8 @@ mod tests { assert!(!ws.check_code_for( DiagnosticCode::IncompleteSignatureDoc, r#" - ---@param p number - local function FLPR3(p, e) - return 0 + local function do_add(x, y) + return x + y end "# )); @@ -38,20 +37,22 @@ mod tests { DiagnosticCode::IncompleteSignatureDoc, r#" ---@param p number - local function FLPR3(p) + local function FLPR3(p, e) return 0 end "# )); - assert!(ws.check_code_for( + assert!(!ws.check_code_for( DiagnosticCode::IncompleteSignatureDoc, r#" + ---@param p number local function FLPR3(p) return 0 end "# )); + assert!(ws.check_code_for( DiagnosticCode::IncompleteSignatureDoc, r#" From e2eacfc03c13fe4f31900dcf689e5735b18e9493 Mon Sep 17 00:00:00 2001 From: Abhinav Tamaskar Date: Tue, 3 Mar 2026 21:38:28 -0500 Subject: [PATCH 2/3] fmt --- .../src/diagnostic/checker/incomplete_signature_doc.rs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/crates/emmylua_code_analysis/src/diagnostic/checker/incomplete_signature_doc.rs b/crates/emmylua_code_analysis/src/diagnostic/checker/incomplete_signature_doc.rs index 5ae82d724..bd4b3bec7 100644 --- a/crates/emmylua_code_analysis/src/diagnostic/checker/incomplete_signature_doc.rs +++ b/crates/emmylua_code_analysis/src/diagnostic/checker/incomplete_signature_doc.rs @@ -63,12 +63,7 @@ fn check_doc( ) }; if let Some(stat) = closure_expr.get_parent::() { - context.add_diagnostic( - code, - stat.get_range(), - message.to_string(), - None, - ); + context.add_diagnostic(code, stat.get_range(), message.to_string(), None); } return Some(()); } From 6113aa14d5688d61375de55d9ed6e2fede2601df Mon Sep 17 00:00:00 2001 From: Abhinav Tamaskar Date: Wed, 4 Mar 2026 10:49:15 -0500 Subject: [PATCH 3/3] fix check for docs without params --- .../checker/incomplete_signature_doc.rs | 5 ----- .../test/incomplete_signature_doc_test.rs | 22 +++++++++++++++++-- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/crates/emmylua_code_analysis/src/diagnostic/checker/incomplete_signature_doc.rs b/crates/emmylua_code_analysis/src/diagnostic/checker/incomplete_signature_doc.rs index bd4b3bec7..53b038b08 100644 --- a/crates/emmylua_code_analysis/src/diagnostic/checker/incomplete_signature_doc.rs +++ b/crates/emmylua_code_analysis/src/diagnostic/checker/incomplete_signature_doc.rs @@ -86,11 +86,6 @@ fn check_doc( .map(|return_doc| return_doc.get_types().count()) .sum(); - // 如果文档中没有参数和返回值注解, 且不是全局函数, 则不检查 - if doc_param_names.is_empty() && doc_return_len == 0 && !is_global { - return Some(()); - } - check_params( context, closure_expr, diff --git a/crates/emmylua_code_analysis/src/diagnostic/test/incomplete_signature_doc_test.rs b/crates/emmylua_code_analysis/src/diagnostic/test/incomplete_signature_doc_test.rs index 1e714e6c0..5a1df2ab0 100644 --- a/crates/emmylua_code_analysis/src/diagnostic/test/incomplete_signature_doc_test.rs +++ b/crates/emmylua_code_analysis/src/diagnostic/test/incomplete_signature_doc_test.rs @@ -24,6 +24,16 @@ mod tests { let mut ws = VirtualWorkspace::new(); ws.enable_full_diagnostic(); + // TODO: closures are not detected as functions in the semantic model + // assert!(!ws.check_code_for( + // DiagnosticCode::MissingGlobalDoc, + // r#" + // local c = function(x, y) + // return x + y + // end + // "# + // )); + assert!(!ws.check_code_for( DiagnosticCode::IncompleteSignatureDoc, r#" @@ -33,6 +43,14 @@ mod tests { "# )); + assert!(!ws.check_code_for( + DiagnosticCode::IncompleteSignatureDoc, + r#" + local function noop() + end + "# + )); + assert!(!ws.check_code_for( DiagnosticCode::IncompleteSignatureDoc, r#" @@ -53,10 +71,10 @@ mod tests { "# )); - assert!(ws.check_code_for( + assert!(!ws.check_code_for( DiagnosticCode::IncompleteSignatureDoc, r#" - --- + --- function without param signature local function FLPR3(p) return 0 end