Skip to content

Commit 5f3f916

Browse files
committed
fix object type infer
1 parent c151e13 commit 5f3f916

File tree

4 files changed

+66
-20
lines changed

4 files changed

+66
-20
lines changed

crates/code_analysis/src/compilation/analyzer/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ pub fn analyze(db: &mut DbIndex, context: AnalyzeContext) {
2121
}
2222

2323
fn module_analyze(db: &mut DbIndex, context: &mut AnalyzeContext) {
24-
let _p = Profile::cond_new("module_analyze", context.tree_list.len() > 1);
24+
let _p = Profile::cond_new("module analyze", context.tree_list.len() > 1);
2525
for in_filed_tree in &context.tree_list {
2626
let file_id = in_filed_tree.file_id;
2727
if let Some(path) = db.get_vfs().get_file_path(&file_id).cloned() {

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

Lines changed: 54 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ pub fn infer_index_expr(
6363

6464
fn infer_member_by_member_key(
6565
db: &DbIndex,
66-
config: &LuaInferConfig,
66+
config: &mut LuaInferConfig,
6767
prefix_type: &LuaType,
6868
member_key: &LuaIndexKey,
6969
infer_guard: &mut InferGuard,
@@ -96,7 +96,7 @@ fn infer_member_by_member_key(
9696
infer_member_by_member_key(db, config, &inner_type, member_key, infer_guard)
9797
}
9898
LuaType::Tuple(tuple_type) => infer_tuple_member(tuple_type, member_key),
99-
LuaType::Object(object_type) => infer_object_member(object_type, member_key),
99+
LuaType::Object(object_type) => infer_object_member(db, config, object_type, member_key),
100100
LuaType::Union(union_type) => infer_union_member(db, config, union_type, member_key),
101101
LuaType::Intersection(intersection_type) => {
102102
infer_intersection_member(db, config, intersection_type, member_key)
@@ -129,7 +129,7 @@ fn infer_table_member(
129129

130130
fn infer_custom_type_member(
131131
db: &DbIndex,
132-
config: &LuaInferConfig,
132+
config: &mut LuaInferConfig,
133133
prefix_type_id: LuaTypeDeclId,
134134
member_key: &LuaIndexKey,
135135
infer_guard: &mut InferGuard,
@@ -188,14 +188,52 @@ fn infer_tuple_member(tuple_type: &LuaTupleType, member_key: &LuaIndexKey) -> In
188188
None
189189
}
190190

191-
fn infer_object_member(object_type: &LuaObjectType, member_key: &LuaIndexKey) -> InferResult {
192-
let member_type = object_type.get_field(&member_key.into())?;
193-
Some(member_type.clone())
191+
fn infer_object_member(
192+
db: &DbIndex,
193+
config: &mut LuaInferConfig,
194+
object_type: &LuaObjectType,
195+
member_key: &LuaIndexKey,
196+
) -> InferResult {
197+
if let Some(member_type) = object_type.get_field(&member_key.into()) {
198+
return Some(member_type.clone());
199+
}
200+
201+
let index_accesses = object_type.get_index_access();
202+
for (key, value) in index_accesses {
203+
if key.is_string() {
204+
if member_key.is_string() || member_key.is_name() {
205+
return Some(value.clone());
206+
} else if member_key.is_expr() {
207+
let expr = member_key.get_expr()?;
208+
let expr_type = infer_expr(db, config, expr.clone())?;
209+
if expr_type.is_string() {
210+
return Some(value.clone());
211+
}
212+
}
213+
} else if key.is_number() {
214+
if member_key.is_integer() {
215+
return Some(value.clone());
216+
} else if member_key.is_expr() {
217+
let expr = member_key.get_expr()?;
218+
let expr_type = infer_expr(db, config, expr.clone())?;
219+
if expr_type.is_number() {
220+
return Some(value.clone());
221+
}
222+
}
223+
} else if let Some(expr) = member_key.get_expr() {
224+
let expr_type = infer_expr(db, config, expr.clone())?;
225+
if expr_type == *key {
226+
return Some(value.clone());
227+
}
228+
}
229+
}
230+
231+
None
194232
}
195233

196234
fn infer_union_member(
197235
db: &DbIndex,
198-
config: &LuaInferConfig,
236+
config: &mut LuaInferConfig,
199237
union_type: &LuaUnionType,
200238
member_key: &LuaIndexKey,
201239
) -> InferResult {
@@ -221,7 +259,7 @@ fn infer_union_member(
221259

222260
fn infer_intersection_member(
223261
db: &DbIndex,
224-
config: &LuaInferConfig,
262+
config: &mut LuaInferConfig,
225263
intersection_type: &LuaIntersectionType,
226264
member_key: &LuaIndexKey,
227265
) -> InferResult {
@@ -241,7 +279,7 @@ fn infer_intersection_member(
241279

242280
fn infer_generic_member(
243281
db: &DbIndex,
244-
config: &LuaInferConfig,
282+
config: &mut LuaInferConfig,
245283
generic_type: &LuaGenericType,
246284
member_key: &LuaIndexKey,
247285
) -> InferResult {
@@ -255,7 +293,7 @@ fn infer_generic_member(
255293

256294
fn infer_exit_field_member(
257295
db: &DbIndex,
258-
config: &LuaInferConfig,
296+
config: &mut LuaInferConfig,
259297
exist_field: &LuaExistFieldType,
260298
member_key: &LuaIndexKey,
261299
) -> InferResult {
@@ -277,7 +315,7 @@ fn infer_exit_field_member(
277315

278316
fn infer_instance_member(
279317
db: &DbIndex,
280-
config: &LuaInferConfig,
318+
config: &mut LuaInferConfig,
281319
inst: &LuaInstanceType,
282320
member_key: &LuaIndexKey,
283321
infer_guard: &mut InferGuard,
@@ -733,9 +771,11 @@ fn infer_namespace_member(
733771

734772
let namespace_or_type_id = format!("{}.{}", ns, member_key);
735773
let type_id = LuaTypeDeclId::new(&namespace_or_type_id);
736-
if db.get_type_index().get_type_decl(&type_id).is_some() {
774+
if db.get_type_index().get_type_decl(&type_id).is_some() {
737775
return Some(LuaType::Def(type_id));
738776
}
739777

740-
return Some(LuaType::Namespace(SmolStr::new(namespace_or_type_id).into()));
741-
}
778+
return Some(LuaType::Namespace(
779+
SmolStr::new(namespace_or_type_id).into(),
780+
));
781+
}

crates/emmylua_ls/src/handlers/code_actions/build_actions.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,15 @@ pub fn build_actions(
2323

2424
if let Some(code) = diagnostic.code {
2525
if let NumberOrString::String(action_string) = code {
26-
let diagnostic_code = DiagnosticCode::from_str(&action_string).ok()?;
27-
add_fix_code_action(&mut actions, diagnostic_code, file_id, diagnostic.range);
28-
add_disable_code_action(&mut actions, diagnostic_code, file_id, diagnostic.range);
26+
if let Some(diagnostic_code) = DiagnosticCode::from_str(&action_string).ok() {
27+
add_fix_code_action(&mut actions, diagnostic_code, file_id, diagnostic.range);
28+
add_disable_code_action(
29+
&mut actions,
30+
diagnostic_code,
31+
file_id,
32+
diagnostic.range,
33+
);
34+
}
2935
}
3036
}
3137
}

resources/std/builtin.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,6 @@
9494
--- values and therefore denote different table entries.)
9595
---@class table
9696

97-
---
98-
--- Any of the above Built-in Types.
9997
---@class any
10098

10199
---@class void
@@ -105,3 +103,5 @@
105103
---@alias int integer
106104

107105
---@class namespace<T: string>
106+
107+
---@class function

0 commit comments

Comments
 (0)