Skip to content

Commit 1b09a4a

Browse files
committed
优化 unresolve 推断, 第一轮 resolve_all_reason 时不处理 UnResolveMemberType
fix #535
1 parent e423d30 commit 1b09a4a

File tree

3 files changed

+54
-9
lines changed

3 files changed

+54
-9
lines changed

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,12 @@ pub fn check_reach_reason(
2121
| InferFailReason::RecursiveInfer => Some(true),
2222
InferFailReason::UnResolveDeclType(decl_id) => {
2323
let decl = db.get_decl_index().get_decl(decl_id)?;
24-
if decl.is_param() {
24+
let typ = db.get_type_index().get_type_cache(&decl_id.clone().into());
25+
if typ.is_none() && decl.is_param() {
2526
return Some(infer_param(db, decl).is_ok());
2627
}
2728

28-
Some(
29-
db.get_type_index()
30-
.get_type_cache(&decl_id.clone().into())
31-
.is_some(),
32-
)
29+
Some(typ.is_some())
3330
}
3431
InferFailReason::UnResolveMemberType(member_id) => {
3532
let member = db.get_member_index().get_member(member_id)?;
@@ -52,13 +49,14 @@ pub fn check_reach_reason(
5249
pub fn resolve_all_reason(
5350
db: &mut DbIndex,
5451
reason_unresolves: &mut HashMap<InferFailReason, Vec<UnResolve>>,
52+
loop_count: usize,
5553
) {
5654
for (reason, _) in reason_unresolves.iter_mut() {
57-
resolve_as_any(db, reason);
55+
resolve_as_any(db, reason, loop_count);
5856
}
5957
}
6058

61-
pub fn resolve_as_any(db: &mut DbIndex, reason: &InferFailReason) -> Option<()> {
59+
pub fn resolve_as_any(db: &mut DbIndex, reason: &InferFailReason, loop_count: usize) -> Option<()> {
6260
match reason {
6361
InferFailReason::None
6462
| InferFailReason::FieldNotFound
@@ -72,6 +70,10 @@ pub fn resolve_as_any(db: &mut DbIndex, reason: &InferFailReason) -> Option<()>
7270
);
7371
}
7472
InferFailReason::UnResolveMemberType(member_id) => {
73+
// 第一次循环不处理, 或许需要判断`unresolves`是否全为取值再跳过?
74+
if loop_count == 0 {
75+
return Some(());
76+
}
7577
let member = db.get_member_index().get_member(member_id)?;
7678
let key = member.get_key();
7779
let owner = db.get_member_index().get_current_owner(&member_id)?;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ pub fn analyze(db: &mut DbIndex, context: &mut AnalyzeContext) {
5050
infer_manager.set_force();
5151
}
5252

53-
resolve_all_reason(db, &mut reason_resolve);
53+
resolve_all_reason(db, &mut reason_resolve, loop_count);
5454

5555
if loop_count >= 5 {
5656
break;

crates/emmylua_ls/src/handlers/test/hover_test.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,4 +137,47 @@ mod tests {
137137
},
138138
));
139139
}
140+
141+
#[test]
142+
fn test_issue_535() {
143+
let mut ws = ProviderVirtualWorkspace::new();
144+
assert!(ws.check_hover(
145+
r#"
146+
---@type table<string, number>
147+
local t
148+
149+
---@class T1
150+
local a
151+
152+
function a:init(p)
153+
self._c<??>fg = t[p]
154+
end
155+
"#,
156+
VirtualHoverResult {
157+
value: "\n```lua\n(field) _cfg: number\n```\n".to_string(),
158+
},
159+
));
160+
161+
assert!(ws.check_hover(
162+
r#"
163+
---@type table<string, number>
164+
local t = {
165+
}
166+
---@class T2
167+
local a = {}
168+
169+
function a:init(p)
170+
self._cfg = t[p]
171+
end
172+
173+
---@param p T2
174+
function fun(p)
175+
local x = p._c<??>fg
176+
end
177+
"#,
178+
VirtualHoverResult {
179+
value: "\n```lua\n(field) _cfg: number\n```\n".to_string(),
180+
},
181+
));
182+
}
140183
}

0 commit comments

Comments
 (0)