diff --git a/crates/emmylua_code_analysis/src/diagnostic/test/unnecessary_if_test.rs b/crates/emmylua_code_analysis/src/diagnostic/test/unnecessary_if_test.rs index e16a652bb..8a8d66a88 100644 --- a/crates/emmylua_code_analysis/src/diagnostic/test/unnecessary_if_test.rs +++ b/crates/emmylua_code_analysis/src/diagnostic/test/unnecessary_if_test.rs @@ -26,4 +26,21 @@ mod test { "# )); } + + #[test] + fn test_table_generic_index_not_unnecessary() { + let mut ws = VirtualWorkspace::new(); + assert!(ws.check_code_for( + DiagnosticCode::UnnecessaryIf, + r#" + ---@type table + local t = {} + local k = "hello" + local v = t[k] + if v then + print(v) + end + "# + )); + } } diff --git a/crates/emmylua_code_analysis/src/semantic/infer/infer_index/mod.rs b/crates/emmylua_code_analysis/src/semantic/infer/infer_index/mod.rs index 23709282e..5ddaf0ee3 100644 --- a/crates/emmylua_code_analysis/src/semantic/infer/infer_index/mod.rs +++ b/crates/emmylua_code_analysis/src/semantic/infer/infer_index/mod.rs @@ -1110,7 +1110,8 @@ fn infer_member_by_index_table_generic( let index_key = index_expr.get_index_key().ok_or(InferFailReason::None)?; let key_type = &table_params[0]; let value_type = &table_params[1]; - infer_index_metamethod(db, cache, &index_key, key_type, value_type) + let result = infer_index_metamethod(db, cache, &index_key, key_type, value_type)?; + Ok(TypeOps::Union.apply(db, &result, &LuaType::Nil)) } fn infer_global_field_member( diff --git a/crates/emmylua_code_analysis/src/semantic/member/infer_raw_member.rs b/crates/emmylua_code_analysis/src/semantic/member/infer_raw_member.rs index cadd3988e..aeb00aadf 100644 --- a/crates/emmylua_code_analysis/src/semantic/member/infer_raw_member.rs +++ b/crates/emmylua_code_analysis/src/semantic/member/infer_raw_member.rs @@ -200,7 +200,7 @@ fn infer_table_generic_raw_member_type( LuaMemberKey::None => return Err(InferFailReason::FieldNotFound), }; if check_type_compact(db, key_type, &access_key_type).is_ok() { - return Ok(value_type.clone()); + return Ok(TypeOps::Union.apply(db, value_type, &LuaType::Nil)); } Err(InferFailReason::FieldNotFound) diff --git a/crates/emmylua_ls/src/handlers/test/hover_test.rs b/crates/emmylua_ls/src/handlers/test/hover_test.rs index 6acf90628..52461f8b7 100644 --- a/crates/emmylua_ls/src/handlers/test/hover_test.rs +++ b/crates/emmylua_ls/src/handlers/test/hover_test.rs @@ -271,7 +271,7 @@ mod tests { end "#, VirtualHoverResult { - value: "```lua\n(field) _cfg: number\n```".to_string(), + value: "```lua\n(field) _cfg: number?\n```".to_string(), }, )); @@ -293,7 +293,7 @@ mod tests { end "#, VirtualHoverResult { - value: "```lua\n(field) _cfg: number\n```".to_string(), + value: "```lua\n(field) _cfg: number?\n```".to_string(), }, )); Ok(())