Skip to content

Commit 466b92f

Browse files
committed
feature: 索引访问现在会在 hint 显示别名
1 parent 90b11aa commit 466b92f

6 files changed

Lines changed: 81 additions & 10 deletions

File tree

crates/emmylua_ls/src/handlers/completion/add_completions/add_member_completion.rs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ fn try_add_alias_completion_item(
316316
completion_item: &CompletionItem,
317317
label: &String,
318318
) -> Option<bool> {
319-
let alias_label = extract_index_member_alias(builder, member_info)?;
319+
let alias_label = extract_index_member_alias(builder.semantic_model.get_db(), member_info)?;
320320

321321
let mut alias_completion_item = completion_item.clone();
322322
alias_completion_item.label = alias_label;
@@ -337,10 +337,7 @@ fn try_add_alias_completion_item(
337337

338338
/// 从注释中提取索引成员的别名, 只处理整数成员.
339339
/// 格式为`-- [nameX]`.
340-
fn extract_index_member_alias(
341-
builder: &mut CompletionBuilder,
342-
member_info: &LuaMemberInfo,
343-
) -> Option<String> {
340+
pub fn extract_index_member_alias(db: &DbIndex, member_info: &LuaMemberInfo) -> Option<String> {
344341
let LuaMemberKey::Integer(_) = member_info.key else {
345342
return None;
346343
};
@@ -350,9 +347,7 @@ fn extract_index_member_alias(
350347
return None;
351348
};
352349

353-
let description = builder
354-
.semantic_model
355-
.get_db()
350+
let description = db
356351
.get_property_index()
357352
.get_property(property_owner_id)?
358353
.description

crates/emmylua_ls/src/handlers/completion/add_completions/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ mod add_member_completion;
33
mod check_match_word;
44

55
pub use add_decl_completion::add_decl_completion;
6+
pub use add_member_completion::extract_index_member_alias;
67
pub use add_member_completion::{add_member_completion, CompletionTriggerStatus};
78
pub use check_match_word::check_match_word;
89
use emmylua_code_analysis::{LuaSemanticDeclId, LuaType, RenderLevel};

crates/emmylua_ls/src/handlers/completion/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use providers::add_completions;
1818
use resolve_completion::resolve_completion;
1919
use rowan::TokenAtOffset;
2020
use tokio_util::sync::CancellationToken;
21+
pub use add_completions::extract_index_member_alias;
2122

2223
use crate::context::{ClientId, ServerContextSnapshot};
2324

crates/emmylua_ls/src/handlers/inlay_hint/build_inlay_hint.rs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use rowan::NodeOrToken;
1515

1616
use rowan::TokenAtOffset;
1717

18+
use crate::handlers::completion::extract_index_member_alias;
1819
use crate::handlers::definition::compare_function_types;
1920
use crate::handlers::inlay_hint::build_function_hint::{build_closure_hint, build_label_parts};
2021

@@ -37,6 +38,9 @@ pub fn build_inlay_hints(semantic_model: &SemanticModel) -> Option<Vec<InlayHint
3738
LuaAst::LuaFuncStat(func_stat) => {
3839
build_func_stat_override_hint(semantic_model, &mut result, func_stat);
3940
}
41+
LuaAst::LuaIndexExpr(index_expr) => {
42+
build_index_expr_hint(semantic_model, &mut result, index_expr);
43+
}
4044
_ => {}
4145
}
4246
}
@@ -612,3 +616,57 @@ fn find_match_meta_call_operator_id(
612616
}
613617
operator_ids.first().cloned().map(|id| (id, call_func))
614618
}
619+
620+
fn build_index_expr_hint(
621+
semantic_model: &SemanticModel,
622+
result: &mut Vec<InlayHint>,
623+
index_expr: LuaIndexExpr,
624+
) -> Option<()> {
625+
if !semantic_model.get_emmyrc().hint.index_hint {
626+
return Some(());
627+
}
628+
629+
// 只处理整数索引
630+
let index_key = index_expr.get_index_key()?;
631+
632+
// 获取前缀表达式的类型信息
633+
let prefix_expr = index_expr.get_prefix_expr()?;
634+
let prefix_type = semantic_model.infer_expr(prefix_expr.into()).ok()?;
635+
let member_key = semantic_model.get_member_key(&index_key)?;
636+
let member_infos = semantic_model.get_member_infos(&prefix_type)?;
637+
let member_info = member_infos.iter().find(|m| m.key == member_key)?;
638+
// 尝试提取别名
639+
let alias = extract_index_member_alias(semantic_model.get_db(), member_info)?;
640+
// 创建 hint
641+
let document = semantic_model.get_document();
642+
let position = {
643+
let index_token = index_expr.get_index_name_token()?;
644+
let range = index_token.text_range();
645+
let lsp_range = document.to_lsp_range(range)?;
646+
lsp_range.end
647+
};
648+
649+
let label_location = {
650+
let range = index_expr.get_index_key()?.get_range()?;
651+
let lsp_range = document.to_lsp_range(range)?;
652+
Location::new(document.get_uri(), lsp_range)
653+
};
654+
655+
let hint = InlayHint {
656+
kind: Some(InlayHintKind::TYPE),
657+
label: InlayHintLabel::LabelParts(vec![InlayHintLabelPart {
658+
value: format!(">{}", alias),
659+
location: Some(label_location),
660+
..Default::default()
661+
}]),
662+
position,
663+
text_edits: None,
664+
tooltip: None,
665+
padding_left: Some(true),
666+
padding_right: None,
667+
data: None,
668+
};
669+
670+
result.push(hint);
671+
Some(())
672+
}

crates/emmylua_ls/src/handlers/rename/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ fn rename_references(
119119
new_name: String,
120120
) -> Option<WorkspaceEdit> {
121121
let mut result = HashMap::new();
122-
let semantic_decl = match try_get_table_field(token.clone()) {
122+
let semantic_decl = match get_literal_expr_parent(token.clone()) {
123123
Some(node) => semantic_model.find_decl(node.into(), SemanticDeclLevel::NoTrace),
124124
None => semantic_model.find_decl(token.into(), SemanticDeclLevel::NoTrace),
125125
}?;
@@ -168,7 +168,7 @@ fn rename_references(
168168
})
169169
}
170170

171-
fn try_get_table_field(token: LuaSyntaxToken) -> Option<LuaSyntaxNode> {
171+
fn get_literal_expr_parent(token: LuaSyntaxToken) -> Option<LuaSyntaxNode> {
172172
let parent = token.parent()?;
173173
let literal_expr = LuaLiteralExpr::cast(parent)?;
174174
literal_expr.syntax().parent()

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,4 +159,20 @@ mod tests {
159159
Range::new(Position::new(4, 27), Position::new(4, 33))
160160
);
161161
}
162+
163+
#[test]
164+
fn test_index_key_alias_hint() {
165+
let mut ws = ProviderVirtualWorkspace::new();
166+
let result = ws
167+
.check_inlay_hint(
168+
r#"
169+
local export = {
170+
[1] = 1, -- [nameX]
171+
}
172+
print(export[1])
173+
"#,
174+
)
175+
.unwrap();
176+
assert!(result.len() == 1);
177+
}
162178
}

0 commit comments

Comments
 (0)