Skip to content

Commit 4fd95d0

Browse files
committed
optimize hover desc
1 parent 2984f1f commit 4fd95d0

File tree

3 files changed

+41
-7
lines changed

3 files changed

+41
-7
lines changed

crates/emmylua_ls/src/handlers/hover/build_hover.rs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::collections::HashSet;
2+
13
use emmylua_code_analysis::{
24
DbIndex, LuaDeclId, LuaDocument, LuaMemberId, LuaMemberKey, LuaSemanticDeclId, LuaSignatureId,
35
LuaType, LuaTypeDeclId, RenderLevel, SemanticInfo, SemanticModel,
@@ -174,8 +176,11 @@ fn build_decl_hover(
174176
}
175177

176178
// 添加注释文本
177-
builder.add_description(&LuaSemanticDeclId::LuaDecl(decl_id));
178-
for (semantic_decl, _) in semantic_decls {
179+
let mut semantic_decl_set = HashSet::new();
180+
let decl_decl = LuaSemanticDeclId::LuaDecl(decl_id);
181+
semantic_decl_set.insert(&decl_decl);
182+
semantic_decl_set.extend(semantic_decls.iter().map(|(decl, _)| decl));
183+
for semantic_decl in semantic_decl_set {
179184
builder.add_description(&semantic_decl);
180185
}
181186
}
@@ -239,9 +244,12 @@ fn build_member_hover(
239244
}
240245

241246
// 添加注释文本
242-
builder.add_description(&LuaSemanticDeclId::Member(member.get_id()));
243-
for (semantic_decl, _) in semantic_decls {
244-
builder.add_description(&semantic_decl);
247+
let mut semantic_decl_set = HashSet::new();
248+
let member_decl = LuaSemanticDeclId::Member(member.get_id());
249+
semantic_decl_set.insert(&member_decl);
250+
semantic_decl_set.extend(semantic_decls.iter().map(|(decl, _)| decl));
251+
for semantic_decl in semantic_decl_set {
252+
builder.add_description(semantic_decl);
245253
}
246254
}
247255

crates/emmylua_ls/src/handlers/hover/find_origin.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,17 +250,24 @@ pub fn replace_semantic_type(
250250
match origin_type {
251251
LuaType::Union(union) => {
252252
for typ in union.get_types() {
253-
type_vec.push(typ.clone());
253+
type_vec.push(typ);
254254
}
255255
}
256256
_ => {
257-
type_vec.push(origin_type.clone());
257+
type_vec.push(origin_type);
258258
}
259259
}
260260
if type_vec.len() != semantic_decls.len() {
261261
return;
262262
}
263263

264+
// 判断是否存在泛型, 如果有任意类型不匹配我们就认为存在泛型
265+
for (_, typ) in semantic_decls.iter() {
266+
if !type_vec.iter().any(|t| *t == typ) {
267+
break;
268+
}
269+
}
270+
264271
// 替换`semantic_decls`中的类型
265272
for (i, (_, typ)) in semantic_decls.iter_mut().enumerate() {
266273
if i < type_vec.len() {

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,4 +118,23 @@ mod tests {
118118
},
119119
));
120120
}
121+
122+
#[test]
123+
fn test_decl_desc() {
124+
let mut ws = ProviderVirtualWorkspace::new();
125+
assert!(ws.check_hover(
126+
r#"
127+
---@class Buff.AddData
128+
---@field pulse? number 心跳周期
129+
130+
---@type Buff.AddData
131+
local data
132+
133+
data.pu<??>lse
134+
"#,
135+
VirtualHoverResult {
136+
value: "\n```lua\n(field) pulse: number?\n```\n\n&nbsp;&nbsp;in class `Buff.AddData`\n\n---\n\n心跳周期\n".to_string(),
137+
},
138+
));
139+
}
121140
}

0 commit comments

Comments
 (0)