Skip to content

Commit 8dc7644

Browse files
committed
refactor
1 parent 6260343 commit 8dc7644

File tree

48 files changed

+718
-575
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+718
-575
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
use crate::{DbIndex, GlobalId, LuaDeclId, LuaMemberId, LuaMemberOwner, LuaTypeOwner};
2+
3+
use super::get_owner_id;
4+
5+
pub fn migrate_global_members_when_type_resolve(
6+
db: &mut DbIndex,
7+
type_owner: LuaTypeOwner,
8+
) -> Option<()> {
9+
match type_owner {
10+
LuaTypeOwner::Decl(decl_id) => {
11+
migrate_global_member_to_decl(db, decl_id);
12+
}
13+
LuaTypeOwner::Member(member_id) => {
14+
migrate_global_member_to_member(db, member_id);
15+
}
16+
}
17+
Some(())
18+
}
19+
20+
fn migrate_global_member_to_decl(db: &mut DbIndex, decl_id: LuaDeclId) -> Option<()> {
21+
let decl = db.get_decl_index().get_decl(&decl_id)?;
22+
if !decl.is_global() {
23+
return None;
24+
}
25+
26+
let owner_id = get_owner_id(db, &decl_id.clone().into())?;
27+
28+
let name = decl.get_name();
29+
let global_id = GlobalId::new(name.into());
30+
let members = db
31+
.get_member_index()
32+
.get_members(&LuaMemberOwner::GlobalPath(global_id))?
33+
.iter()
34+
.map(|member| member.get_id())
35+
.collect::<Vec<_>>();
36+
37+
let member_index = db.get_member_index_mut();
38+
for member_id in members {
39+
member_index.set_member_owner(owner_id.clone(), member_id.file_id, member_id);
40+
member_index.add_member_to_owner(owner_id.clone(), member_id);
41+
}
42+
43+
Some(())
44+
}
45+
46+
fn migrate_global_member_to_member(db: &mut DbIndex, member_id: LuaMemberId) -> Option<()> {
47+
let member = db.get_member_index().get_member(&member_id)?;
48+
let global_id = member.get_global_id()?;
49+
let owner_id = get_owner_id(db, &member_id.clone().into())?;
50+
51+
let members = db
52+
.get_member_index()
53+
.get_members(&LuaMemberOwner::GlobalPath(global_id.clone()))?
54+
.iter()
55+
.map(|member| member.get_id())
56+
.collect::<Vec<_>>();
57+
58+
let member_index = db.get_member_index_mut();
59+
for member_id in members {
60+
member_index.set_member_owner(owner_id.clone(), member_id.file_id, member_id);
61+
member_index.add_member_to_owner(owner_id.clone(), member_id);
62+
}
63+
64+
Some(())
65+
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
mod migrate_global_member;
2+
3+
use migrate_global_member::migrate_global_members_when_type_resolve;
4+
use rowan::TextRange;
5+
6+
use crate::{
7+
db_index::{DbIndex, LuaMemberOwner, LuaType, LuaTypeDeclId},
8+
InFiled, LuaMemberId, LuaTypeCache, LuaTypeOwner,
9+
};
10+
11+
pub fn bind_type(
12+
db: &mut DbIndex,
13+
type_owner: LuaTypeOwner,
14+
type_cache: LuaTypeCache,
15+
) -> Option<()> {
16+
let decl_type_cache = db.get_type_index().get_type_cache(&type_owner);
17+
18+
if decl_type_cache.is_none() {
19+
db.get_type_index_mut()
20+
.bind_type(type_owner.clone(), type_cache);
21+
migrate_global_members_when_type_resolve(db, type_owner);
22+
} else {
23+
let decl_type = decl_type_cache.unwrap().as_type();
24+
merge_def_type(db, decl_type.clone(), type_cache.as_type().clone());
25+
}
26+
27+
Some(())
28+
}
29+
30+
fn merge_def_type(db: &mut DbIndex, decl_type: LuaType, expr_type: LuaType) {
31+
match &decl_type {
32+
LuaType::Def(def) => match &expr_type {
33+
LuaType::TableConst(in_filed_range) => {
34+
merge_def_type_with_table(db, def.clone(), in_filed_range.clone());
35+
}
36+
LuaType::Instance(instance) => {
37+
let base_ref = instance.get_base();
38+
merge_def_type(db, base_ref.clone(), expr_type);
39+
}
40+
_ => {}
41+
},
42+
_ => {}
43+
}
44+
}
45+
46+
fn merge_def_type_with_table(
47+
db: &mut DbIndex,
48+
def_id: LuaTypeDeclId,
49+
table_range: InFiled<TextRange>,
50+
) -> Option<()> {
51+
let expr_member_owner = LuaMemberOwner::Element(table_range);
52+
let member_index = db.get_member_index_mut();
53+
let expr_member_ids = member_index
54+
.get_members(&expr_member_owner)?
55+
.iter()
56+
.map(|member| member.get_id())
57+
.collect::<Vec<_>>();
58+
let def_owner = LuaMemberOwner::Type(def_id);
59+
for table_member_id in expr_member_ids {
60+
add_member(db, def_owner.clone(), table_member_id);
61+
}
62+
63+
Some(())
64+
}
65+
66+
pub fn add_member(db: &mut DbIndex, owner: LuaMemberOwner, member_id: LuaMemberId) -> Option<()> {
67+
db.get_member_index_mut()
68+
.set_member_owner(owner.clone(), member_id.file_id, member_id);
69+
db.get_member_index_mut()
70+
.add_member_to_owner(owner.clone(), member_id);
71+
72+
// let item = db.get_member_index().get_member_item_by_member_id(member_id)?;
73+
// if item.is_one() {
74+
// return Some(())
75+
// }
76+
77+
// let resolve_member_id = item.resolve_type_owner_member_id(db)?;
78+
// if resolve_member_id != member_id {
79+
// return None;
80+
// }
81+
82+
Some(())
83+
}
84+
85+
fn get_owner_id(db: &DbIndex, type_owner: &LuaTypeOwner) -> Option<LuaMemberOwner> {
86+
let type_cache = db.get_type_index().get_type_cache(&type_owner)?;
87+
match type_cache.as_type() {
88+
LuaType::Ref(type_id) => Some(LuaMemberOwner::Type(type_id.clone())),
89+
LuaType::TableConst(id) => Some(LuaMemberOwner::Element(id.clone())),
90+
LuaType::Instance(inst) => Some(LuaMemberOwner::Element(inst.get_range().clone())),
91+
_ => None,
92+
}
93+
}

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -223,9 +223,7 @@ pub fn analyze_table_expr(analyzer: &mut DeclAnalyzer, table_expr: LuaTableExpr)
223223
LuaMemberOwner::GlobalPath(path) => {
224224
LuaMember::new(member_id, key, decl_feature, Some(path.clone()))
225225
}
226-
_ => {
227-
LuaMember::new(member_id, key, decl_feature, None)
228-
}
226+
_ => LuaMember::new(member_id, key, decl_feature, None),
229227
};
230228
analyzer
231229
.db

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use emmylua_parser::{LuaAstNode, LuaExpr, LuaIndexExpr, PathTrait};
2-
use internment::ArcIntern;
32
use smol_str::SmolStr;
43

54
use crate::{GlobalId, LuaMemberOwner};

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use emmylua_parser::{
55

66
use crate::{
77
db_index::{LocalAttribute, LuaDecl, LuaMember, LuaMemberKey},
8-
LuaDeclExtra, LuaMemberFeature, LuaMemberId, LuaMemberOwner, LuaSemanticDeclId, LuaSignatureId,
8+
LuaDeclExtra, LuaMemberFeature, LuaMemberId, LuaSemanticDeclId, LuaSignatureId,
99
};
1010

1111
use super::{members::find_index_owner, DeclAnalyzer};

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

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use emmylua_parser::{
99
use rowan::TextRange;
1010

1111
use crate::{
12+
compilation::analyzer::bind_type::bind_type,
1213
db_index::{LuaDeclId, LuaMemberId, LuaSemanticDeclId, LuaSignatureId, LuaType},
1314
LuaTypeCache, LuaTypeDeclId,
1415
};
@@ -378,35 +379,30 @@ fn bind_def_type(analyzer: &mut DocAnalyzer, type_def: LuaType) -> Option<()> {
378379
let file_id = analyzer.file_id;
379380
let decl_id = LuaDeclId::new(file_id, position);
380381

381-
analyzer
382-
.db
383-
.get_type_index_mut()
384-
.bind_type(decl_id.into(), LuaTypeCache::DocType(type_def));
382+
bind_type(analyzer.db, decl_id.into(), LuaTypeCache::DocType(type_def));
385383
}
386384
LuaAst::LuaAssignStat(assign_stat) => {
387385
if let LuaVarExpr::NameExpr(name_expr) = assign_stat.child::<LuaVarExpr>()? {
388386
let position = name_expr.get_position();
389387
let file_id = analyzer.file_id;
390388
let decl_id = LuaDeclId::new(file_id, position);
391-
392-
analyzer
393-
.db
394-
.get_type_index_mut()
395-
.bind_type(decl_id.into(), LuaTypeCache::DocType(type_def));
389+
bind_type(analyzer.db, decl_id.into(), LuaTypeCache::DocType(type_def));
396390
} else if let LuaVarExpr::IndexExpr(index_expr) = assign_stat.child::<LuaVarExpr>()? {
397391
let member_id = LuaMemberId::new(index_expr.get_syntax_id(), analyzer.file_id);
398-
analyzer
399-
.db
400-
.get_type_index_mut()
401-
.bind_type(member_id.into(), LuaTypeCache::DocType(type_def));
392+
bind_type(
393+
analyzer.db,
394+
member_id.into(),
395+
LuaTypeCache::DocType(type_def),
396+
);
402397
}
403398
}
404399
LuaAst::LuaTableField(field) => {
405400
let member_id = LuaMemberId::new(field.get_syntax_id(), analyzer.file_id);
406-
analyzer
407-
.db
408-
.get_type_index_mut()
409-
.bind_type(member_id.into(), LuaTypeCache::DocType(type_def));
401+
bind_type(
402+
analyzer.db,
403+
member_id.into(),
404+
LuaTypeCache::DocType(type_def),
405+
);
410406
}
411407
_ => {}
412408
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ pub fn analyze_cast(analyzer: &mut DocAnalyzer, tag: LuaDocTagCast) -> Option<()
282282
for op in tag.get_op_types() {
283283
if let Some(doc_type) = op.get_type() {
284284
let typ = infer_type(analyzer, doc_type.clone());
285-
analyzer.context.type_flow.insert(
285+
analyzer.context.cast_flow.insert(
286286
InFiled {
287287
file_id: analyzer.file_id,
288288
value: doc_type.get_syntax_id(),

crates/emmylua_code_analysis/src/compilation/analyzer/flow/cast_analyze.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ pub fn analyze_cast(
5454
}
5555
} else if let Some(doc_typ) = cast_op_type.get_type() {
5656
let key = InFiled::new(file_id, doc_typ.get_syntax_id());
57-
let typ = match context.type_flow.get(&key) {
57+
let typ = match context.cast_flow.get(&key) {
5858
Some(t) => t.clone(),
5959
None => continue,
6060
};

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

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -162,14 +162,7 @@ fn analyze_flow(
162162
FlowRef::IndexExpr(expr) => LuaVarExpr::IndexExpr(expr.clone()),
163163
_ => continue,
164164
};
165-
analyze_ref_assign(
166-
db,
167-
&mut flow_chain,
168-
var_expr,
169-
var_path,
170-
file_id,
171-
context,
172-
);
165+
analyze_ref_assign(db, &mut flow_chain, var_expr, var_path, file_id);
173166
}
174167
FlowNode::CastRef(ref_node) => {
175168
let tag_cast = match ref_node {

crates/emmylua_code_analysis/src/compilation/analyzer/flow/var_analyze.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,8 @@ use rowan::TextRange;
77
use smol_str::SmolStr;
88

99
use crate::{
10-
compilation::analyzer::AnalyzeContext,
1110
db_index::{LuaType, TypeAssertion},
12-
DbIndex, FileId, InFiled, LuaFlowChain, LuaTypeDeclId,
11+
DbIndex, FileId, LuaDeclId, LuaFlowChain, LuaMemberId, LuaTypeDeclId, LuaTypeOwner,
1312
};
1413

1514
pub fn analyze_ref_expr(
@@ -37,16 +36,21 @@ pub fn analyze_ref_assign(
3736
var_expr: LuaVarExpr,
3837
path: &str,
3938
file_id: FileId,
40-
context: &AnalyzeContext,
4139
) -> Option<()> {
4240
let assign_stat = var_expr.get_parent::<LuaAssignStat>()?;
4341
if is_decl_assign_stat(assign_stat.clone()).unwrap_or(false) {
44-
let key = InFiled {
45-
file_id,
46-
value: var_expr.get_syntax_id(),
42+
let type_owner = match var_expr {
43+
LuaVarExpr::IndexExpr(index_expr) => {
44+
let member_id = LuaMemberId::new(index_expr.get_syntax_id(), file_id);
45+
LuaTypeOwner::Member(member_id)
46+
}
47+
LuaVarExpr::NameExpr(name_expr) => {
48+
let decl_id = LuaDeclId::new(file_id, name_expr.get_position());
49+
LuaTypeOwner::Decl(decl_id)
50+
}
4751
};
48-
if let Some(typ) = context.type_flow.get(&key) {
49-
let type_assert = TypeAssertion::Narrow(typ.clone());
52+
if let Some(type_cache) = db.get_type_index().get_type_cache(&type_owner) {
53+
let type_assert = TypeAssertion::Narrow(type_cache.as_type().clone());
5054
broadcast_down(
5155
db,
5256
flow_chain,

0 commit comments

Comments
 (0)