Skip to content

Commit 0b5ae74

Browse files
committed
completion: optimize class_attr_completion
1 parent 349f49b commit 0b5ae74

File tree

2 files changed

+44
-70
lines changed

2 files changed

+44
-70
lines changed

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

Lines changed: 39 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ use std::collections::HashSet;
22

33
use emmylua_code_analysis::{DiagnosticCode, LuaTypeAttribute};
44
use emmylua_parser::{
5-
LuaAst, LuaAstNode, LuaClosureExpr, LuaComment, LuaDocAttribute, LuaSyntaxKind, LuaSyntaxToken,
6-
LuaTokenKind,
5+
LuaAst, LuaAstNode, LuaClosureExpr, LuaComment, LuaDocAttribute, LuaDocTag, LuaSyntaxKind,
6+
LuaSyntaxToken, LuaTokenKind,
77
};
88
use lsp_types::CompletionItem;
99

@@ -29,8 +29,8 @@ pub fn add_completion(builder: &mut CompletionBuilder) -> Option<()> {
2929
DocCompletionExpected::DiagnosticCode => {
3030
add_tag_diagnostic_code_completion(builder);
3131
}
32-
DocCompletionExpected::ClassAttr => {
33-
add_tag_class_attr_completion(builder);
32+
DocCompletionExpected::ClassAttr(node) => {
33+
add_tag_class_attr_completion(builder, node);
3434
}
3535
DocCompletionExpected::Namespace => {
3636
add_tag_namespace_completion(builder);
@@ -84,7 +84,10 @@ fn get_doc_completion_expected(trigger_token: &LuaSyntaxToken) -> Option<DocComp
8484
LuaSyntaxKind::DocDiagnosticCodeList => {
8585
Some(DocCompletionExpected::DiagnosticCode)
8686
}
87-
LuaSyntaxKind::DocAttribute => Some(DocCompletionExpected::ClassAttr),
87+
LuaSyntaxKind::DocAttribute => {
88+
let attr = LuaDocAttribute::cast(parent.clone().into())?;
89+
Some(DocCompletionExpected::ClassAttr(attr))
90+
}
8891
_ => None,
8992
}
9093
}
@@ -102,28 +105,34 @@ fn get_doc_completion_expected(trigger_token: &LuaSyntaxToken) -> Option<DocComp
102105
let parent = trigger_token.parent()?;
103106
match parent.kind().into() {
104107
LuaSyntaxKind::DocDiagnosticCodeList => Some(DocCompletionExpected::DiagnosticCode),
105-
LuaSyntaxKind::DocAttribute => Some(DocCompletionExpected::ClassAttr),
108+
LuaSyntaxKind::DocAttribute => {
109+
let attr = LuaDocAttribute::cast(parent.clone().into())?;
110+
Some(DocCompletionExpected::ClassAttr(attr))
111+
}
106112
_ => None,
107113
}
108114
}
109115
LuaTokenKind::TkLeftParen => {
110116
let parent = trigger_token.parent()?;
111117
match parent.kind().into() {
112-
LuaSyntaxKind::DocAttribute => Some(DocCompletionExpected::ClassAttr),
118+
LuaSyntaxKind::DocAttribute => {
119+
let attr = LuaDocAttribute::cast(parent.clone().into())?;
120+
Some(DocCompletionExpected::ClassAttr(attr))
121+
}
113122
_ => None,
114123
}
115124
}
116125
_ => return None,
117126
}
118127
}
119128

120-
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
129+
#[derive(Debug, Clone, Eq, PartialEq)]
121130
enum DocCompletionExpected {
122131
ParamName,
123132
Cast,
124133
DiagnosticAction,
125134
DiagnosticCode,
126-
ClassAttr,
135+
ClassAttr(LuaDocAttribute),
127136
Namespace,
128137
Using,
129138
Export,
@@ -219,42 +228,30 @@ fn add_tag_diagnostic_code_completion(builder: &mut CompletionBuilder) {
219228
}
220229
}
221230

222-
fn add_tag_class_attr_completion(builder: &mut CompletionBuilder) {
223-
let attributes = [
224-
(LuaTypeAttribute::Partial, "partial"),
225-
(LuaTypeAttribute::Key, "key"),
226-
(LuaTypeAttribute::Constructor, "constructor"),
227-
(LuaTypeAttribute::Exact, "exact"),
228-
(LuaTypeAttribute::Meta, "meta"),
229-
];
231+
fn add_tag_class_attr_completion(
232+
builder: &mut CompletionBuilder,
233+
node: LuaDocAttribute,
234+
) -> Option<()> {
235+
let mut attributes = vec![(LuaTypeAttribute::Partial, "partial")];
230236

231-
// 已存在的属性
232-
let mut existing_attrs = HashSet::new();
233-
match builder.trigger_token.kind().into() {
234-
LuaTokenKind::TkLeftParen | LuaTokenKind::TkComma => {
235-
let parent = builder.trigger_token.parent().unwrap();
236-
let attr = LuaDocAttribute::cast(parent).unwrap();
237-
for token in attr.get_attrib_tokens() {
238-
let name_text = token.get_name_text().to_string();
239-
existing_attrs.insert(name_text);
240-
}
237+
match LuaDocTag::cast(node.syntax().parent()?)? {
238+
LuaDocTag::Alias(_) => {}
239+
LuaDocTag::Class(_) => {
240+
attributes.push((LuaTypeAttribute::Exact, "exact"));
241+
attributes.push((LuaTypeAttribute::Constructor, "constructor"));
241242
}
242-
LuaTokenKind::TkWhitespace => {
243-
let left_token = builder.trigger_token.prev_token().unwrap();
244-
match left_token.kind().into() {
245-
LuaTokenKind::TkComma => {
246-
let parent = left_token.parent().unwrap();
247-
let attr = LuaDocAttribute::cast(parent).unwrap();
248-
for token in attr.get_attrib_tokens() {
249-
let name_text = token.get_name_text().to_string();
250-
existing_attrs.insert(name_text);
251-
}
252-
}
253-
_ => {}
254-
}
243+
LuaDocTag::Enum(_) => {
244+
attributes.insert(0, (LuaTypeAttribute::Key, "key"));
245+
attributes.push((LuaTypeAttribute::Exact, "exact"));
255246
}
256247
_ => {}
257248
}
249+
// 已存在的属性
250+
let mut existing_attrs = HashSet::new();
251+
for token in node.get_attrib_tokens() {
252+
let name_text = token.get_name_text().to_string();
253+
existing_attrs.insert(name_text);
254+
}
258255

259256
for (_, name) in attributes.iter() {
260257
if existing_attrs.contains(*name) {
@@ -267,6 +264,8 @@ fn add_tag_class_attr_completion(builder: &mut CompletionBuilder) {
267264
};
268265
builder.add_completion_item(completion_item);
269266
}
267+
268+
Some(())
270269
}
271270

272271
fn add_tag_namespace_completion(builder: &mut CompletionBuilder) {

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

Lines changed: 5 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -469,23 +469,13 @@ mod tests {
469469
kind: CompletionItemKind::ENUM_MEMBER,
470470
..Default::default()
471471
},
472-
VirtualCompletionItem {
473-
label: "key".to_string(),
474-
kind: CompletionItemKind::ENUM_MEMBER,
475-
..Default::default()
476-
},
477-
VirtualCompletionItem {
478-
label: "constructor".to_string(),
479-
kind: CompletionItemKind::ENUM_MEMBER,
480-
..Default::default()
481-
},
482472
VirtualCompletionItem {
483473
label: "exact".to_string(),
484474
kind: CompletionItemKind::ENUM_MEMBER,
485475
..Default::default()
486476
},
487477
VirtualCompletionItem {
488-
label: "meta".to_string(),
478+
label: "constructor".to_string(),
489479
kind: CompletionItemKind::ENUM_MEMBER,
490480
..Default::default()
491481
},
@@ -499,23 +489,13 @@ mod tests {
499489
---@field a string
500490
"#,
501491
vec![
502-
VirtualCompletionItem {
503-
label: "key".to_string(),
504-
kind: CompletionItemKind::ENUM_MEMBER,
505-
..Default::default()
506-
},
507-
VirtualCompletionItem {
508-
label: "constructor".to_string(),
509-
kind: CompletionItemKind::ENUM_MEMBER,
510-
..Default::default()
511-
},
512492
VirtualCompletionItem {
513493
label: "exact".to_string(),
514494
kind: CompletionItemKind::ENUM_MEMBER,
515495
..Default::default()
516496
},
517497
VirtualCompletionItem {
518-
label: "meta".to_string(),
498+
label: "constructor".to_string(),
519499
kind: CompletionItemKind::ENUM_MEMBER,
520500
..Default::default()
521501
},
@@ -525,8 +505,8 @@ mod tests {
525505

526506
assert!(ws.check_completion_with_kind(
527507
r#"
528-
---@class (partial, <??>) C
529-
---@field a string
508+
---@enum (<??>) C
509+
530510
"#,
531511
vec![
532512
VirtualCompletionItem {
@@ -535,7 +515,7 @@ mod tests {
535515
..Default::default()
536516
},
537517
VirtualCompletionItem {
538-
label: "constructor".to_string(),
518+
label: "partial".to_string(),
539519
kind: CompletionItemKind::ENUM_MEMBER,
540520
..Default::default()
541521
},
@@ -544,11 +524,6 @@ mod tests {
544524
kind: CompletionItemKind::ENUM_MEMBER,
545525
..Default::default()
546526
},
547-
VirtualCompletionItem {
548-
label: "meta".to_string(),
549-
kind: CompletionItemKind::ENUM_MEMBER,
550-
..Default::default()
551-
},
552527
],
553528
CompletionTriggerKind::TRIGGER_CHARACTER,
554529
));

0 commit comments

Comments
 (0)