Skip to content

Commit 14ca723

Browse files
committed
optimize table_generic_tpl_pattern_member_owner_match
1 parent 95d5a7f commit 14ca723

File tree

3 files changed

+40
-20
lines changed

3 files changed

+40
-20
lines changed

crates/emmylua_code_analysis/src/db_index/member/lua_member_owner.rs

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
1-
use std::sync::Arc;
2-
31
use internment::ArcIntern;
42
use rowan::TextRange;
53
use smol_str::SmolStr;
64

7-
use crate::{GlobalId, InFiled, LuaGenericType, LuaTypeDeclId};
5+
use crate::{GlobalId, InFiled, LuaTypeDeclId};
86

97
#[derive(Debug, Hash, PartialEq, Eq, Clone)]
108
pub enum LuaMemberOwner {
119
LocalUnresolve,
1210
Type(LuaTypeDeclId),
1311
Element(InFiled<TextRange>),
1412
GlobalPath(GlobalId),
15-
Generic(Arc<LuaGenericType>),
1613
}
1714

1815
impl From<LuaTypeDeclId> for LuaMemberOwner {
@@ -45,12 +42,6 @@ impl From<GlobalId> for LuaMemberOwner {
4542
}
4643
}
4744

48-
impl From<LuaGenericType> for LuaMemberOwner {
49-
fn from(generic: LuaGenericType) -> Self {
50-
Self::Generic(Arc::new(generic))
51-
}
52-
}
53-
5445
impl LuaMemberOwner {
5546
pub fn get_type_id(&self) -> Option<&LuaTypeDeclId> {
5647
match self {

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1243,15 +1243,17 @@ mod test {
12431243
assert!(ws.check_code_for(
12441244
DiagnosticCode::ParamTypeNotMatch,
12451245
r#"
1246-
local pairs = pairs
1247-
12481246
---@type RingBufferSpan<number>
12491247
local span
12501248
12511249
for k, v in pairs(span) do
1250+
A = v
12521251
end
12531252
"#
12541253
));
1254+
let a_ty = ws.expr_ty("A");
1255+
let expected = ws.ty("number");
1256+
assert_eq!(a_ty, expected);
12551257
}
12561258

12571259
#[test]

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

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::ops::Deref;
1+
use std::{ops::Deref, sync::Arc};
22

33
use emmylua_parser::LuaAstNode;
44
use itertools::Itertools;
@@ -328,19 +328,40 @@ fn table_generic_tpl_pattern_match(
328328
}
329329
LuaType::TableConst(inst) => {
330330
let owner = LuaMemberOwner::Element(inst.clone());
331-
table_generic_tpl_pattern_member_owner_match(context, table_generic_params, owner)?;
331+
table_generic_tpl_pattern_member_owner_match(
332+
context,
333+
table_generic_params,
334+
owner,
335+
&[],
336+
)?;
332337
}
333338
LuaType::Ref(type_id) => {
334339
let owner = LuaMemberOwner::Type(type_id.clone());
335-
table_generic_tpl_pattern_member_owner_match(context, table_generic_params, owner)?;
340+
table_generic_tpl_pattern_member_owner_match(
341+
context,
342+
table_generic_params,
343+
owner,
344+
&[],
345+
)?;
336346
}
337347
LuaType::Def(type_id) => {
338348
let owner = LuaMemberOwner::Type(type_id.clone());
339-
table_generic_tpl_pattern_member_owner_match(context, table_generic_params, owner)?;
349+
table_generic_tpl_pattern_member_owner_match(
350+
context,
351+
table_generic_params,
352+
owner,
353+
&[],
354+
)?;
340355
}
341356
LuaType::Generic(generic) => {
342-
let owner = LuaMemberOwner::Generic(generic.clone());
343-
table_generic_tpl_pattern_member_owner_match(context, table_generic_params, owner)?;
357+
let owner = LuaMemberOwner::Type(generic.get_base_type_id());
358+
let target_params = generic.get_params();
359+
table_generic_tpl_pattern_member_owner_match(
360+
context,
361+
table_generic_params,
362+
owner,
363+
&target_params,
364+
)?;
344365
}
345366
LuaType::Object(obj) => {
346367
let mut keys = Vec::new();
@@ -384,15 +405,21 @@ fn table_generic_tpl_pattern_member_owner_match(
384405
context: &mut TplContext,
385406
table_generic_params: &Vec<LuaType>,
386407
owner: LuaMemberOwner,
408+
target_params: &[LuaType],
387409
) -> TplPatternMatchResult {
388410
if table_generic_params.len() != 2 {
389411
return Err(InferFailReason::None);
390412
}
391413

392414
let owner_type = match &owner {
393415
LuaMemberOwner::Element(inst) => LuaType::TableConst(inst.clone()),
394-
LuaMemberOwner::Type(type_id) => LuaType::Ref(type_id.clone()),
395-
LuaMemberOwner::Generic(generic) => LuaType::Generic(generic.clone()),
416+
LuaMemberOwner::Type(type_id) => match target_params.len() {
417+
0 => LuaType::Ref(type_id.clone()),
418+
_ => LuaType::Generic(Arc::new(LuaGenericType::new(
419+
type_id.clone(),
420+
target_params.to_vec(),
421+
))),
422+
},
396423
_ => {
397424
return Err(InferFailReason::None);
398425
}

0 commit comments

Comments
 (0)