Skip to content

Commit d3bf7f3

Browse files
committed
optimize performance for large table
1 parent 1ebf9c3 commit d3bf7f3

File tree

3 files changed

+52
-30
lines changed

3 files changed

+52
-30
lines changed

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

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -441,35 +441,35 @@ pub fn analyze_local_func_stat(
441441
}
442442

443443
pub fn analyze_table_field(analyzer: &mut LuaAnalyzer, field: LuaTableField) -> Option<()> {
444-
let _ = field.get_field_key()?;
445-
let value_expr = field.get_value_expr()?;
446-
let member_id = LuaMemberId::new(field.get_syntax_id(), analyzer.file_id);
447-
let value_type = match analyzer.infer_expr(&value_expr.clone().into()) {
448-
Ok(value_type) => match value_type {
449-
LuaType::Def(ref_id) => LuaType::Ref(ref_id),
450-
_ => value_type,
451-
},
452-
Err(InferFailReason::None) => LuaType::Unknown,
453-
Err(reason) => {
454-
let unresolve = UnResolveMember {
455-
file_id: analyzer.file_id,
456-
member_id,
457-
expr: Some(value_expr.clone()),
458-
prefix: None,
459-
ret_idx: 0,
460-
};
461-
462-
analyzer.context.add_unresolve(unresolve.into(), reason);
463-
return None;
464-
}
465-
};
444+
if field.is_assign_field() {
445+
let value_expr = field.get_value_expr()?;
446+
let member_id = LuaMemberId::new(field.get_syntax_id(), analyzer.file_id);
447+
let value_type = match analyzer.infer_expr(&value_expr.clone().into()) {
448+
Ok(value_type) => match value_type {
449+
LuaType::Def(ref_id) => LuaType::Ref(ref_id),
450+
_ => value_type,
451+
},
452+
Err(InferFailReason::None) => LuaType::Unknown,
453+
Err(reason) => {
454+
let unresolve = UnResolveMember {
455+
file_id: analyzer.file_id,
456+
member_id,
457+
expr: Some(value_expr.clone()),
458+
prefix: None,
459+
ret_idx: 0,
460+
};
466461

467-
bind_type(
468-
analyzer.db,
469-
member_id.into(),
470-
LuaTypeCache::InferType(value_type),
471-
);
462+
analyzer.context.add_unresolve(unresolve.into(), reason);
463+
return None;
464+
}
465+
};
472466

467+
bind_type(
468+
analyzer.db,
469+
member_id.into(),
470+
LuaTypeCache::InferType(value_type),
471+
);
472+
}
473473
Some(())
474474
}
475475

crates/emmylua_code_analysis/src/diagnostic/checker/missing_fields.rs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,28 @@ fn check_table_expr(
5757
}
5858
}
5959
}
60+
LuaType::TableConst(in_file_range) => {
61+
let file_id = in_file_range.file_id;
62+
if file_id == semantic_model.get_file_id() {
63+
let range = in_file_range.value;
64+
if expr.get_range() == range {
65+
return Some(());
66+
}
67+
}
68+
69+
LuaType::TableConst(in_file_range)
70+
}
71+
6072
table_type => table_type,
6173
};
6274

63-
let current_fields = expr
64-
.get_fields()
75+
let fields = expr.get_fields().collect::<Vec<_>>();
76+
if fields.len() > 50 {
77+
return Some(());
78+
}
79+
80+
let current_fields = fields
81+
.iter()
6582
.filter_map(|field| field.get_field_key().map(|key| key.get_path_part()))
6683
.collect();
6784

crates/emmylua_code_analysis/src/diagnostic/checker/mod.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,10 @@ use lsp_types::{Diagnostic, DiagnosticSeverity, DiagnosticTag, NumberOrString};
4141
use rowan::TextRange;
4242
use std::sync::Arc;
4343

44+
#[allow(unused)]
4445
use crate::{
45-
FileId, LuaType, RenderLevel, db_index::DbIndex, humanize_type, semantic::SemanticModel,
46+
FileId, LuaType, Profile, RenderLevel, db_index::DbIndex, humanize_type,
47+
semantic::SemanticModel,
4648
};
4749

4850
use super::{
@@ -62,6 +64,9 @@ fn run_check<T: Checker>(context: &mut DiagnosticContext, semantic_model: &Seman
6264
.iter()
6365
.any(|code| context.is_checker_enable_by_code(code))
6466
{
67+
// let name = T::CODES.iter().map(|c| c.get_name()).collect::<Vec<_>>().join(",");
68+
// let show_name = format!("{}({})", std::any::type_name::<T>(), name);
69+
// let _p = Profile::new(&show_name);
6570
T::check(context, semantic_model);
6671
}
6772
}

0 commit comments

Comments
 (0)