Skip to content

Commit 69c398f

Browse files
committed
refactor multi to variadic
1 parent cbbd15c commit 69c398f

File tree

36 files changed

+680
-641
lines changed

36 files changed

+680
-641
lines changed

crates/emmylua_code_analysis/src/compilation/analyzer/bind_type/mod.rs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -69,16 +69,6 @@ pub fn add_member(db: &mut DbIndex, owner: LuaMemberOwner, member_id: LuaMemberI
6969
db.get_member_index_mut()
7070
.add_member_to_owner(owner.clone(), member_id);
7171

72-
// let item = db.get_member_index().get_member_item_by_member_id(member_id)?;
73-
// if item.is_one() {
74-
// return Some(())
75-
// }
76-
77-
// let resolve_member_id = item.resolve_type_owner_member_id(db)?;
78-
// if resolve_member_id != member_id {
79-
// return None;
80-
// }
81-
8272
Some(())
8373
}
8474

crates/emmylua_code_analysis/src/compilation/analyzer/doc/field_or_operator_def_tags.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ pub fn analyze_field(analyzer: &mut DocAnalyzer, tag: LuaDocTagField) -> Option<
9494
),
9595
("key".to_string(), Some(key_type_ref)),
9696
],
97-
vec![field_type],
97+
field_type,
9898
))),
9999
);
100100
analyzer.db.get_operator_index_mut().add_operator(operator);
@@ -178,7 +178,7 @@ pub fn analyze_operator(analyzer: &mut DocAnalyzer, tag: LuaDocTagOperator) -> O
178178
false,
179179
false,
180180
operands,
181-
vec![return_type],
181+
return_type,
182182
))),
183183
);
184184

crates/emmylua_code_analysis/src/compilation/analyzer/doc/infer_type.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use crate::{
1515
LuaIntersectionType, LuaObjectType, LuaStringTplType, LuaTupleType, LuaType, LuaUnionType,
1616
},
1717
DiagnosticCode, GenericTpl, InFiled, LuaAliasCallKind, LuaMultiLineUnion, LuaTypeDeclId,
18-
TypeOps,
18+
TypeOps, VariadicType,
1919
};
2020

2121
use super::{preprocess_description, DocAnalyzer};
@@ -450,8 +450,16 @@ fn infer_func_type(analyzer: &mut DocAnalyzer, func: &LuaDocFuncType) -> LuaType
450450
}
451451
}
452452

453+
let return_type = if return_types.len() == 1 {
454+
return_types[0].clone()
455+
} else if return_types.len() > 1 {
456+
LuaType::Variadic(VariadicType::Multi(return_types).into())
457+
} else {
458+
LuaType::Nil
459+
};
460+
453461
LuaType::DocFunction(
454-
LuaFunctionType::new(is_async, is_colon, params_result, return_types).into(),
462+
LuaFunctionType::new(is_async, is_colon, params_result, return_type).into(),
455463
)
456464
}
457465

@@ -536,8 +544,8 @@ fn infer_variadic_type(
536544
let name_type = variadic_type.get_name_type()?;
537545
let name = name_type.get_name_text()?;
538546
let base = infer_buildin_or_ref_type(analyzer, &name, name_type.get_range(), node);
539-
540-
Some(LuaType::Variadic(base.into()))
547+
let variadic = VariadicType::Base(base.clone());
548+
Some(LuaType::Variadic(variadic.into()))
541549
}
542550

543551
fn infer_multi_line_union_type(

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ use crate::{
88
UnResolveParentClosureParams, UnResolveReturn,
99
},
1010
db_index::{LuaDocReturnInfo, LuaSignatureId},
11-
infer_expr, DbIndex, InferFailReason, LuaInferCache, LuaMultiReturn, LuaType,
12-
SignatureReturnStatus, TypeOps,
11+
infer_expr, DbIndex, InferFailReason, LuaInferCache, LuaType, SignatureReturnStatus, TypeOps,
12+
VariadicType,
1313
};
1414

1515
use super::{func_body::analyze_func_body_returns, LuaAnalyzer, LuaReturnPoint};
@@ -211,7 +211,7 @@ pub fn analyze_return_point(
211211
let expr_type = infer_expr(db, cache, expr.clone())?;
212212
multi_return.push(expr_type);
213213
}
214-
let typ = LuaType::MuliReturn(LuaMultiReturn::Multi(multi_return).into());
214+
let typ = LuaType::Variadic(VariadicType::Multi(multi_return).into());
215215
return_type = TypeOps::Union.apply(&return_type, &typ);
216216
}
217217
LuaReturnPoint::Nil => {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ pub fn analyze_for_range_stat(
2222
let iter_doc_func = infer_for_range_iter_expr_func(analyzer.db, first_iter_type);
2323

2424
if let Some(doc_func) = iter_doc_func {
25-
let multi_return = doc_func.get_multi_return();
25+
let multi_return = doc_func.get_variadic_ret();
2626
let mut idx = 0;
2727
for var_name in var_name_list {
2828
let position = var_name.get_position();

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ pub fn analyze_chunk_return(analyzer: &mut LuaAnalyzer, chunk: LuaChunk) -> Opti
3434
.get_module_index_mut()
3535
.get_module_mut(analyzer.file_id)?;
3636
match expr_type {
37-
LuaType::MuliReturn(multi) => {
37+
LuaType::Variadic(multi) => {
3838
let ty = multi.get_type(0)?;
3939
module_info.export_type = Some(ty.clone());
4040
}

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

Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -35,21 +35,22 @@ pub fn analyze_local_stat(analyzer: &mut LuaAnalyzer, local_stat: LuaLocalStat)
3535
for i in 0..name_count {
3636
let name = name_list.get(i)?;
3737
let position = name.get_position();
38-
let expr = expr_list.get(i);
39-
if expr.is_none() {
38+
let expr = if let Some(expr) = expr_list.get(i) {
39+
expr.clone()
40+
} else {
4041
break;
41-
}
42-
let expr = expr?;
43-
match analyzer.infer_expr(expr) {
42+
};
43+
44+
match analyzer.infer_expr(&expr) {
4445
Ok(mut expr_type) => {
45-
if let LuaType::MuliReturn(multi) = expr_type {
46+
if let LuaType::Variadic(multi) = expr_type {
4647
expr_type = multi.get_type(0)?.clone();
4748
}
4849
let decl_id = LuaDeclId::new(analyzer.file_id, position);
4950
// 当`call`参数包含表时, 表可能未被分析, 需要延迟
5051
if let LuaType::Instance(instance) = &expr_type {
5152
if instance.get_base().is_unknown() {
52-
if call_expr_has_effect_table_arg(expr).is_some() {
53+
if call_expr_has_effect_table_arg(&expr).is_some() {
5354
let unresolve = UnResolveDecl {
5455
file_id: analyzer.file_id,
5556
decl_id,
@@ -62,9 +63,7 @@ pub fn analyze_local_stat(analyzer: &mut LuaAnalyzer, local_stat: LuaLocalStat)
6263
}
6364
}
6465
}
65-
if let LuaType::Variadic(variadic) = expr_type {
66-
expr_type = variadic.as_ref().clone();
67-
}
66+
6867
bind_type(
6968
analyzer.db,
7069
decl_id.into(),
@@ -99,21 +98,17 @@ pub fn analyze_local_stat(analyzer: &mut LuaAnalyzer, local_stat: LuaLocalStat)
9998
if let Some(last_expr) = last_expr {
10099
match analyzer.infer_expr(last_expr) {
101100
Ok(last_expr_type) => {
102-
if let LuaType::MuliReturn(multi) = last_expr_type {
101+
if let LuaType::Variadic(variadic) = last_expr_type {
103102
for i in expr_count..name_count {
104103
let name = name_list.get(i)?;
105104
let position = name.get_position();
106105
let decl_id = LuaDeclId::new(analyzer.file_id, position);
107-
let ret_type = multi.get_type(i - expr_count + 1);
108-
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-
}
106+
let ret_type = variadic.get_type(i - expr_count + 1);
107+
if let Some(ret_type) = ret_type {
113108
bind_type(
114109
analyzer.db,
115110
decl_id.into(),
116-
LuaTypeCache::InferType(final_type),
111+
LuaTypeCache::InferType(ret_type.clone()),
117112
);
118113
} else {
119114
analyzer.db.get_type_index_mut().bind_type(
@@ -271,7 +266,7 @@ pub fn analyze_assign_stat(analyzer: &mut LuaAnalyzer, assign_stat: LuaAssignSta
271266

272267
let expr_type = match analyzer.infer_expr(expr) {
273268
Ok(expr_type) => match expr_type {
274-
LuaType::MuliReturn(multi) => multi.get_type(0)?.clone(),
269+
LuaType::Variadic(multi) => multi.get_type(0)?.clone(),
275270
_ => expr_type,
276271
},
277272
Err(InferFailReason::None) => LuaType::Unknown,
@@ -355,15 +350,9 @@ fn assign_merge_type_owner_and_expr_type(
355350
idx: usize,
356351
) -> Option<()> {
357352
let mut expr_type = expr_type.clone();
358-
if let LuaType::MuliReturn(multi) = expr_type {
353+
if let LuaType::Variadic(multi) = expr_type {
359354
expr_type = multi.get_type(idx).unwrap_or(&LuaType::Nil).clone();
360355
}
361-
match &expr_type {
362-
LuaType::Variadic(variadic) => {
363-
expr_type = variadic.as_ref().clone();
364-
}
365-
_ => {}
366-
}
367356

368357
bind_type(analyzer.db, type_owner, LuaTypeCache::InferType(expr_type));
369358

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ pub fn try_resolve_decl(
3737
};
3838
let decl_id = decl.decl_id;
3939
let expr_type = match &expr_type {
40-
LuaType::MuliReturn(multi) => multi
40+
LuaType::Variadic(multi) => multi
4141
.get_type(decl.ret_idx)
4242
.cloned()
4343
.unwrap_or(LuaType::Unknown),
@@ -96,7 +96,7 @@ pub fn try_resolve_member(
9696
};
9797

9898
let expr_type = match &expr_type {
99-
LuaType::MuliReturn(multi) => multi
99+
LuaType::Variadic(multi) => multi
100100
.get_type(unresolve_member.ret_idx)
101101
.cloned()
102102
.unwrap_or(LuaType::Unknown),
@@ -221,7 +221,7 @@ pub fn try_resolve_module(
221221
};
222222

223223
let expr_type = match &expr_type {
224-
LuaType::MuliReturn(multi) => multi.get_type(0).cloned().unwrap_or(LuaType::Unknown),
224+
LuaType::Variadic(multi) => multi.get_type(0).cloned().unwrap_or(LuaType::Unknown),
225225
_ => expr_type,
226226
};
227227
let module_info = db.get_module_index_mut().get_module_mut(module.file_id)?;
@@ -281,7 +281,7 @@ pub fn try_resolve_iter_var(
281281
}
282282
};
283283

284-
let multi_return = func.get_multi_return();
284+
let multi_return = func.get_variadic_ret();
285285
let mut iter_type = multi_return
286286
.get_type(iter_var.ret_idx)
287287
.cloned()

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

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ pub fn try_resolve_closure_return(
153153
_ => {}
154154
}
155155

156-
let expr_closure_return = if let Some(param_type) = call_doc_func.get_params().get(param_idx) {
156+
let ret_type = if let Some(param_type) = call_doc_func.get_params().get(param_idx) {
157157
if let Some(LuaType::DocFunction(func)) = &param_type.1 {
158158
func.get_ret()
159159
} else {
@@ -167,17 +167,15 @@ pub fn try_resolve_closure_return(
167167
.get_signature_index_mut()
168168
.get_mut(&closure_return.signature_id)?;
169169

170-
if expr_closure_return.iter().any(|it| it.contain_tpl()) {
170+
if ret_type.contain_tpl() {
171171
return try_convert_to_func_body_infer(db, cache, closure_return);
172172
}
173173

174-
for ret_type in expr_closure_return {
175-
signature.return_docs.push(LuaDocReturnInfo {
176-
name: None,
177-
type_ref: ret_type.clone(),
178-
description: None,
179-
});
180-
}
174+
signature.return_docs.push(LuaDocReturnInfo {
175+
name: None,
176+
type_ref: ret_type.clone(),
177+
description: None,
178+
});
181179

182180
signature.resolve_return = SignatureReturnStatus::DocResolve;
183181
Some(true)
@@ -286,12 +284,7 @@ pub fn try_resolve_closure_parent_params(
286284
let signature = db.get_signature_index().get(id);
287285

288286
if let Some(signature) = signature {
289-
let fake_doc_function = LuaFunctionType::new(
290-
signature.is_async,
291-
signature.is_colon_define,
292-
signature.get_type_params(),
293-
signature.get_return_types(),
294-
);
287+
let fake_doc_function = signature.to_doc_func_type();
295288
resolve_doc_function(db, closure_params, &fake_doc_function, self_type)
296289
} else {
297290
Some(true)
@@ -356,13 +349,11 @@ fn resolve_doc_function(
356349
{
357350
signature.return_docs.clear();
358351
signature.resolve_return = SignatureReturnStatus::DocResolve;
359-
for ret in doc_func.get_ret() {
360-
signature.return_docs.push(LuaDocReturnInfo {
361-
name: None,
362-
type_ref: ret.clone(),
363-
description: None,
364-
});
365-
}
352+
signature.return_docs.push(LuaDocReturnInfo {
353+
name: None,
354+
type_ref: doc_func.get_ret().clone(),
355+
description: None,
356+
});
366357
}
367358

368359
Some(true)

crates/emmylua_code_analysis/src/db_index/operators/lua_operator.rs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,7 @@ impl LuaOperator {
7676

7777
pub fn get_result(&self, db: &DbIndex) -> Result<LuaType, InferFailReason> {
7878
match &self.func {
79-
OperatorFunction::Func(func) => {
80-
let return_types = func.get_ret();
81-
if return_types.is_empty() {
82-
return Ok(LuaType::Any);
83-
}
84-
return Ok(return_types[0].clone());
85-
}
79+
OperatorFunction::Func(func) => Ok(func.get_ret().clone()),
8680
OperatorFunction::Signature(signature_id) => {
8781
let signature = db.get_signature_index().get(signature_id);
8882
if let Some(signature) = signature {

0 commit comments

Comments
 (0)