Skip to content

Commit d5ce2b7

Browse files
committed
support closure param infer
1 parent feb26ac commit d5ce2b7

File tree

12 files changed

+383
-42
lines changed

12 files changed

+383
-42
lines changed

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
use emmylua_parser::{
2-
LuaAstNode, LuaAstToken, LuaClosureExpr, LuaIndexExpr, LuaIndexKey, LuaNameExpr, LuaTableExpr
2+
LuaAstNode, LuaAstToken, LuaClosureExpr, LuaIndexExpr, LuaIndexKey, LuaNameExpr, LuaTableExpr,
33
};
44

55
use crate::{
66
db_index::{LuaDecl, LuaMember, LuaMemberKey, LuaMemberOwner},
7-
InFiled, LuaDeclId,
7+
InFiled, LuaDeclId, LuaSignatureId,
88
};
99

1010
use super::DeclAnalyzer;
@@ -77,6 +77,7 @@ pub fn analyze_index_expr(analyzer: &mut DeclAnalyzer, expr: LuaIndexExpr) -> Op
7777

7878
pub fn analyze_closure_expr(analyzer: &mut DeclAnalyzer, expr: LuaClosureExpr) -> Option<()> {
7979
let params = expr.get_params_list()?;
80+
let signature_id = LuaSignatureId::new(analyzer.get_file_id(), &expr);
8081

8182
for param in params.get_params() {
8283
let name = param.get_name_token().map_or_else(
@@ -89,14 +90,12 @@ pub fn analyze_closure_expr(analyzer: &mut DeclAnalyzer, expr: LuaClosureExpr) -
8990
},
9091
|name_token| name_token.get_name_text().to_string(),
9192
);
92-
93-
let decl = LuaDecl::Local {
93+
94+
let decl = LuaDecl::Param {
9495
name,
9596
file_id: analyzer.get_file_id(),
96-
kind: param.syntax().kind().into(),
9797
range: param.get_range(),
98-
attrib: None,
99-
decl_type: None,
98+
signature_id,
10099
};
101100

102101
analyzer.add_decl(decl);

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

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
use emmylua_parser::{LuaAstNode, LuaClosureExpr, LuaFuncStat, LuaVarExpr};
1+
use emmylua_parser::{
2+
LuaAstNode, LuaCallArgList, LuaCallExpr, LuaClosureExpr, LuaFuncStat, LuaVarExpr,
3+
};
24

35
use crate::{
4-
compilation::analyzer::unresolve::UnResolveReturn,
6+
compilation::analyzer::unresolve::{UnResolveClosureParams, UnResolveReturn},
57
db_index::{LuaDocReturnInfo, LuaSignatureId},
68
};
79

@@ -12,6 +14,7 @@ pub fn analyze_closure(analyzer: &mut LuaAnalyzer, closure: LuaClosureExpr) -> O
1214

1315
analyze_colon_define(analyzer, &signature_id, &closure);
1416
analyze_params(analyzer, &signature_id, &closure);
17+
analyze_lambda_params(analyzer, &signature_id, &closure);
1518
analyze_return(analyzer, &signature_id, &closure);
1619
Some(())
1720
}
@@ -61,6 +64,30 @@ fn analyze_params(
6164
Some(())
6265
}
6366

67+
fn analyze_lambda_params(
68+
analyzer: &mut LuaAnalyzer,
69+
signature_id: &LuaSignatureId,
70+
closure: &LuaClosureExpr,
71+
) -> Option<()> {
72+
let call_arg_list = closure.get_parent::<LuaCallArgList>()?;
73+
let call_expr = call_arg_list.get_parent::<LuaCallExpr>()?;
74+
let pos = closure.get_position();
75+
let founded_idx = call_arg_list
76+
.get_args()
77+
.position(|arg| arg.get_position() == pos)?;
78+
79+
let unresolved = UnResolveClosureParams {
80+
file_id: analyzer.file_id,
81+
signature_id: signature_id.clone(),
82+
call_expr,
83+
param_idx: founded_idx,
84+
};
85+
86+
analyzer.add_unresolved(unresolved.into());
87+
88+
Some(())
89+
}
90+
6491
fn analyze_return(
6592
analyzer: &mut LuaAnalyzer,
6693
signature_id: &LuaSignatureId,

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

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
mod infer_manager;
22
mod merge_type;
33
mod resolve;
4+
mod resolve_closure_param;
45

56
use crate::{
67
db_index::{DbIndex, LuaDeclId, LuaMemberId, LuaSignatureId},
@@ -9,7 +10,11 @@ use crate::{
910
use emmylua_parser::{LuaCallExpr, LuaExpr};
1011
use infer_manager::InferManager;
1112
pub use merge_type::{merge_decl_expr_type, merge_member_type};
12-
use resolve::{try_resolve_decl, try_resolve_iter_var, try_resolve_member, try_resolve_module, try_resolve_return_point};
13+
use resolve::{
14+
try_resolve_decl, try_resolve_iter_var, try_resolve_member,
15+
try_resolve_module, try_resolve_return_point,
16+
};
17+
use resolve_closure_param::try_resolve_closure_params;
1318

1419
use super::{lua::LuaReturnPoint, AnalyzeContext};
1520

@@ -34,33 +39,28 @@ fn try_resolve(
3439
let mut changed = false;
3540
for i in 0..unresolves.len() {
3641
let un_resolve = &mut unresolves[i];
37-
42+
let file_id = un_resolve.get_file_id().unwrap_or(FileId { id: 0 });
43+
let config = infer_manager.get_infer_config(file_id);
3844
let resolve = match un_resolve {
3945
UnResolve::Decl(un_resolve_decl) => {
40-
let config = infer_manager.get_infer_config(un_resolve_decl.file_id);
4146
try_resolve_decl(db, config, un_resolve_decl).unwrap_or(false)
4247
}
4348
UnResolve::Member(ref mut un_resolve_member) => {
44-
let config = infer_manager.get_infer_config(un_resolve_member.file_id);
4549
try_resolve_member(db, config, un_resolve_member).unwrap_or(false)
4650
}
4751
UnResolve::Module(un_resolve_module) => {
48-
let config = infer_manager.get_infer_config(un_resolve_module.file_id);
4952
try_resolve_module(db, config, un_resolve_module).unwrap_or(false)
5053
}
5154
UnResolve::Return(un_resolve_return) => {
52-
let config = infer_manager.get_infer_config(un_resolve_return.file_id);
5355
try_resolve_return_point(db, config, un_resolve_return).unwrap_or(false)
5456
}
55-
// UnResolve::ClosureParams(un_resolve_closure_params) => {
56-
// todo!();
57-
// true
58-
// }
57+
UnResolve::ClosureParams(un_resolve_closure_params) => {
58+
try_resolve_closure_params(db, config, un_resolve_closure_params).unwrap_or(false)
59+
}
5960
UnResolve::IterDecl(un_resolve_iter_var) => {
60-
let config = infer_manager.get_infer_config(un_resolve_iter_var.file_id);
6161
try_resolve_iter_var(db, config, un_resolve_iter_var).unwrap_or(false)
6262
}
63-
UnResolve::ClosureParams(_) | UnResolve::None => continue,
63+
UnResolve::None => continue,
6464
};
6565

6666
if resolve {
@@ -72,7 +72,6 @@ fn try_resolve(
7272
changed
7373
}
7474

75-
#[allow(dead_code)]
7675
#[derive(Debug)]
7776
pub enum UnResolve {
7877
None,
@@ -84,6 +83,27 @@ pub enum UnResolve {
8483
ClosureParams(Box<UnResolveClosureParams>),
8584
}
8685

86+
#[allow(dead_code)]
87+
impl UnResolve {
88+
pub fn is_none(&self) -> bool {
89+
matches!(self, UnResolve::None)
90+
}
91+
92+
pub fn get_file_id(&self) -> Option<FileId> {
93+
match self {
94+
UnResolve::Decl(un_resolve_decl) => Some(un_resolve_decl.file_id),
95+
UnResolve::IterDecl(un_resolve_iter_var) => Some(un_resolve_iter_var.file_id),
96+
UnResolve::Member(un_resolve_member) => Some(un_resolve_member.file_id),
97+
UnResolve::Module(un_resolve_module) => Some(un_resolve_module.file_id),
98+
UnResolve::Return(un_resolve_return) => Some(un_resolve_return.file_id),
99+
UnResolve::ClosureParams(un_resolve_closure_params) => {
100+
Some(un_resolve_closure_params.file_id)
101+
}
102+
UnResolve::None => None,
103+
}
104+
}
105+
}
106+
87107
#[derive(Debug)]
88108
pub struct UnResolveDecl {
89109
pub file_id: FileId,
@@ -138,7 +158,6 @@ impl From<UnResolveReturn> for UnResolve {
138158
}
139159
}
140160

141-
#[allow(unused)]
142161
#[derive(Debug)]
143162
pub struct UnResolveClosureParams {
144163
pub file_id: FileId,

crates/code_analysis/src/compilation/analyzer/unresolve/resolve.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ use crate::{
55
};
66

77
use super::{
8-
merge_decl_expr_type, merge_member_type, UnResolveDecl, UnResolveIterVar, UnResolveMember, UnResolveModule, UnResolveReturn
8+
merge_decl_expr_type, merge_member_type, UnResolveDecl, UnResolveIterVar, UnResolveMember,
9+
UnResolveModule, UnResolveReturn,
910
};
1011

1112
pub fn try_resolve_decl(
@@ -157,8 +158,11 @@ pub fn try_resolve_iter_var(
157158
_ => return Some(true),
158159
};
159160

160-
let iter_type = func.get_ret().get(iter_var.ret_idx).unwrap_or(&LuaType::Nil);
161+
let iter_type = func
162+
.get_ret()
163+
.get(iter_var.ret_idx)
164+
.unwrap_or(&LuaType::Nil);
161165
let decl_id = iter_var.decl_id;
162166
merge_decl_expr_type(db, decl_id, iter_type.clone());
163167
Some(true)
164-
}
168+
}

0 commit comments

Comments
 (0)