Skip to content

Commit 6680801

Browse files
committed
refactor unresolve improve analyze performance
Fix #389
1 parent 3b1da29 commit 6680801

File tree

20 files changed

+1289
-948
lines changed

20 files changed

+1289
-948
lines changed

crates/emmylua_code_analysis/src/compilation/analyzer/decl/exprs.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,9 +208,14 @@ pub fn analyze_table_expr(analyzer: &mut DeclAnalyzer, table_expr: LuaTableExpr)
208208
table_expr: table_expr.clone(),
209209
field: field.clone(),
210210
decl_feature,
211-
reason: InferFailReason::UnResolveExpr(field_expr.clone()),
212211
};
213-
analyzer.add_unresolved(unresolve_member.into());
212+
analyzer.context.add_unresolve(
213+
unresolve_member.into(),
214+
InferFailReason::UnResolveExpr(InFiled::new(
215+
analyzer.get_file_id(),
216+
field_expr.clone(),
217+
)),
218+
);
214219
continue;
215220
}
216221
};

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

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::{
88
profile::Profile,
99
};
1010

11-
use super::{unresolve::UnResolve, AnalyzeContext};
11+
use super::AnalyzeContext;
1212
use emmylua_parser::{LuaAst, LuaAstNode, LuaChunk, LuaFuncStat, LuaSyntaxKind, LuaVarExpr};
1313
use rowan::{TextRange, TextSize, WalkEvent};
1414

@@ -23,14 +23,15 @@ pub(crate) fn analyze(db: &mut DbIndex, context: &mut AnalyzeContext) {
2323
for in_filed_tree in tree_list.iter() {
2424
db.get_reference_index_mut()
2525
.create_local_reference(in_filed_tree.file_id);
26-
let mut analyzer =
27-
DeclAnalyzer::new(db, in_filed_tree.file_id, in_filed_tree.value.clone());
26+
let mut analyzer = DeclAnalyzer::new(
27+
db,
28+
in_filed_tree.file_id,
29+
in_filed_tree.value.clone(),
30+
context,
31+
);
2832
analyzer.analyze();
29-
let (decl_tree, unresolved) = analyzer.get_decl_tree();
33+
let decl_tree = analyzer.get_decl_tree();
3034
db.get_decl_index_mut().add_decl_tree(decl_tree);
31-
for unresolve in unresolved {
32-
context.add_unresolve(unresolve);
33-
}
3435
}
3536
}
3637

@@ -143,18 +144,23 @@ pub struct DeclAnalyzer<'a> {
143144
decl: LuaDeclarationTree,
144145
scopes: Vec<LuaScopeId>,
145146
is_meta: bool,
146-
pub unresolved: Vec<UnResolve>,
147+
context: &'a mut AnalyzeContext,
147148
}
148149

149150
impl<'a> DeclAnalyzer<'a> {
150-
pub fn new(db: &'a mut DbIndex, file_id: FileId, root: LuaChunk) -> DeclAnalyzer<'a> {
151+
pub fn new(
152+
db: &'a mut DbIndex,
153+
file_id: FileId,
154+
root: LuaChunk,
155+
context: &'a mut AnalyzeContext,
156+
) -> DeclAnalyzer<'a> {
151157
DeclAnalyzer {
152158
db,
153159
root,
154160
decl: LuaDeclarationTree::new(file_id),
155161
scopes: Vec::new(),
156162
is_meta: false,
157-
unresolved: Vec::new(),
163+
context,
158164
}
159165
}
160166

@@ -172,12 +178,8 @@ impl<'a> DeclAnalyzer<'a> {
172178
self.decl.file_id()
173179
}
174180

175-
pub fn add_unresolved(&mut self, unresolved: UnResolve) {
176-
self.unresolved.push(unresolved);
177-
}
178-
179-
pub fn get_decl_tree(self) -> (LuaDeclarationTree, Vec<UnResolve>) {
180-
(self.decl, self.unresolved)
181+
pub fn get_decl_tree(self) -> LuaDeclarationTree {
182+
self.decl
181183
}
182184

183185
pub fn create_scope(&mut self, range: TextRange, kind: LuaScopeKind) {

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,10 +241,11 @@ pub fn analyze_module(analyzer: &mut DocAnalyzer, tag: LuaDocTagModule) -> Optio
241241
let unresolve = UnResolveModuleRef {
242242
module_file_id,
243243
owner_id,
244-
reason: InferFailReason::None,
245244
};
246245

247-
analyzer.context.add_unresolve(unresolve.into());
246+
analyzer
247+
.context
248+
.add_unresolve(unresolve.into(), InferFailReason::None);
248249
}
249250

250251
Some(())

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

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -62,40 +62,44 @@ fn analyze_lambda_params(
6262
signature_id: signature_id.clone(),
6363
call_expr,
6464
param_idx: founded_idx,
65-
reason: InferFailReason::None,
6665
};
6766

68-
analyzer.add_unresolved(unresolved.into());
67+
analyzer
68+
.context
69+
.add_unresolve(unresolved.into(), InferFailReason::None);
6970
}
7071
LuaAst::LuaFuncStat(func_stat) => {
7172
let unresolved = UnResolveParentClosureParams {
7273
file_id: analyzer.file_id,
7374
signature_id: signature_id.clone(),
7475
parent_ast: UnResolveParentAst::LuaFuncStat(func_stat.clone()),
75-
reason: InferFailReason::None,
7676
};
7777

78-
analyzer.add_unresolved(unresolved.into());
78+
analyzer
79+
.context
80+
.add_unresolve(unresolved.into(), InferFailReason::None);
7981
}
8082
LuaAst::LuaTableField(table_field) => {
8183
let unresolved = UnResolveParentClosureParams {
8284
file_id: analyzer.file_id,
8385
signature_id: signature_id.clone(),
8486
parent_ast: UnResolveParentAst::LuaTableField(table_field.clone()),
85-
reason: InferFailReason::None,
8687
};
8788

88-
analyzer.add_unresolved(unresolved.into());
89+
analyzer
90+
.context
91+
.add_unresolve(unresolved.into(), InferFailReason::None);
8992
}
9093
LuaAst::LuaAssignStat(assign_stat) => {
9194
let unresolved = UnResolveParentClosureParams {
9295
file_id: analyzer.file_id,
9396
signature_id: signature_id.clone(),
9497
parent_ast: UnResolveParentAst::LuaAssignStat(assign_stat.clone()),
95-
reason: InferFailReason::None,
9698
};
9799

98-
analyzer.add_unresolved(unresolved.into());
100+
analyzer
101+
.context
102+
.add_unresolve(unresolved.into(), InferFailReason::None);
99103
}
100104
_ => {}
101105
}
@@ -149,10 +153,9 @@ fn analyze_return(
149153
file_id: analyzer.file_id,
150154
signature_id: signature_id.clone(),
151155
return_points,
152-
reason,
153156
};
154157

155-
analyzer.add_unresolved(unresolve.into());
158+
analyzer.context.add_unresolve(unresolve.into(), reason);
156159
return None;
157160
}
158161
};
@@ -187,10 +190,11 @@ fn analyze_lambda_returns(
187190
call_expr,
188191
param_idx: founded_idx,
189192
return_points,
190-
reason: InferFailReason::None,
191193
};
192194

193-
analyzer.add_unresolved(unresolved.into());
195+
analyzer
196+
.context
197+
.add_unresolve(unresolved.into(), InferFailReason::None);
194198

195199
Some(())
196200
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,10 @@ pub fn analyze_for_range_stat(
7272
decl_id,
7373
iter_expr: first_iter_expr.clone(),
7474
ret_idx: idx,
75-
reason: reason.clone(),
7675
};
77-
analyzer.add_unresolved(unresolved.into());
76+
analyzer
77+
.context
78+
.add_unresolve(unresolved.into(), reason.clone());
7879
idx += 1;
7980
}
8081
}

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

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use crate::{
2727
CacheOptions, FileId, InferFailReason, LuaAnalysisPhase,
2828
};
2929

30-
use super::{unresolve::UnResolve, AnalyzeContext};
30+
use super::AnalyzeContext;
3131

3232
pub(crate) fn analyze(db: &mut DbIndex, context: &mut AnalyzeContext) {
3333
let _p = Profile::cond_new("lua analyze", context.tree_list.len() > 1);
@@ -48,15 +48,11 @@ pub(crate) fn analyze(db: &mut DbIndex, context: &mut AnalyzeContext) {
4848
analysis_phase: LuaAnalysisPhase::Ordered,
4949
},
5050
);
51-
let mut analyzer = LuaAnalyzer::new(db, file_id, cache);
51+
let mut analyzer = LuaAnalyzer::new(db, file_id, cache, context);
5252
for node in root.descendants::<LuaAst>() {
5353
analyze_node(&mut analyzer, node);
5454
}
5555
analyze_chunk_return(&mut analyzer, root.clone());
56-
let unresolved = analyzer.move_unresolved();
57-
for unresolve in unresolved {
58-
context.add_unresolve(unresolve);
59-
}
6056
}
6157
}
6258
}
@@ -98,20 +94,21 @@ struct LuaAnalyzer<'a> {
9894
file_id: FileId,
9995
db: &'a mut DbIndex,
10096
infer_cache: LuaInferCache,
101-
unresolved: Vec<UnResolve>,
97+
context: &'a mut AnalyzeContext,
10298
}
10399

104100
impl LuaAnalyzer<'_> {
105101
pub fn new<'a>(
106102
db: &'a mut DbIndex,
107103
file_id: FileId,
108104
infer_config: LuaInferCache,
105+
context: &'a mut AnalyzeContext,
109106
) -> LuaAnalyzer<'a> {
110107
LuaAnalyzer {
111108
file_id,
112109
db,
113110
infer_cache: infer_config,
114-
unresolved: Vec::new(),
111+
context,
115112
}
116113
}
117114
}
@@ -120,12 +117,4 @@ impl LuaAnalyzer<'_> {
120117
pub fn infer_expr(&mut self, expr: &LuaExpr) -> Result<LuaType, InferFailReason> {
121118
infer_expr(self.db, &mut self.infer_cache, expr.clone())
122119
}
123-
124-
pub fn add_unresolved(&mut self, unresolved: UnResolve) {
125-
self.unresolved.push(unresolved);
126-
}
127-
128-
pub fn move_unresolved(self) -> Vec<UnResolve> {
129-
self.unresolved
130-
}
131120
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,8 @@ pub fn analyze_chunk_return(analyzer: &mut LuaAnalyzer, chunk: LuaChunk) -> Opti
2020
let unresolve = UnResolveModule {
2121
file_id: analyzer.file_id,
2222
expr,
23-
reason,
2423
};
25-
analyzer.add_unresolved(unresolve.into());
24+
analyzer.context.add_unresolve(unresolve.into(), reason);
2625
return None;
2726
}
2827
};

0 commit comments

Comments
 (0)