Skip to content

Commit 09ecbfe

Browse files
committed
fix infer_union_binary_expr EmmyLuaLs#406
1 parent 37a839a commit 09ecbfe

File tree

2 files changed

+38
-5
lines changed

2 files changed

+38
-5
lines changed

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

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -538,4 +538,33 @@ mod test {
538538
"#
539539
));
540540
}
541+
542+
#[test]
543+
fn test_string_add_enum_key() {
544+
let mut ws = VirtualWorkspace::new();
545+
assert!(ws.check_code_for(
546+
DiagnosticCode::UndefinedField,
547+
r#"
548+
---@class py.GameAPI
549+
GameAPI = {}
550+
551+
function GameAPI.get_kv_pair_value_unit_entity(handle, key) end
552+
553+
function GameAPI.get_kv_pair_value_unit_name() end
554+
555+
---@enum(key) KV.SupportTypeEnum
556+
local apiAlias = {
557+
Unit = 'unit_entity',
558+
UnitKey = 'unit_name',
559+
}
560+
561+
---@param lua_type 'boolean' | 'number' | 'integer' | 'string' | 'table' | KV.SupportTypeEnum
562+
---@return any
563+
local function kv_load_from_handle(lua_type)
564+
local alias = apiAlias[lua_type]
565+
local api = GameAPI['get_kv_pair_value_' .. alias]
566+
end
567+
"#
568+
));
569+
}
541570
}

crates/emmylua_code_analysis/src/semantic/infer/infer_binary/mod.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,22 +41,26 @@ fn infer_union_binary_expr(
4141
left_type: &LuaType,
4242
right_type: &LuaType,
4343
) -> Option<LuaType> {
44-
let (u, other) = if let LuaType::Union(u) = left_type {
45-
(u, right_type)
44+
let (u, other, is_left_union) = if let LuaType::Union(u) = left_type {
45+
(u, right_type, true)
4646
} else if let LuaType::Union(u) = right_type {
47-
(u, left_type)
47+
(u, left_type, false)
4848
} else {
4949
return None;
5050
};
5151

5252
let mut result = LuaType::Unknown;
5353
let types = u.get_types();
5454
for ty in types.iter() {
55-
if let Ok(ty) = infer_binary_expr_type(db, ty.clone(), other.clone(), op) {
55+
if let Ok(ty) = if is_left_union {
56+
infer_binary_expr_type(db, ty.clone(), other.clone(), op)
57+
} else {
58+
infer_binary_expr_type(db, other.clone(), ty.clone(), op)
59+
} {
5660
result = TypeOps::Union.apply(&result, &ty);
5761
}
5862
}
59-
return Some(result);
63+
Some(result)
6064
}
6165

6266
fn infer_binary_expr_type(

0 commit comments

Comments
 (0)