Skip to content

Commit 7300bcf

Browse files
committed
fix analyzer Stat Variadic
1 parent 04bfb74 commit 7300bcf

File tree

5 files changed

+80
-17
lines changed

5 files changed

+80
-17
lines changed

crates/emmylua_code_analysis/src/compilation/analyzer/lua/stats.rs

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@ pub fn analyze_local_stat(analyzer: &mut LuaAnalyzer, local_stat: LuaLocalStat)
6262
}
6363
}
6464
}
65-
65+
if let LuaType::Variadic(variadic) = expr_type {
66+
expr_type = variadic.as_ref().clone();
67+
}
6668
bind_type(
6769
analyzer.db,
6870
decl_id.into(),
@@ -104,10 +106,14 @@ pub fn analyze_local_stat(analyzer: &mut LuaAnalyzer, local_stat: LuaLocalStat)
104106
let decl_id = LuaDeclId::new(analyzer.file_id, position);
105107
let ret_type = multi.get_type(i - expr_count + 1);
106108
if let Some(ty) = ret_type {
109+
let mut final_type = ty.clone();
110+
if let LuaType::Variadic(variadic) = final_type {
111+
final_type = variadic.as_ref().clone();
112+
}
107113
bind_type(
108114
analyzer.db,
109115
decl_id.into(),
110-
LuaTypeCache::InferType(ty.clone()),
116+
LuaTypeCache::InferType(final_type),
111117
);
112118
} else {
113119
analyzer.db.get_type_index_mut().bind_type(
@@ -298,22 +304,20 @@ pub fn analyze_assign_stat(analyzer: &mut LuaAnalyzer, assign_stat: LuaAssignSta
298304
continue;
299305
}
300306
};
301-
302-
merge_type_owner_and_expr_type(analyzer, type_owner, &expr_type, 0);
307+
assign_merge_type_owner_and_expr_type(analyzer, type_owner, &expr_type, 0);
303308
}
304309

305310
// The complexity brought by multiple return values is too high
306311
if var_count > expr_count {
307-
let last_expr = expr_list.last();
308-
if let Some(last_expr) = last_expr.clone() {
312+
if let Some(last_expr) = expr_list.last() {
309313
match analyzer.infer_expr(last_expr) {
310314
Ok(last_expr_type) => {
311315
if last_expr_type.is_multi_return() {
312316
for i in expr_count..var_count {
313317
let var = var_list.get(i)?;
314318
let type_owner = get_var_owner(analyzer, var.clone());
315319
set_index_expr_owner(analyzer, var.clone());
316-
merge_type_owner_and_expr_type(
320+
assign_merge_type_owner_and_expr_type(
317321
analyzer,
318322
type_owner,
319323
&last_expr_type,
@@ -344,7 +348,7 @@ pub fn analyze_assign_stat(analyzer: &mut LuaAnalyzer, assign_stat: LuaAssignSta
344348
Some(())
345349
}
346350

347-
fn merge_type_owner_and_expr_type(
351+
fn assign_merge_type_owner_and_expr_type(
348352
analyzer: &mut LuaAnalyzer,
349353
type_owner: LuaTypeOwner,
350354
expr_type: &LuaType,
@@ -354,6 +358,12 @@ fn merge_type_owner_and_expr_type(
354358
if let LuaType::MuliReturn(multi) = expr_type {
355359
expr_type = multi.get_type(idx).unwrap_or(&LuaType::Nil).clone();
356360
}
361+
match &expr_type {
362+
LuaType::Variadic(variadic) => {
363+
expr_type = variadic.as_ref().clone();
364+
}
365+
_ => {}
366+
}
357367

358368
bind_type(analyzer.db, type_owner, LuaTypeCache::InferType(expr_type));
359369

@@ -483,7 +493,7 @@ fn special_assign_pattern(
483493

484494
match analyzer.infer_expr(&right) {
485495
Ok(right_expr_type) => {
486-
merge_type_owner_and_expr_type(analyzer, type_owner, &right_expr_type, 0);
496+
assign_merge_type_owner_and_expr_type(analyzer, type_owner, &right_expr_type, 0);
487497
}
488498
Err(_) => return None,
489499
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
#[cfg(test)]
2+
mod test {
3+
use crate::{DiagnosticCode, VirtualWorkspace};
4+
5+
#[test]
6+
fn test_1() {
7+
let mut ws = VirtualWorkspace::new();
8+
ws.def(
9+
r#"
10+
---@return any ...
11+
---@return integer offset
12+
local function unpack() end
13+
a, b, c, d = unpack()
14+
"#,
15+
);
16+
17+
assert_eq!(ws.expr_ty("a"), ws.ty("any"));
18+
assert_eq!(ws.expr_ty("b"), ws.ty("integer"));
19+
assert_eq!(ws.expr_ty("c"), ws.ty("nil"));
20+
assert_eq!(ws.expr_ty("d"), ws.ty("nil"));
21+
}
22+
23+
#[test]
24+
fn test_2() {
25+
let mut ws = VirtualWorkspace::new();
26+
ws.def(
27+
r#"
28+
---@return integer offset
29+
---@return any ...
30+
local function unpack() end
31+
a, b, c, d = unpack()
32+
"#,
33+
);
34+
35+
assert_eq!(ws.expr_ty("a"), ws.ty("integer"));
36+
assert_eq!(ws.expr_ty("b"), ws.ty("any"));
37+
assert_eq!(ws.expr_ty("c"), ws.ty("any"));
38+
assert_eq!(ws.expr_ty("d"), ws.ty("any"));
39+
}
40+
41+
#[test]
42+
fn test_3() {
43+
let mut ws = VirtualWorkspace::new();
44+
assert!(ws.check_code_for(
45+
DiagnosticCode::ParamTypeNotMatch,
46+
r#"
47+
---@return any ...
48+
---@return integer offset
49+
local function unpack() end
50+
51+
---@param a nil|integer|'l'|'L'
52+
local function test(a) end
53+
local len = unpack()
54+
test(len)
55+
"#,
56+
));
57+
}
58+
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ mod annotation_test;
33
mod closure_generic;
44
mod closure_param_infer_test;
55
mod closure_return_test;
6+
mod decl_test;
67
mod diagnostic_disable_test;
78
mod flow;
89
mod for_range_var_infer_test;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -856,7 +856,7 @@ impl LuaMultiReturn {
856856
let last_element_len = last_multi.get_len();
857857
return match last_element_len {
858858
Some(len) => Some(basic_len - 1 + len),
859-
None => None,
859+
None => Some(basic_len),
860860
};
861861
}
862862

crates/emmylua_code_analysis/src/semantic/generic/instantiate_type_generic.rs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -149,13 +149,7 @@ pub fn instantiate_doc_function(
149149
}
150150
SubstitutorValue::Type(ty) => new_returns.push(ty.clone()),
151151
SubstitutorValue::MultiBase(base) => {
152-
if i + 1 == tpl_ret.len() {
153-
new_returns.push(LuaType::Variadic(base.clone().into()));
154-
} else {
155-
new_returns.push(LuaType::MuliReturn(
156-
LuaMultiReturn::Base(base.clone()).into(),
157-
));
158-
}
152+
new_returns.push(LuaType::Variadic(base.clone().into()));
159153
}
160154
}
161155
}

0 commit comments

Comments
 (0)