Skip to content

Commit db8d1e3

Browse files
committed
support multi line union completion
Fix #792
1 parent e69821d commit db8d1e3

File tree

3 files changed

+35
-3
lines changed

3 files changed

+35
-3
lines changed

crates/emmylua_code_analysis/src/semantic/infer/infer_index.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,14 @@ pub fn infer_member_by_member_key(
170170
LuaType::Union(union_type) => {
171171
infer_union_member(db, cache, union_type, index_expr, infer_guard)
172172
}
173+
LuaType::MultiLineUnion(multi_union) => {
174+
let union_type = multi_union.to_union();
175+
if let LuaType::Union(union_type) = union_type {
176+
infer_union_member(db, cache, &union_type, index_expr, infer_guard)
177+
} else {
178+
Err(InferFailReason::FieldNotFound)
179+
}
180+
}
173181
LuaType::Intersection(intersection_type) => {
174182
infer_intersection_member(db, cache, intersection_type, index_expr, infer_guard)
175183
}
@@ -641,7 +649,14 @@ fn infer_union_member(
641649
infer_guard: &InferGuardRef,
642650
) -> InferResult {
643651
let mut member_types = Vec::new();
652+
let mut meet_string = false;
644653
for sub_type in union_type.into_vec() {
654+
if sub_type.is_string() {
655+
if meet_string {
656+
continue;
657+
}
658+
meet_string = true;
659+
}
645660
let result = infer_member_by_member_key(
646661
db,
647662
cache,

crates/emmylua_code_analysis/src/semantic/member/find_members.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,14 @@ fn find_members_guard(
7878
LuaType::Tuple(tuple_type) => find_tuple_members(tuple_type, filter),
7979
LuaType::Object(object_type) => find_object_members(object_type, filter),
8080
LuaType::Union(union_type) => find_union_members(db, union_type, infer_guard, filter),
81+
LuaType::MultiLineUnion(multi_union) => {
82+
let union_type = multi_union.to_union();
83+
if let LuaType::Union(union_type) = union_type {
84+
find_union_members(db, &union_type, infer_guard, filter)
85+
} else {
86+
None
87+
}
88+
}
8189
LuaType::Intersection(intersection_type) => {
8290
find_intersection_members(db, intersection_type, infer_guard, filter)
8391
}
@@ -282,7 +290,15 @@ fn find_union_members(
282290
filter: &FindMemberFilter,
283291
) -> FindMembersResult {
284292
let mut members = Vec::new();
293+
let mut meet_string = false;
285294
for typ in union_type.into_vec().iter() {
295+
if typ.is_string() {
296+
if meet_string {
297+
continue;
298+
}
299+
meet_string = true;
300+
}
301+
286302
let sub_members = find_members_guard(db, typ, &infer_guard.fork(), filter);
287303
if let Some(sub_members) = sub_members {
288304
members.extend(sub_members);

crates/emmylua_code_analysis/src/semantic/member/mod.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,10 @@ use super::{
2222

2323
pub fn get_buildin_type_map_type_id(type_: &LuaType) -> Option<LuaTypeDeclId> {
2424
match type_ {
25-
LuaType::String | LuaType::StringConst(_) | LuaType::DocStringConst(_) => {
26-
Some(LuaTypeDeclId::new("string"))
27-
}
25+
LuaType::String
26+
| LuaType::StringConst(_)
27+
| LuaType::DocStringConst(_)
28+
| LuaType::Language(_) => Some(LuaTypeDeclId::new("string")),
2829
LuaType::Io => Some(LuaTypeDeclId::new("io")),
2930
_ => None,
3031
}

0 commit comments

Comments
 (0)