Skip to content

Commit cfcbeef

Browse files
authored
Merge pull request #419 from xuhuanzy/fix
fix
2 parents 1b838f1 + 3a767fd commit cfcbeef

File tree

7 files changed

+80
-52
lines changed

7 files changed

+80
-52
lines changed

crates/emmylua_code_analysis/src/compilation/analyzer/flow/build_flow_tree.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ fn build_name_expr_flow(
6767
) -> Option<()> {
6868
let parent = name_expr.get_parent::<LuaAst>()?;
6969
let mut is_assign = false;
70-
match parent {
70+
match &parent {
7171
LuaAst::LuaIndexExpr(_) | LuaAst::LuaCallExpr(_) | LuaAst::LuaFuncStat(_) => return None,
7272
LuaAst::LuaAssignStat(assign_stat) => {
7373
let eq_pos = assign_stat
@@ -87,7 +87,20 @@ fn build_name_expr_flow(
8787
let mut ref_id: Option<VarRefId> = None;
8888
if let Some(local_refs) = db.get_reference_index().get_local_reference(&file_id) {
8989
if let Some(decl_id) = local_refs.get_decl_id(&name_expr.get_range()) {
90-
ref_id = Some(VarRefId::DeclId(decl_id.clone()));
90+
if let Some(decl) = db.get_decl_index().get_decl(&decl_id) {
91+
// 处理`self`作为参数传入的特殊情况
92+
if decl.is_param()
93+
&& name_expr
94+
.get_name_text()
95+
.map_or(false, |name| name == "self")
96+
{
97+
ref_id = Some(VarRefId::Name(SmolStr::new("self")));
98+
} else {
99+
ref_id = Some(VarRefId::DeclId(decl_id.clone()));
100+
}
101+
} else {
102+
ref_id = Some(VarRefId::DeclId(decl_id.clone()));
103+
}
91104
}
92105
}
93106

crates/emmylua_code_analysis/src/compilation/analyzer/flow/var_analyze/broadcast_up.rs

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
use std::sync::Arc;
22

33
use emmylua_parser::{
4-
BinaryOperator, LuaAst, LuaAstNode, LuaBinaryExpr, LuaExpr, LuaForStat, LuaLiteralToken,
5-
UnaryOperator,
4+
BinaryOperator, LuaAst, LuaAstNode, LuaBinaryExpr, LuaExpr, LuaLiteralToken, UnaryOperator,
65
};
76
use smol_str::SmolStr;
87

@@ -185,17 +184,6 @@ pub fn broadcast_up(
185184
);
186185
}
187186
}
188-
UnaryOperator::OpLen => {
189-
if let Some(for_stat) = unary_expr.get_parent::<LuaForStat>() {
190-
broadcast_inside_condition_block(
191-
db,
192-
var_trace,
193-
trace_info.with_type_assertion(TypeAssertion::Narrow(LuaType::Table)),
194-
for_stat.get_block()?,
195-
false,
196-
);
197-
}
198-
}
199187
_ => {}
200188
}
201189
}

crates/emmylua_code_analysis/src/compilation/analyzer/unresolve/resolve_closure.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -410,13 +410,14 @@ fn resolve_doc_function(
410410
if signature.resolve_return == SignatureReturnStatus::UnResolve
411411
|| signature.resolve_return == SignatureReturnStatus::InferResolve
412412
{
413-
signature.return_docs.clear();
414-
signature.resolve_return = SignatureReturnStatus::DocResolve;
415-
signature.return_docs.push(LuaDocReturnInfo {
416-
name: None,
417-
type_ref: doc_func.get_ret().clone(),
418-
description: None,
419-
});
413+
if signature.return_docs.is_empty() && !doc_func.get_ret().is_nil() {
414+
signature.resolve_return = SignatureReturnStatus::DocResolve;
415+
signature.return_docs.push(LuaDocReturnInfo {
416+
name: None,
417+
type_ref: doc_func.get_ret().clone(),
418+
description: None,
419+
});
420+
}
420421
}
421422
Some(true)
422423
}

crates/emmylua_code_analysis/src/compilation/test/closure_param_infer_test.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,4 +274,49 @@ mod test {
274274
let expected = ws.ty("number");
275275
assert_eq!(ws.humanize_type(ty), ws.humanize_type(expected));
276276
}
277+
278+
#[test]
279+
fn test_issue_416() {
280+
let mut ws = VirtualWorkspace::new();
281+
ws.def_files(vec![
282+
(
283+
"test.lua",
284+
r#"
285+
---@class CustomEvent
286+
---@field private custom_event_manager? EventManager
287+
local M = {}
288+
289+
---@return EventManager
290+
function newEventManager()
291+
end
292+
293+
function M:event_on()
294+
if not self.custom_event_manager then
295+
self.custom_event_manager = newEventManager()
296+
end
297+
local trigger = self.custom_event_manager:get_trigger()
298+
A = trigger
299+
return trigger
300+
end
301+
"#,
302+
),
303+
(
304+
"test2.lua",
305+
r#"
306+
---@class Trigger
307+
308+
---@class EventManager
309+
local EventManager
310+
311+
---@return Trigger
312+
function EventManager:get_trigger()
313+
end
314+
"#,
315+
),
316+
]);
317+
318+
let ty = ws.expr_ty("A");
319+
let expected = ws.ty("Trigger");
320+
assert_eq!(ws.humanize_type(ty), ws.humanize_type(expected));
321+
}
277322
}

crates/emmylua_code_analysis/src/compilation/test/flow.rs

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -617,24 +617,4 @@ end
617617
let b_expected = ws.ty("string[]");
618618
assert_eq!(b, b_expected);
619619
}
620-
621-
#[test]
622-
fn test_issue_405() {
623-
let mut ws = VirtualWorkspace::new();
624-
625-
ws.def(
626-
r#"
627-
---@type false|fun(...)[]?
628-
local calls
629-
630-
for i = 1, #calls do
631-
a = calls
632-
end
633-
"#,
634-
);
635-
636-
let a = ws.expr_ty("a");
637-
let a_expected = ws.ty("fun(...)[]");
638-
assert_eq!(a, a_expected);
639-
}
640620
}

crates/emmylua_code_analysis/src/db_index/type/type_assert.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,9 @@ impl TypeAssertion {
9595
TypeAssertion::Or(a) => {
9696
let mut result = vec![];
9797
for assertion in a.iter() {
98-
result.push(assertion.tighten_type(db, config, root, source.clone())?);
98+
if let Ok(t) = assertion.tighten_type(db, config, root, source.clone()) {
99+
result.push(t);
100+
}
99101
}
100102

101103
match result.len() {

crates/emmylua_code_analysis/src/diagnostic/test/need_check_nil_test.rs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,21 @@ mod test {
1414
"#
1515
));
1616
}
17-
1817
#[test]
19-
fn test_issue_405() {
18+
fn test_issue_402() {
2019
let mut ws = VirtualWorkspace::new();
21-
let mut emmyrc = ws.analysis.emmyrc.as_ref().clone();
22-
emmyrc.strict.array_index = false;
23-
ws.analysis.update_config(emmyrc.into());
2420
assert!(ws.check_code_for(
2521
DiagnosticCode::NeedCheckNil,
2622
r#"
27-
---@type false|fun(...)[]?
28-
local calls
23+
---@class A
24+
local a = {}
2925
30-
for i = 1, #calls do
31-
calls[i](...)
26+
---@param self table?
27+
function a.new(self)
28+
if self then
29+
self.a = 1
3230
end
31+
end
3332
"#
3433
));
3534
}

0 commit comments

Comments
 (0)