Skip to content

Commit f58bf63

Browse files
committed
more fast resolve
1 parent 5292397 commit f58bf63

File tree

6 files changed

+139
-73
lines changed

6 files changed

+139
-73
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ use crate::{
1010
LuaDeclId, LuaDocParamInfo, LuaDocReturnInfo, LuaMemberId, LuaOperator, LuaSemanticDeclId,
1111
LuaSignatureId, LuaType,
1212
},
13-
InFiled, LuaOperatorMetaMethod, LuaTypeCache, OperatorFunction, SignatureReturnStatus, TypeOps,
13+
InFiled, InferFailReason, LuaOperatorMetaMethod, LuaTypeCache, OperatorFunction,
14+
SignatureReturnStatus, TypeOps,
1415
};
1516

1617
use super::{
@@ -240,6 +241,7 @@ pub fn analyze_module(analyzer: &mut DocAnalyzer, tag: LuaDocTagModule) -> Optio
240241
let unresolve = UnResolveModuleRef {
241242
module_file_id,
242243
owner_id,
244+
reason: InferFailReason::None,
243245
};
244246

245247
analyzer.context.add_unresolve(unresolve.into());

crates/emmylua_code_analysis/src/compilation/analyzer/lua/closure.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ fn analyze_lambda_params(
6262
signature_id: signature_id.clone(),
6363
call_expr,
6464
param_idx: founded_idx,
65+
reason: InferFailReason::None,
6566
};
6667

6768
analyzer.add_unresolved(unresolved.into());
@@ -71,6 +72,7 @@ fn analyze_lambda_params(
7172
file_id: analyzer.file_id,
7273
signature_id: signature_id.clone(),
7374
parent_ast: UnResolveParentAst::LuaFuncStat(func_stat.clone()),
75+
reason: InferFailReason::None,
7476
};
7577

7678
analyzer.add_unresolved(unresolved.into());
@@ -80,6 +82,7 @@ fn analyze_lambda_params(
8082
file_id: analyzer.file_id,
8183
signature_id: signature_id.clone(),
8284
parent_ast: UnResolveParentAst::LuaTableField(table_field.clone()),
85+
reason: InferFailReason::None,
8386
};
8487

8588
analyzer.add_unresolved(unresolved.into());
@@ -89,6 +92,7 @@ fn analyze_lambda_params(
8992
file_id: analyzer.file_id,
9093
signature_id: signature_id.clone(),
9194
parent_ast: UnResolveParentAst::LuaAssignStat(assign_stat.clone()),
95+
reason: InferFailReason::None,
9296
};
9397

9498
analyzer.add_unresolved(unresolved.into());
@@ -181,6 +185,7 @@ fn analyze_lambda_returns(
181185
call_expr,
182186
param_idx: founded_idx,
183187
return_points,
188+
reason: InferFailReason::None,
184189
};
185190

186191
analyzer.add_unresolved(unresolved.into());

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

Lines changed: 61 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
use emmylua_parser::LuaAstNode;
22

33
use crate::{
4-
infer_expr, DbIndex, FileId, InFiled, InferFailReason, LuaDeclExtra, LuaDeclId,
5-
LuaDocParamInfo, LuaDocReturnInfo, LuaInferCache, LuaSemanticDeclId, LuaType, LuaTypeCache,
6-
SignatureReturnStatus,
4+
infer_expr, DbIndex, FileId, InFiled, InferFailReason, LuaDocReturnInfo, LuaInferCache,
5+
LuaSemanticDeclId, LuaType, LuaTypeCache, SignatureReturnStatus,
76
};
87

98
use super::{infer_manager::InferCacheManager, UnResolve};
@@ -44,53 +43,68 @@ pub fn check_reach_reason(
4443
}
4544
}
4645

47-
pub fn resolve_all_reason<F>(
46+
pub fn resolve_all_reason(
4847
db: &mut DbIndex,
4948
infer_manager: &mut InferCacheManager,
5049
unresolves: &mut Vec<UnResolve>,
51-
resolve_fn: F,
52-
) where
53-
F: Fn(&mut DbIndex, &mut LuaInferCache, &mut InferFailReason) -> Option<()>,
54-
{
50+
) {
5551
for unresolve in unresolves.iter_mut() {
5652
let file_id = unresolve.get_file_id().unwrap_or(FileId { id: 0 });
5753
let cache = infer_manager.get_infer_cache(file_id);
54+
let mut need_remove = Some(false);
5855
match unresolve {
5956
UnResolve::Decl(un_resolve_decl) => {
60-
resolve_fn(db, cache, &mut un_resolve_decl.reason);
57+
need_remove = resolve_as_any(db, cache, &mut un_resolve_decl.reason);
6158
}
6259
UnResolve::Member(ref mut un_resolve_member) => {
63-
resolve_fn(db, cache, &mut un_resolve_member.reason);
60+
need_remove = resolve_as_any(db, cache, &mut un_resolve_member.reason);
6461
}
6562
UnResolve::Module(un_resolve_module) => {
66-
resolve_fn(db, cache, &mut un_resolve_module.reason);
63+
need_remove = resolve_as_any(db, cache, &mut un_resolve_module.reason);
6764
}
6865
UnResolve::Return(un_resolve_return) => {
69-
resolve_fn(db, cache, &mut un_resolve_return.reason);
66+
need_remove = resolve_as_any(db, cache, &mut un_resolve_return.reason);
7067
}
7168
UnResolve::IterDecl(un_resolve_iter_var) => {
72-
resolve_fn(db, cache, &mut un_resolve_iter_var.reason);
69+
need_remove = resolve_as_any(db, cache, &mut un_resolve_iter_var.reason);
7370
}
74-
_ => continue,
71+
UnResolve::ClosureParams(un_resolve_call_closure_params) => {
72+
need_remove = resolve_as_any(db, cache, &mut un_resolve_call_closure_params.reason);
73+
}
74+
UnResolve::ClosureReturn(un_resolve_closure_return) => {
75+
need_remove = resolve_as_any(db, cache, &mut un_resolve_closure_return.reason);
76+
}
77+
UnResolve::ClosureParentParams(un_resolve_parent_closure_params) => {
78+
need_remove =
79+
resolve_as_any(db, cache, &mut un_resolve_parent_closure_params.reason);
80+
}
81+
UnResolve::ModuleRef(un_resolve_module_ref) => {
82+
need_remove = resolve_as_any(db, cache, &mut un_resolve_module_ref.reason);
83+
}
84+
UnResolve::TableField(un_resolve_table_field) => {
85+
need_remove = resolve_as_any(db, cache, &mut un_resolve_table_field.reason);
86+
}
87+
UnResolve::None => {}
7588
};
89+
90+
if need_remove.unwrap_or(false) {
91+
*unresolve = UnResolve::None;
92+
}
7693
}
7794
}
7895

7996
pub fn resolve_as_any(
8097
db: &mut DbIndex,
8198
cache: &mut LuaInferCache,
8299
reason: &mut InferFailReason,
83-
) -> Option<()> {
100+
) -> Option<bool> {
84101
match reason {
85102
InferFailReason::None
86103
| InferFailReason::FieldDotFound
87-
| InferFailReason::RecursiveInfer => {}
104+
| InferFailReason::RecursiveInfer => {
105+
return Some(true);
106+
}
88107
InferFailReason::UnResolveDeclType(decl_id) => {
89-
let decl = db.get_decl_index_mut().get_decl_mut(decl_id)?;
90-
if decl.is_param() {
91-
return set_param_decl_type(db, decl_id, LuaType::Any);
92-
}
93-
94108
db.get_type_index_mut().bind_type(
95109
decl_id.clone().into(),
96110
LuaTypeCache::InferType(LuaType::Any),
@@ -128,33 +142,33 @@ pub fn resolve_as_any(
128142
}
129143

130144
*reason = InferFailReason::None;
131-
Some(())
145+
Some(false)
132146
}
133147

134-
fn set_param_decl_type(db: &mut DbIndex, decl_id: &LuaDeclId, typ: LuaType) -> Option<()> {
135-
let decl = db.get_decl_index_mut().get_decl_mut(decl_id)?;
148+
// fn set_param_decl_type(db: &mut DbIndex, decl_id: &LuaDeclId, typ: LuaType) -> Option<()> {
149+
// let decl = db.get_decl_index_mut().get_decl_mut(decl_id)?;
136150

137-
let (param_idx, signature_id) = match &decl.extra {
138-
LuaDeclExtra::Param {
139-
idx, signature_id, ..
140-
} => (*idx, *signature_id),
141-
_ => unreachable!(),
142-
};
151+
// let (param_idx, signature_id) = match &decl.extra {
152+
// LuaDeclExtra::Param {
153+
// idx, signature_id, ..
154+
// } => (*idx, *signature_id),
155+
// _ => unreachable!(),
156+
// };
143157

144-
// find local annotation
145-
if let Some(signature) = db.get_signature_index_mut().get_mut(&signature_id) {
146-
if signature.param_docs.get(&param_idx).is_none() {
147-
let name = signature.params.get(param_idx)?;
148-
signature.param_docs.insert(
149-
param_idx,
150-
LuaDocParamInfo {
151-
name: name.clone(),
152-
type_ref: typ,
153-
description: None,
154-
nullable: false,
155-
},
156-
);
157-
}
158-
}
159-
Some(())
160-
}
158+
// // find local annotation
159+
// if let Some(signature) = db.get_signature_index_mut().get_mut(&signature_id) {
160+
// if signature.param_docs.get(&param_idx).is_none() {
161+
// let name = signature.params.get(param_idx)?;
162+
// signature.param_docs.insert(
163+
// param_idx,
164+
// LuaDocParamInfo {
165+
// name: name.clone(),
166+
// type_ref: typ,
167+
// description: None,
168+
// nullable: false,
169+
// },
170+
// );
171+
// }
172+
// }
173+
// Some(())
174+
// }

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

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::{
88
profile::Profile,
99
FileId, InferFailReason, LuaMemberFeature, LuaSemanticDeclId,
1010
};
11-
use check_reason::{resolve_all_reason, resolve_as_any};
11+
use check_reason::resolve_all_reason;
1212
use emmylua_parser::{
1313
LuaAssignStat, LuaCallExpr, LuaExpr, LuaFuncStat, LuaTableExpr, LuaTableField,
1414
};
@@ -27,24 +27,20 @@ pub fn analyze(db: &mut DbIndex, context: &mut AnalyzeContext) {
2727
let _p = Profile::cond_new("resolve analyze", context.tree_list.len() > 1);
2828
let mut unresolves = std::mem::take(&mut context.unresolves);
2929
let mut infer_manager = InferCacheManager::new();
30-
while try_resolve(db, &mut infer_manager, &mut unresolves) {
31-
unresolves.retain(|un_resolve| match un_resolve {
32-
UnResolve::None => false,
33-
_ => true,
34-
});
35-
}
3630

37-
infer_manager.set_force();
3831
let mut loop_count = 0;
3932
while !unresolves.is_empty() {
40-
resolve_all_reason(db, &mut infer_manager, &mut unresolves, resolve_as_any);
41-
4233
while try_resolve(db, &mut infer_manager, &mut unresolves) {
4334
unresolves.retain(|un_resolve| match un_resolve {
4435
UnResolve::None => false,
4536
_ => true,
4637
});
4738
}
39+
if loop_count == 0 {
40+
infer_manager.set_force();
41+
}
42+
43+
resolve_all_reason(db, &mut infer_manager, &mut unresolves);
4844

4945
if loop_count >= 10 {
5046
break;
@@ -215,6 +211,7 @@ pub struct UnResolveCallClosureParams {
215211
pub signature_id: LuaSignatureId,
216212
pub call_expr: LuaCallExpr,
217213
pub param_idx: usize,
214+
pub reason: InferFailReason,
218215
}
219216

220217
impl From<UnResolveCallClosureParams> for UnResolve {
@@ -245,6 +242,7 @@ pub struct UnResolveClosureReturn {
245242
pub call_expr: LuaCallExpr,
246243
pub param_idx: usize,
247244
pub return_points: Vec<LuaReturnPoint>,
245+
pub reason: InferFailReason,
248246
}
249247

250248
impl From<UnResolveClosureReturn> for UnResolve {
@@ -257,6 +255,7 @@ impl From<UnResolveClosureReturn> for UnResolve {
257255
pub struct UnResolveModuleRef {
258256
pub owner_id: LuaSemanticDeclId,
259257
pub module_file_id: FileId,
258+
pub reason: InferFailReason,
260259
}
261260

262261
impl From<UnResolveModuleRef> for UnResolve {
@@ -277,6 +276,7 @@ pub struct UnResolveParentClosureParams {
277276
pub file_id: FileId,
278277
pub signature_id: LuaSignatureId,
279278
pub parent_ast: UnResolveParentAst,
279+
pub reason: InferFailReason,
280280
}
281281

282282
impl From<UnResolveParentClosureParams> for UnResolve {

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,9 +298,13 @@ pub fn try_resolve_iter_var(
298298

299299
pub fn try_resolve_module_ref(
300300
db: &mut DbIndex,
301-
_: &mut LuaInferCache,
301+
cache: &mut LuaInferCache,
302302
module_ref: &UnResolveModuleRef,
303303
) -> Option<bool> {
304+
if !check_reach_reason(db, cache, &module_ref.reason).unwrap_or(false) {
305+
return None;
306+
}
307+
304308
let module_index = db.get_module_index();
305309
let module = module_index.get_module(module_ref.module_file_id)?;
306310
let export_type = module.export_type.clone()?;

0 commit comments

Comments
 (0)