Skip to content

Commit e796804

Browse files
committed
update auto require
1 parent cd0be72 commit e796804

File tree

2 files changed

+53
-10
lines changed

2 files changed

+53
-10
lines changed

crates/emmylua_ls/src/handlers/command/commands/emmy_auto_require.rs

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -129,22 +129,22 @@ fn is_require_stat(stat: LuaStat, require_like_func: &[String]) -> Option<bool>
129129
LuaStat::LocalStat(local_stat) => {
130130
let exprs = local_stat.get_value_exprs();
131131
for expr in exprs {
132-
if is_require_expr(expr, require_like_func).unwrap_or(false) {
132+
if is_require_expr(expr, require_like_func, 0).unwrap_or(false) {
133133
return Some(true);
134134
}
135135
}
136136
}
137137
LuaStat::AssignStat(assign_stat) => {
138138
let (_, exprs) = assign_stat.get_var_and_expr_list();
139139
for expr in exprs {
140-
if is_require_expr(expr, require_like_func).unwrap_or(false) {
140+
if is_require_expr(expr, require_like_func, 0).unwrap_or(false) {
141141
return Some(true);
142142
}
143143
}
144144
}
145145
LuaStat::CallExprStat(call_expr_stat) => {
146146
let expr = call_expr_stat.get_call_expr()?;
147-
if is_require_expr(expr.into(), require_like_func).unwrap_or(false) {
147+
if is_require_expr(expr.into(), require_like_func, 0).unwrap_or(false) {
148148
return Some(true);
149149
}
150150
}
@@ -154,15 +154,38 @@ fn is_require_stat(stat: LuaStat, require_like_func: &[String]) -> Option<bool>
154154
Some(false)
155155
}
156156

157-
fn is_require_expr(expr: LuaExpr, require_like_func: &[String]) -> Option<bool> {
158-
if let LuaExpr::CallExpr(call_expr) = expr {
159-
let name = call_expr.get_prefix_expr()?;
160-
if let LuaExpr::NameExpr(name_expr) = name {
161-
let name = name_expr.get_name_text()?;
162-
if require_like_func.contains(&name.to_string()) || name == "require" {
157+
fn is_require_expr(expr: LuaExpr, require_like_func: &[String], depth: usize) -> Option<bool> {
158+
if depth > 5 {
159+
return Some(false);
160+
}
161+
match expr {
162+
LuaExpr::CallExpr(call_expr) => {
163+
let name = call_expr.get_prefix_expr()?;
164+
match name {
165+
LuaExpr::NameExpr(name_expr) => {
166+
let name = name_expr.get_name_text()?;
167+
if require_like_func.contains(&name.to_string()) || name == "require" {
168+
return Some(true);
169+
}
170+
}
171+
LuaExpr::CallExpr(prefix_call_expr) => {
172+
if is_require_expr(prefix_call_expr.into(), require_like_func, depth + 1)
173+
.unwrap_or(false)
174+
{
175+
return Some(true);
176+
}
177+
}
178+
_ => {}
179+
}
180+
}
181+
LuaExpr::IndexExpr(index_expr) => {
182+
if is_require_expr(index_expr.get_prefix_expr()?, require_like_func, depth + 1)
183+
.unwrap_or(false)
184+
{
163185
return Some(true);
164186
}
165187
}
188+
_ => {}
166189
}
167190

168191
Some(false)

crates/emmylua_ls/src/handlers/completion/providers/auto_require_provider.rs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use emmylua_code_analysis::{
2-
EmmyrcFilenameConvention, LuaType, ModuleInfo, check_export_visibility,
2+
EmmyrcFilenameConvention, LuaSemanticDeclId, LuaType, ModuleInfo, check_export_visibility,
33
};
44
use emmylua_parser::{LuaAstNode, LuaNameExpr};
55
use lsp_types::{CompletionItem, Position};
@@ -144,6 +144,26 @@ fn try_add_member_completion_items(
144144
match member_info.typ {
145145
LuaType::Def(_) => {}
146146
LuaType::Signature(_) => {}
147+
LuaType::DocFunction(_) => {}
148+
LuaType::Ref(_) => {
149+
let Some(LuaSemanticDeclId::Member(member_id)) =
150+
member_info.property_owner_id.as_ref()
151+
else {
152+
continue;
153+
};
154+
let Some(property) = builder
155+
.semantic_model
156+
.get_db()
157+
.get_property_index()
158+
.get_property(&LuaSemanticDeclId::Member(member_id.clone()))
159+
else {
160+
continue;
161+
};
162+
// 允许标记有 export 标记的引用成员被自动导入捕获
163+
if property.export().is_none() {
164+
continue;
165+
}
166+
}
147167
_ => {
148168
continue;
149169
}

0 commit comments

Comments
 (0)