Skip to content

Commit 5e33ab6

Browse files
committed
completion: optimize
1 parent 2340636 commit 5e33ab6

File tree

3 files changed

+36
-33
lines changed

3 files changed

+36
-33
lines changed

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

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use std::collections::HashSet;
22

33
use emmylua_code_analysis::{LuaFlowId, LuaType};
4-
use emmylua_parser::{LuaAst, LuaAstNode};
4+
use emmylua_parser::{LuaAst, LuaAstNode, LuaCallArgList};
5+
use lsp_types::CompletionTriggerKind;
56

67
use crate::handlers::completion::{
78
add_completions::{add_decl_completion, check_match_word},
@@ -12,6 +13,11 @@ pub fn add_completion(builder: &mut CompletionBuilder) -> Option<()> {
1213
if builder.is_cancelled() {
1314
return None;
1415
}
16+
17+
if allow_add_env_completion(builder).is_none() {
18+
return Some(());
19+
}
20+
1521
let node = LuaAst::cast(builder.trigger_token.parent()?)?;
1622
match node {
1723
LuaAst::LuaNameExpr(_) => {}
@@ -33,6 +39,24 @@ pub fn add_completion(builder: &mut CompletionBuilder) -> Option<()> {
3339
Some(())
3440
}
3541

42+
fn allow_add_env_completion(builder: &CompletionBuilder) -> Option<()> {
43+
if builder.trigger_kind == CompletionTriggerKind::TRIGGER_CHARACTER {
44+
let trigger_text = builder.get_trigger_text();
45+
// 由字符触发的空格补全不允许添加
46+
if trigger_text.is_empty() {
47+
return None;
48+
}
49+
// 如果触发字符是`(`且位于`CallArgList`中, 那么不允许添加
50+
if trigger_text == "("
51+
&& LuaCallArgList::can_cast(builder.trigger_token.parent()?.kind().into())
52+
{
53+
return None;
54+
}
55+
}
56+
57+
Some(())
58+
}
59+
3660
fn add_local_env(
3761
builder: &mut CompletionBuilder,
3862
duplicated_name: &mut HashSet<String>,

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

Lines changed: 5 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -11,35 +11,25 @@ mod postfix_provider;
1111
mod table_field_provider;
1212
mod type_special_provider;
1313

14-
use emmylua_parser::{LuaAst, LuaAstNode, LuaAstToken, LuaStringToken};
15-
use lsp_types::CompletionTriggerKind;
14+
use emmylua_parser::LuaAstToken;
15+
use emmylua_parser::LuaStringToken;
1616
use rowan::TextRange;
1717

1818
use super::completion_builder::CompletionBuilder;
1919

2020
pub fn add_completions(builder: &mut CompletionBuilder) -> Option<()> {
21-
// 空格补全只允许位于函数调用参数列表时非主动触发
22-
if is_space_completion(builder).is_some() {
23-
match LuaAst::cast(builder.trigger_token.parent()?)? {
24-
LuaAst::LuaCallArgList(_) => {
25-
type_special_provider::add_completion(builder);
26-
return Some(());
27-
}
28-
_ => return Some(()),
29-
}
30-
}
31-
3221
postfix_provider::add_completion(builder);
22+
// `type_special_provider`优先级必须高于`env_provider`
3323
type_special_provider::add_completion(builder);
34-
// `env_provider` 在某些情况下是不需要的, 但有些补全功能依赖于他, 因在一些补全中可能会移除掉`env_provider` 的补全.
24+
// `env_provider`在某些情况下是不需要的, 但有些补全功能依赖于他, 因此我们先添加`env_provider`的补全, 再在某些补全中移除掉他的补全.
3525
// 目前可能移除掉他的补全为: `table_field_provider`
3626
env_provider::add_completion(builder);
3727
// 只有具有类型定义的表才会成功返回, 此时我们不需要处理其他补全
3828
if table_field_provider::add_completion(builder).is_some() {
3929
return Some(());
4030
}
41-
member_provider::add_completion(builder);
4231
keywords_provider::add_completion(builder);
32+
member_provider::add_completion(builder);
4333

4434
module_path_provider::add_completion(builder);
4535
file_path_provider::add_completion(builder);
@@ -53,21 +43,10 @@ pub fn add_completions(builder: &mut CompletionBuilder) -> Option<()> {
5343
item.sort_text = Some(format!("{:04}", index + 1));
5444
}
5545
}
56-
// dbg!(&builder.get_completion_items_mut());
5746

5847
Some(())
5948
}
6049

61-
fn is_space_completion(builder: &CompletionBuilder) -> Option<()> {
62-
if builder.get_trigger_text().is_empty()
63-
&& builder.trigger_kind == CompletionTriggerKind::TRIGGER_CHARACTER
64-
{
65-
Some(())
66-
} else {
67-
None
68-
}
69-
}
70-
7150
fn get_text_edit_range_in_string(
7251
builder: &mut CompletionBuilder,
7352
string_token: LuaStringToken,

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ use emmylua_code_analysis::{
33
LuaPropertyOwnerId, LuaType, LuaTypeDeclId, LuaUnionType, RenderLevel,
44
};
55
use emmylua_parser::{
6-
LuaAst, LuaAstNode, LuaAstToken, LuaCallArgList, LuaCallExpr, LuaComment, LuaExpr,
7-
LuaNameToken, LuaSyntaxId, LuaSyntaxKind, LuaSyntaxToken, LuaTokenKind, LuaVarExpr,
6+
LuaAst, LuaAstNode, LuaAstToken, LuaCallArgList, LuaCallExpr, LuaComment, LuaNameToken,
7+
LuaSyntaxId, LuaSyntaxKind, LuaSyntaxToken, LuaTokenKind, LuaVarExpr,
88
};
99
use itertools::Itertools;
1010
use lsp_types::{CompletionItem, Documentation};
@@ -159,10 +159,10 @@ fn add_string_completion(builder: &mut CompletionBuilder, str: &str) -> Option<(
159159

160160
fn get_token_should_type(builder: &mut CompletionBuilder) -> Option<Vec<LuaType>> {
161161
let token = builder.trigger_token.clone();
162-
let mut parent_node = token.parent()?;
163-
if LuaExpr::can_cast(parent_node.kind().into()) {
164-
parent_node = parent_node.parent()?;
165-
}
162+
let parent_node = token.parent()?;
163+
// if LuaExpr::can_cast(parent_node.kind().into()) {
164+
// parent_node = parent_node.parent()?;
165+
// }
166166

167167
match parent_node.kind().into() {
168168
LuaSyntaxKind::CallArgList => {

0 commit comments

Comments
 (0)