Skip to content

Commit 15fb0a6

Browse files
committed
update
1 parent a5f3a59 commit 15fb0a6

6 files changed

Lines changed: 69 additions & 73 deletions

File tree

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ pub struct LuaInferCache {
2121
HashMap<(LuaSyntaxId, Option<usize>, LuaType), CacheEntry<Arc<LuaFunctionType>>>,
2222
pub flow_node_cache: HashMap<(VarRefId, FlowId), CacheEntry<LuaType>>,
2323
pub index_ref_origin_type_cache: HashMap<VarRefId, CacheEntry<LuaType>>,
24+
pub expr_var_ref_id_cache: HashMap<LuaSyntaxId, VarRefId>,
2425
}
2526

2627
impl LuaInferCache {
@@ -32,6 +33,7 @@ impl LuaInferCache {
3233
call_cache: HashMap::new(),
3334
flow_node_cache: HashMap::new(),
3435
index_ref_origin_type_cache: HashMap::new(),
36+
expr_var_ref_id_cache: HashMap::new(),
3537
}
3638
}
3739

@@ -52,5 +54,6 @@ impl LuaInferCache {
5254
self.call_cache.clear();
5355
self.flow_node_cache.clear();
5456
self.index_ref_origin_type_cache.clear();
57+
self.expr_var_ref_id_cache.clear();
5558
}
5659
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use crate::{
1414
semantic::{
1515
generic::{instantiate_type_generic, TypeSubstitutor},
1616
infer::{
17-
infer_name::get_name_expr_var_ref_d, narrow::infer_var_expr_narrow_type, VarRefId,
17+
infer_name::get_name_expr_var_ref_id, narrow::infer_var_expr_narrow_type, VarRefId,
1818
},
1919
member::get_buildin_type_map_type_id,
2020
type_check::{self, check_type_compact},
@@ -111,7 +111,7 @@ fn infer_member_type_pass_flow(
111111
}
112112

113113
if let LuaExpr::NameExpr(name_expr) = prefix_expr {
114-
let decl_or_member_id = match get_name_expr_var_ref_d(db, cache, &name_expr) {
114+
let decl_or_member_id = match get_name_expr_var_ref_id(db, cache, &name_expr) {
115115
Some(VarRefId::SelfRef(decl_or_id)) => decl_or_id,
116116
Some(VarRefId::VarRef(decl_id)) => LuaDeclOrMemberId::Decl(decl_id),
117117
_ => return Ok(member_type.clone()),
@@ -137,7 +137,7 @@ fn infer_member_type_pass_flow(
137137
pub fn get_index_expr_var_ref_id(
138138
db: &DbIndex,
139139
cache: &mut LuaInferCache,
140-
index_expr: LuaIndexExpr,
140+
index_expr: &LuaIndexExpr,
141141
) -> Option<VarRefId> {
142142
let access_path = match index_expr.get_access_path() {
143143
Some(path) => ArcIntern::new(SmolStr::new(&path)),
@@ -150,7 +150,7 @@ pub fn get_index_expr_var_ref_id(
150150
}
151151

152152
if let LuaExpr::NameExpr(name_expr) = prefix_expr {
153-
let decl_or_member_id = match get_name_expr_var_ref_d(db, cache, &name_expr) {
153+
let decl_or_member_id = match get_name_expr_var_ref_id(db, cache, &name_expr) {
154154
Some(VarRefId::SelfRef(decl_or_id)) => decl_or_id,
155155
Some(VarRefId::VarRef(decl_id)) => LuaDeclOrMemberId::Decl(decl_id),
156156
_ => return None,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ fn infer_self(db: &DbIndex, cache: &mut LuaInferCache, name_expr: LuaNameExpr) -
4141
infer_var_expr_narrow_type(db, cache, name_expr, VarRefId::SelfRef(decl_or_member_id))
4242
}
4343

44-
pub fn get_name_expr_var_ref_d(
44+
pub fn get_name_expr_var_ref_id(
4545
db: &DbIndex,
4646
cache: &mut LuaInferCache,
4747
name_expr: &LuaNameExpr,

crates/emmylua_code_analysis/src/semantic/infer/narrow/condition_flow/call_flow.rs

Lines changed: 37 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ use crate::{
1616
LuaType, TypeOps,
1717
};
1818

19-
#[allow(unused)]
2019
pub fn get_type_at_call_expr(
2120
db: &DbIndex,
2221
tree: &FlowTree,
@@ -36,22 +35,20 @@ pub fn get_type_at_call_expr(
3635
LuaType::DocFunction(f) => {
3736
let return_type = f.get_ret();
3837
match return_type {
39-
LuaType::TypeGuard(guard_type) => {
40-
return get_type_at_call_expr_by_type_guard(
41-
db,
42-
tree,
43-
cache,
44-
root,
45-
var_ref_id,
46-
flow_node,
47-
call_expr,
48-
guard_type.deref().clone(),
49-
condition_flow,
50-
)
51-
}
38+
LuaType::TypeGuard(guard_type) => get_type_at_call_expr_by_type_guard(
39+
db,
40+
tree,
41+
cache,
42+
root,
43+
var_ref_id,
44+
flow_node,
45+
call_expr,
46+
guard_type.deref().clone(),
47+
condition_flow,
48+
),
5249
_ => {
5350
// If the return type is not a type guard, we cannot infer the type cast.
54-
return Ok(ResultTypeOrContinue::Continue);
51+
Ok(ResultTypeOrContinue::Continue)
5552
}
5653
}
5754
}
@@ -64,43 +61,37 @@ pub fn get_type_at_call_expr(
6461
};
6562

6663
match signature_cast.name.as_str() {
67-
"self" => {
68-
return get_type_at_call_expr_by_signature_self(
69-
db,
70-
tree,
71-
cache,
72-
root,
73-
var_ref_id,
74-
flow_node,
75-
prefix_expr,
76-
signature_cast,
77-
condition_flow,
78-
);
79-
}
80-
name => {
81-
return get_type_at_call_expr_by_signature_param_name(
82-
db,
83-
tree,
84-
cache,
85-
root,
86-
var_ref_id,
87-
flow_node,
88-
call_expr,
89-
signature_cast,
90-
signature_id,
91-
name,
92-
condition_flow,
93-
)
94-
}
64+
"self" => get_type_at_call_expr_by_signature_self(
65+
db,
66+
tree,
67+
cache,
68+
root,
69+
var_ref_id,
70+
flow_node,
71+
prefix_expr,
72+
signature_cast,
73+
condition_flow,
74+
),
75+
name => get_type_at_call_expr_by_signature_param_name(
76+
db,
77+
tree,
78+
cache,
79+
root,
80+
var_ref_id,
81+
flow_node,
82+
call_expr,
83+
signature_cast,
84+
signature_id,
85+
name,
86+
condition_flow,
87+
),
9588
}
9689
}
9790
_ => {
9891
// If the prefix expression is not a function, we cannot infer the type cast.
99-
return Ok(ResultTypeOrContinue::Continue);
92+
Ok(ResultTypeOrContinue::Continue)
10093
}
10194
}
102-
103-
Ok(ResultTypeOrContinue::Continue)
10495
}
10596

10697
fn get_type_at_call_expr_by_type_guard(

crates/emmylua_code_analysis/src/semantic/infer/narrow/condition_flow/mod.rs

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -185,21 +185,14 @@ fn get_type_at_unary_flow(
185185
}
186186
}
187187

188-
let Some(maybe_ref_id) = get_var_expr_var_ref_id(db, cache, inner_expr) else {
189-
return Ok(ResultTypeOrContinue::Continue);
190-
};
191-
192-
if maybe_ref_id != *var_ref_id {
193-
return Ok(ResultTypeOrContinue::Continue);
194-
}
195-
196-
let antecedent_flow_id = get_single_antecedent(tree, flow_node)?;
197-
let antecedent_type = get_type_at_flow(db, tree, cache, root, var_ref_id, antecedent_flow_id)?;
198-
199-
let result_type = match condition_flow {
200-
InferConditionFlow::FalseCondition => remove_false_or_nil(antecedent_type),
201-
InferConditionFlow::TrueCondition => narrow_false_or_nil(db, antecedent_type),
202-
};
203-
204-
Ok(ResultTypeOrContinue::Result(result_type))
188+
get_type_at_condition_flow(
189+
db,
190+
tree,
191+
cache,
192+
root,
193+
var_ref_id,
194+
flow_node,
195+
inner_expr,
196+
condition_flow.get_negated(),
197+
)
205198
}

crates/emmylua_code_analysis/src/semantic/infer/narrow/var_ref_id.rs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
use emmylua_parser::LuaExpr;
1+
use emmylua_parser::{LuaAstNode, LuaExpr};
22
use internment::ArcIntern;
33
use rowan::TextSize;
44
use smol_str::SmolStr;
55

66
use crate::{
77
semantic::infer::{
8-
infer_index::get_index_expr_var_ref_id, infer_name::get_name_expr_var_ref_d,
8+
infer_index::get_index_expr_var_ref_id, infer_name::get_name_expr_var_ref_id,
99
},
1010
DbIndex, LuaDeclId, LuaDeclOrMemberId, LuaInferCache, LuaMemberId,
1111
};
@@ -47,9 +47,18 @@ pub fn get_var_expr_var_ref_id(
4747
cache: &mut LuaInferCache,
4848
var_expr: LuaExpr,
4949
) -> Option<VarRefId> {
50-
match var_expr {
51-
LuaExpr::NameExpr(name_expr) => get_name_expr_var_ref_d(db, cache, &name_expr),
50+
if let Some(var_ref_id) = cache.expr_var_ref_id_cache.get(&var_expr.get_syntax_id()) {
51+
return Some(var_ref_id.clone());
52+
}
53+
54+
let ref_id = match &var_expr {
55+
LuaExpr::NameExpr(name_expr) => get_name_expr_var_ref_id(db, cache, name_expr),
5256
LuaExpr::IndexExpr(index_expr) => get_index_expr_var_ref_id(db, cache, index_expr),
5357
_ => None,
54-
}
58+
}?;
59+
60+
cache
61+
.expr_var_ref_id_cache
62+
.insert(var_expr.get_syntax_id(), ref_id.clone());
63+
Some(ref_id)
5564
}

0 commit comments

Comments
 (0)