Skip to content

Commit 75a6cac

Browse files
committed
refactor union
1 parent e0fb155 commit 75a6cac

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+222
-250
lines changed

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -316,23 +316,23 @@ fn infer_binary_type(analyzer: &mut DocAnalyzer, binary_type: &LuaDocBinaryType)
316316
match op.get_op() {
317317
LuaTypeBinaryOperator::Union => match (left_type, right_type) {
318318
(LuaType::Union(left_type_union), LuaType::Union(right_type_union)) => {
319-
let mut left_types = left_type_union.into_types();
320-
let right_types = right_type_union.into_types();
321-
left_types.extend(right_types);
322-
return LuaType::Union(LuaUnionType::new(left_types).into());
319+
let mut left_type_set = left_type_union.into_vec();
320+
let right_types = right_type_union.into_vec();
321+
left_type_set.extend(right_types);
322+
return LuaType::Union(LuaUnionType::from_vec(left_type_set).into());
323323
}
324324
(LuaType::Union(left_type_union), right) => {
325-
let mut left_types = (*left_type_union).into_types();
325+
let mut left_types = (*left_type_union).into_vec();
326326
left_types.push(right);
327-
return LuaType::Union(LuaUnionType::new(left_types).into());
327+
return LuaType::Union(LuaUnionType::from_vec(left_types).into());
328328
}
329329
(left, LuaType::Union(right_type_union)) => {
330-
let mut right_types = (*right_type_union).into_types();
330+
let mut right_types = (*right_type_union).into_vec();
331331
right_types.push(left);
332-
return LuaType::Union(LuaUnionType::new(right_types).into());
332+
return LuaType::Union(LuaUnionType::from_vec(right_types).into());
333333
}
334334
(left, right) => {
335-
return LuaType::Union(LuaUnionType::new(vec![left, right]).into());
335+
return LuaType::Union(LuaUnionType::from_vec(vec![left, right]).into());
336336
}
337337
},
338338
LuaTypeBinaryOperator::Intersection => match (left_type, right_type) {

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ fn find_union_function_member(
326326
deep_guard: &mut DeepGuard,
327327
) -> FunctionTypeResult {
328328
let mut member_types = Vec::new();
329-
for sub_type in union_type.get_types() {
329+
for sub_type in union_type.into_vec() {
330330
let result = find_function_type_by_member_key(
331331
db,
332332
cache,
@@ -345,11 +345,10 @@ fn find_union_function_member(
345345
}
346346
}
347347

348-
member_types.dedup();
349348
match member_types.len() {
350349
0 => Ok(LuaType::Nil),
351350
1 => Ok(member_types[0].clone()),
352-
_ => Ok(LuaType::Union(LuaUnionType::new(member_types).into())),
351+
_ => Ok(LuaType::Union(LuaUnionType::from_vec(member_types).into())),
353352
}
354353
}
355354

@@ -688,7 +687,7 @@ fn find_member_by_index_union(
688687
deep_guard: &mut DeepGuard,
689688
) -> FunctionTypeResult {
690689
let mut member_type = LuaType::Unknown;
691-
for member in union.get_types() {
690+
for member in union.into_vec() {
692691
let result = find_function_type_by_operator(
693692
db,
694693
cache,

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ pub fn try_resolve_call_closure_params(
6161
LuaType::DocFunction(func) => (func.is_async(), func.get_params().to_vec()),
6262
LuaType::Union(union_types) => {
6363
if let Some(LuaType::DocFunction(func)) = union_types
64-
.get_types()
64+
.into_vec()
6565
.iter()
6666
.find(|typ| matches!(typ, LuaType::DocFunction(_)))
6767
{
@@ -308,7 +308,7 @@ fn resolve_closure_member_type(
308308
let mut final_ret = LuaType::Unknown;
309309

310310
let mut multi_function_type = Vec::new();
311-
for typ in union_types.get_types() {
311+
for typ in union_types.into_vec() {
312312
match typ {
313313
LuaType::DocFunction(func) => {
314314
multi_function_type.push(func.clone());
@@ -502,7 +502,7 @@ fn filter_signature_type(typ: &LuaType) -> Option<Vec<Arc<LuaFunctionType>>> {
502502
result.push(func.clone());
503503
}
504504
LuaType::Union(union) => {
505-
let types = union.get_types();
505+
let types = union.into_vec();
506506
for typ in types.into_iter().rev() {
507507
stack.push(typ);
508508
}
@@ -534,7 +534,7 @@ fn find_best_function_type(
534534
0 => {}
535535
1 => return Some(LuaType::DocFunction(filtered_types[0].clone())),
536536
_ => {
537-
return Some(LuaType::Union(Arc::new(LuaUnionType::new(
537+
return Some(LuaType::Union(Arc::new(LuaUnionType::from_vec(
538538
filtered_types
539539
.into_iter()
540540
.map(|func| LuaType::DocFunction(func.clone()))
@@ -561,7 +561,7 @@ fn find_best_function_type(
561561
.map(LuaType::DocFunction);
562562
}
563563
_ => {
564-
return Some(LuaType::Union(Arc::new(LuaUnionType::new(
564+
return Some(LuaType::Union(Arc::new(LuaUnionType::from_vec(
565565
origin_signature
566566
.overloads
567567
.clone()

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,9 @@ mod test {
5252
);
5353

5454
let a_ty = ws.expr_ty("a");
55-
println!("{:?}", a_ty);
56-
assert_eq!(
57-
format!("{:?}", a_ty).to_string(),
58-
"Union(Multi([IntegerConst(2), Nil]))"
59-
);
55+
let a_humanize = ws.humanize_type(a_ty);
56+
let a_expected = "2?";
57+
assert_eq!(a_humanize, a_expected);
6058
}
6159

6260
#[test]

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -229,12 +229,13 @@ mod test {
229229
// 必须要这样写, 无法直接`A = a`拿到`a`的实际类型, `A`的推断目前是独立的且在`Test.e`推断之前缓存
230230
let ty = ws.expr_ty("A");
231231
let expected_a = ws.ty("string|number");
232-
let expected_a_str = ws.humanize_type(expected_a);
232+
// let expected_a_str = ws.humanize_type(expected_a);
233233

234234
match ty {
235235
LuaType::Union(union) => {
236-
let signature = union
237-
.get_types()
236+
let types = union.into_vec();
237+
let signature = types
238+
.iter()
238239
.last()
239240
.and_then(|t| match t {
240241
LuaType::Signature(id) => {
@@ -249,7 +250,7 @@ mod test {
249250
.map(|p| p.type_ref.clone())
250251
.expect("Parameter 'a' not found");
251252

252-
assert_eq!(ws.humanize_type(param_type), expected_a_str);
253+
assert_eq!(param_type, expected_a);
253254
}
254255
_ => panic!("Expected a union type"),
255256
}
@@ -276,13 +277,13 @@ mod test {
276277
{
277278
let ty = ws.expr_ty("A");
278279
let expected = ws.ty("string|number");
279-
assert_eq!(ws.humanize_type(ty), ws.humanize_type(expected));
280+
assert_eq!(ty, expected);
280281
}
281282

282283
{
283284
let ty = ws.expr_ty("B");
284285
let expected = ws.ty("number");
285-
assert_eq!(ws.humanize_type(ty), ws.humanize_type(expected));
286+
assert_eq!(ty, expected);
286287
}
287288
}
288289

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -799,8 +799,8 @@ end
799799
);
800800

801801
let res = ws.expr_ty("res");
802-
let res_desc = ws.humanize_type(res);
803-
assert_eq!(res_desc, "(string[]|string)");
802+
let expected_ty = ws.ty("string|string[]");
803+
assert_eq!(res, expected_ty);
804804
}
805805

806806
#[test]

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,10 @@ mod test {
144144

145145
assert_eq!(
146146
ws.expr_ty("d"),
147-
LuaType::Union(Arc::new(LuaUnionType::new(vec![
147+
LuaType::Union(Arc::new(LuaUnionType::from_vec(vec![
148148
LuaType::String,
149-
LuaType::Number,
150-
])))
149+
LuaType::Number
150+
]))),
151151
);
152152
}
153153
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ mod test {
2424
let c_ty = ws.expr_ty("c");
2525

2626
let union_type = LuaType::Union(
27-
LuaUnionType::new(vec![
27+
LuaUnionType::from_vec(vec![
2828
LuaType::StringConst(SmolStr::new("a").into()),
2929
LuaType::StringConst(SmolStr::new("b").into()),
3030
LuaType::StringConst(SmolStr::new("c").into()),

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#[cfg(test)]
22
mod tests {
3-
use crate::{DiagnosticCode, VirtualWorkspace};
3+
use crate::{DiagnosticCode, LuaType, LuaUnionType, VirtualWorkspace};
44

55
#[test]
66
fn test_issue_231() {
@@ -41,6 +41,10 @@ mod tests {
4141
"#,
4242
);
4343
let ty = ws.expr_ty("A");
44-
assert_eq!(ws.humanize_type(ty), "(36|826)");
44+
let expected_ty = LuaType::Union(
45+
LuaUnionType::from_vec(vec![LuaType::IntegerConst(36), LuaType::IntegerConst(826)])
46+
.into(),
47+
);
48+
assert_eq!(ty, expected_ty);
4549
}
4650
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ pub fn format_union_type<F>(
213213
where
214214
F: FnMut(&LuaType, RenderLevel) -> String,
215215
{
216-
let types = union.get_types();
216+
let types = union.into_vec();
217217
let num = match level {
218218
RenderLevel::Detailed => 8,
219219
RenderLevel::Simple => 6,

0 commit comments

Comments
 (0)