Skip to content

Commit 4b543a8

Browse files
committed
completion: optimize
1 parent ca28e90 commit 4b543a8

File tree

3 files changed

+57
-28
lines changed

3 files changed

+57
-28
lines changed

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::collections::HashSet;
22

33
use emmylua_code_analysis::SemanticModel;
44
use emmylua_parser::LuaSyntaxToken;
5-
use lsp_types::CompletionItem;
5+
use lsp_types::{CompletionItem, CompletionTriggerKind};
66
use tokio_util::sync::CancellationToken;
77

88
pub struct CompletionBuilder<'a> {
@@ -12,8 +12,7 @@ pub struct CompletionBuilder<'a> {
1212
completion_items: Vec<CompletionItem>,
1313
cancel_token: CancellationToken,
1414
stopped: bool,
15-
// 主动触发补全
16-
pub is_invoke_completion: bool,
15+
pub trigger_kind: CompletionTriggerKind,
1716
pub env_start_index: i32,
1817
pub env_end_index: i32,
1918
}
@@ -23,7 +22,7 @@ impl<'a> CompletionBuilder<'a> {
2322
trigger_token: LuaSyntaxToken,
2423
semantic_model: SemanticModel<'a>,
2524
cancel_token: CancellationToken,
26-
is_invoke_completion: bool,
25+
trigger_kind: CompletionTriggerKind,
2726
) -> Self {
2827
Self {
2928
trigger_token,
@@ -32,7 +31,7 @@ impl<'a> CompletionBuilder<'a> {
3231
completion_items: Vec::new(),
3332
cancel_token,
3433
stopped: false,
35-
is_invoke_completion,
34+
trigger_kind,
3635
env_start_index: -1,
3736
env_end_index: -1,
3837
}

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

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@ mod completion_builder;
33
mod data;
44
mod providers;
55
mod resolve_completion;
6+
mod test;
67

78
use add_completions::CompletionData;
89
use completion_builder::CompletionBuilder;
9-
use emmylua_code_analysis::LuaPropertyOwnerId;
10+
use emmylua_code_analysis::{EmmyLuaAnalysis, FileId, LuaPropertyOwnerId};
1011
use emmylua_parser::LuaAstNode;
1112
use log::error;
1213
use lsp_types::{
1314
ClientCapabilities, CompletionItem, CompletionOptions, CompletionOptionsCompletionItem,
14-
CompletionParams, CompletionResponse, CompletionTriggerKind, ServerCapabilities,
15+
CompletionParams, CompletionResponse, CompletionTriggerKind, Position, ServerCapabilities,
1516
};
1617
use providers::add_completions;
1718
use resolve_completion::resolve_completion;
@@ -34,6 +35,31 @@ pub async fn on_completion_handler(
3435
return None;
3536
}
3637

38+
completion(
39+
&analysis,
40+
file_id,
41+
position,
42+
params
43+
.context
44+
.map(|context| context.trigger_kind)
45+
.unwrap_or(CompletionTriggerKind::INVOKED),
46+
cancel_token,
47+
)
48+
}
49+
50+
pub fn completion(
51+
analysis: &EmmyLuaAnalysis,
52+
file_id: FileId,
53+
position: Position,
54+
trigger_kind: CompletionTriggerKind,
55+
cancel_token: CancellationToken,
56+
) -> Option<CompletionResponse> {
57+
dbg!(position);
58+
let semantic_model = analysis.compilation.get_semantic_model(file_id)?;
59+
if !semantic_model.get_emmyrc().completion.enable {
60+
return None;
61+
}
62+
3763
let root = semantic_model.get_root();
3864
let position_offset = {
3965
let document = semantic_model.get_document();
@@ -52,15 +78,7 @@ pub async fn on_completion_handler(
5278
}
5379
};
5480

55-
let mut builder = CompletionBuilder::new(
56-
token,
57-
semantic_model,
58-
cancel_token,
59-
params
60-
.context
61-
.map(|context| context.trigger_kind == CompletionTriggerKind::INVOKED)
62-
.unwrap_or(false),
63-
);
81+
let mut builder = CompletionBuilder::new(token, semantic_model, cancel_token, trigger_kind);
6482
add_completions(&mut builder);
6583
Some(CompletionResponse::Array(builder.get_completion_items()))
6684
}

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

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,29 +12,26 @@ mod table_field_provider;
1212
mod type_special_provider;
1313

1414
use emmylua_parser::{LuaAst, LuaAstNode, LuaAstToken, LuaStringToken};
15+
use lsp_types::CompletionTriggerKind;
1516
use rowan::TextRange;
1617

1718
use super::completion_builder::CompletionBuilder;
1819

1920
pub fn add_completions(builder: &mut CompletionBuilder) -> Option<()> {
20-
// 空格补全只允许在非主动且位于函数调用参数列表中触发
21-
if builder.get_trigger_text().is_empty() && !builder.is_invoke_completion {
22-
let node = LuaAst::cast(builder.trigger_token.parent()?)?;
23-
match node {
24-
LuaAst::LuaCallArgList(_) => {
25-
type_special_provider::add_completion(builder);
26-
return Some(());
27-
}
28-
_ => return Some(()),
29-
}
21+
if is_space_completion_in_call_arg_list(builder).is_some() {
22+
type_special_provider::add_completion(builder);
23+
return Some(());
3024
}
25+
3126
postfix_provider::add_completion(builder);
27+
type_special_provider::add_completion(builder);
28+
// `env_provider` 在某些情况下是不需要的, 但有些补全功能依赖于他, 因在一些补全中可能会移除掉`env_provider` 的补全.
29+
// 目前可能移除掉他的补全为: `table_field_provider`
3230
env_provider::add_completion(builder);
3331
// 只有具有类型定义的表才会成功返回, 此时我们不需要处理其他补全
3432
if table_field_provider::add_completion(builder).is_some() {
3533
return Some(());
3634
}
37-
type_special_provider::add_completion(builder);
3835
member_provider::add_completion(builder);
3936
keywords_provider::add_completion(builder);
4037

@@ -47,14 +44,29 @@ pub fn add_completions(builder: &mut CompletionBuilder) -> Option<()> {
4744

4845
for (index, item) in builder.get_completion_items_mut().iter_mut().enumerate() {
4946
if item.sort_text.is_none() {
50-
item.sort_text = Some(format!("{:04}", index));
47+
item.sort_text = Some(format!("{:04}", index + 1));
5148
}
5249
}
5350
// dbg!(&builder.get_completion_items_mut());
5451

5552
Some(())
5653
}
5754

55+
// 空格补全只允许位于函数调用参数列表时非主动触发
56+
fn is_space_completion_in_call_arg_list(builder: &CompletionBuilder) -> Option<()> {
57+
if builder.get_trigger_text().is_empty()
58+
&& builder.trigger_kind == CompletionTriggerKind::TRIGGER_CHARACTER
59+
{
60+
let node = LuaAst::cast(builder.trigger_token.parent()?)?;
61+
match node {
62+
LuaAst::LuaCallArgList(_) => Some(()),
63+
_ => None,
64+
}
65+
} else {
66+
None
67+
}
68+
}
69+
5870
fn get_text_edit_range_in_string(
5971
builder: &mut CompletionBuilder,
6072
string_token: LuaStringToken,

0 commit comments

Comments
 (0)