Skip to content

Commit c9cec15

Browse files
committed
completion: adjust CompletionData
1 parent 86eb131 commit c9cec15

8 files changed

Lines changed: 82 additions & 74 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ pub fn add_decl_completion(
2020
let mut completion_item = CompletionItem {
2121
label: name.to_string(),
2222
kind: Some(get_completion_kind(&typ)),
23-
data: CompletionData::from_property_owner_id(decl_id.into()),
23+
data: CompletionData::from_property_owner_id(builder, decl_id.into()),
2424
label_details: Some(lsp_types::CompletionItemLabelDetails {
2525
detail: get_detail(builder, &typ, CallDisplay::None),
2626
description: get_description(builder, &typ),

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,9 @@ pub fn add_member_completion(
6262

6363
let completion_data = if let Some(id) = &property_owner {
6464
if let Some(index) = member_info.overload_index {
65-
CompletionData::from_overload(id.clone().into(), index)
65+
CompletionData::from_overload(builder, id.clone().into(), index)
6666
} else {
67-
CompletionData::from_property_owner_id(id.clone().into())
67+
CompletionData::from_property_owner_id(builder, id.clone().into())
6868
}
6969
} else {
7070
None
@@ -139,7 +139,7 @@ fn add_signature_overloads(
139139
let description = get_description(builder, &typ);
140140
let detail = get_detail(builder, &typ, display);
141141
let data = if let Some(id) = &property_owner {
142-
CompletionData::from_overload(id.clone().into(), index)
142+
CompletionData::from_overload(builder, id.clone().into(), index)
143143
} else {
144144
None
145145
};

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

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ mod check_match_word;
55
pub use add_decl_completion::add_decl_completion;
66
pub use add_member_completion::{add_member_completion, CompletionTriggerStatus};
77
pub use check_match_word::check_match_word;
8-
use emmylua_code_analysis::{LuaSemanticDeclId, LuaType, RenderLevel};
8+
use emmylua_code_analysis::{FileId, LuaSemanticDeclId, LuaType, RenderLevel};
99
use lsp_types::CompletionItemKind;
1010
use serde::{Deserialize, Serialize};
1111
use serde_json::Value;
@@ -178,26 +178,48 @@ fn get_description(builder: &CompletionBuilder, typ: &LuaType) -> Option<String>
178178
}
179179

180180
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
181-
pub enum CompletionData {
181+
pub enum CompletionDataType {
182182
PropertyOwnerId(LuaSemanticDeclId),
183183
Module(String),
184184
Overload((LuaSemanticDeclId, usize)),
185185
}
186186

187+
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
188+
pub struct CompletionData {
189+
pub field_id: FileId,
190+
pub typ: CompletionDataType,
191+
}
192+
187193
#[allow(unused)]
188194
impl CompletionData {
189-
pub fn from_property_owner_id(id: LuaSemanticDeclId) -> Option<Value> {
190-
let data = Self::PropertyOwnerId(id);
195+
pub fn from_property_owner_id(
196+
builder: &CompletionBuilder,
197+
id: LuaSemanticDeclId,
198+
) -> Option<Value> {
199+
let data = Self {
200+
field_id: builder.semantic_model.get_file_id(),
201+
typ: CompletionDataType::PropertyOwnerId(id),
202+
};
191203
Some(serde_json::to_value(data).unwrap())
192204
}
193205

194-
pub fn from_overload(id: LuaSemanticDeclId, index: usize) -> Option<Value> {
195-
let data = Self::Overload((id, index));
206+
pub fn from_overload(
207+
builder: &CompletionBuilder,
208+
id: LuaSemanticDeclId,
209+
index: usize,
210+
) -> Option<Value> {
211+
let data = Self {
212+
field_id: builder.semantic_model.get_file_id(),
213+
typ: CompletionDataType::Overload((id, index)),
214+
};
196215
Some(serde_json::to_value(data).unwrap())
197216
}
198217

199-
pub fn from_module(module: String) -> Option<Value> {
200-
let data = Self::Module(module);
218+
pub fn from_module(builder: &CompletionBuilder, module: String) -> Option<Value> {
219+
let data = Self {
220+
field_id: builder.semantic_model.get_file_id(),
221+
typ: CompletionDataType::Module(module),
222+
};
201223
Some(serde_json::to_value(data).unwrap())
202224
}
203225
}

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

Lines changed: 12 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ mod test;
77

88
use add_completions::CompletionData;
99
use completion_builder::CompletionBuilder;
10-
use emmylua_code_analysis::{EmmyLuaAnalysis, FileId, LuaSemanticDeclId};
10+
use emmylua_code_analysis::{EmmyLuaAnalysis, FileId};
1111
use emmylua_parser::LuaAstNode;
1212
use log::error;
1313
use lsp_types::{
@@ -102,36 +102,18 @@ pub async fn on_completion_resolve_handler(
102102
return completion_item;
103103
}
104104
};
105-
let mut semantic_model = None;
106-
match &completion_data {
107-
CompletionData::PropertyOwnerId(property_id)
108-
| CompletionData::Overload((property_id, _)) => {
109-
let semantic_model_opt = match property_id {
110-
LuaSemanticDeclId::LuaDecl(decl_id) => db
111-
.get_decl_index()
112-
.get_decl(&decl_id)
113-
.map(|decl| decl.get_file_id()),
114-
LuaSemanticDeclId::Member(member_id) => db
115-
.get_member_index()
116-
.get_member(&member_id)
117-
.map(|member| member.get_file_id()),
118-
_ => None,
119-
};
120-
121-
if let Some(file_id) = semantic_model_opt {
122-
semantic_model = analysis.compilation.get_semantic_model(file_id);
123-
}
124-
}
125-
_ => {}
105+
let semantic_model = analysis
106+
.compilation
107+
.get_semantic_model(completion_data.field_id);
108+
if let Some(semantic_model) = semantic_model {
109+
resolve_completion(
110+
&semantic_model,
111+
db,
112+
&mut completion_item,
113+
completion_data,
114+
client_id,
115+
);
126116
}
127-
128-
resolve_completion(
129-
semantic_model.as_ref(),
130-
db,
131-
&mut completion_item,
132-
completion_data,
133-
client_id,
134-
);
135117
}
136118

137119
completion_item

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ fn add_table_field_completion(
8585
}
8686

8787
let data = if let Some(id) = &property_owner {
88-
CompletionData::from_property_owner_id(id.clone().into())
88+
CompletionData::from_property_owner_id(builder, id.clone().into())
8989
} else {
9090
None
9191
};

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

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,22 @@ use lsp_types::{CompletionItem, Documentation, MarkedString, MarkupContent};
33

44
use crate::{
55
context::ClientId,
6-
handlers::hover::{build_hover_content, HoverBuilder},
6+
handlers::hover::{build_hover_content_for_completion, HoverBuilder},
77
};
88

9-
use super::add_completions::CompletionData;
9+
use super::add_completions::{CompletionData, CompletionDataType};
1010

1111
pub fn resolve_completion(
12-
semantic_model: Option<&SemanticModel>,
12+
semantic_model: &SemanticModel,
1313
db: &DbIndex,
1414
completion_item: &mut CompletionItem,
1515
completion_data: CompletionData,
1616
client_id: ClientId,
1717
) -> Option<()> {
1818
// todo: resolve completion
19-
match completion_data {
20-
CompletionData::PropertyOwnerId(property_id) => {
21-
let hover_builder =
22-
build_hover_content(semantic_model, db, None, property_id, true, None);
19+
match completion_data.typ {
20+
CompletionDataType::PropertyOwnerId(property_id) => {
21+
let hover_builder = build_hover_content_for_completion(semantic_model, db, property_id);
2322
if let Some(hover_builder) = hover_builder {
2423
if client_id.is_vscode() {
2524
build_vscode_completion_item(completion_item, hover_builder, None);
@@ -28,9 +27,8 @@ pub fn resolve_completion(
2827
}
2928
}
3029
}
31-
CompletionData::Overload((property_id, index)) => {
32-
let hover_builder =
33-
build_hover_content(semantic_model, db, None, property_id, true, None);
30+
CompletionDataType::Overload((property_id, index)) => {
31+
let hover_builder = build_hover_content_for_completion(semantic_model, db, property_id);
3432
if let Some(hover_builder) = hover_builder {
3533
if client_id.is_vscode() {
3634
build_vscode_completion_item(completion_item, hover_builder, Some(index));

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

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ pub fn build_semantic_info_hover(
2727
return build_hover_without_property(db, document, token, typ);
2828
}
2929
let hover_builder = build_hover_content(
30-
Some(semantic_model),
30+
semantic_model,
3131
db,
3232
Some(typ),
3333
semantic_info.semantic_decl.unwrap(),
@@ -57,36 +57,42 @@ fn build_hover_without_property(
5757
})
5858
}
5959

60-
pub fn build_hover_content<'a>(
61-
semantic_model: Option<&'a SemanticModel>,
60+
pub fn build_hover_content_for_completion<'a>(
61+
semantic_model: &'a SemanticModel,
62+
db: &DbIndex,
63+
property_id: LuaSemanticDeclId,
64+
) -> Option<HoverBuilder<'a>> {
65+
let typ = match property_id {
66+
LuaSemanticDeclId::LuaDecl(decl_id) => {
67+
let decl = db.get_decl_index().get_decl(&decl_id)?;
68+
Some(decl.get_type()?.clone())
69+
}
70+
LuaSemanticDeclId::Member(member_id) => {
71+
let member = db.get_member_index().get_member(&member_id)?;
72+
Some(member.get_decl_type())
73+
}
74+
_ => None,
75+
};
76+
build_hover_content(semantic_model, db, typ, property_id, true, None)
77+
}
78+
79+
fn build_hover_content<'a>(
80+
semantic_model: &'a SemanticModel,
6281
db: &DbIndex,
6382
typ: Option<LuaType>,
6483
property_id: LuaSemanticDeclId,
6584
is_completion: bool,
6685
token: Option<LuaSyntaxToken>,
6786
) -> Option<HoverBuilder<'a>> {
68-
let semantic_model = semantic_model?;
6987
let mut builder = HoverBuilder::new(semantic_model, token, is_completion);
7088
match property_id {
7189
LuaSemanticDeclId::LuaDecl(decl_id) => {
72-
let effective_typ = match typ {
73-
Some(t) => t,
74-
None => {
75-
let decl = db.get_decl_index().get_decl(&decl_id)?;
76-
decl.get_type()?.clone()
77-
}
78-
};
79-
build_decl_hover(&mut builder, db, effective_typ, decl_id);
90+
let typ = typ?;
91+
build_decl_hover(&mut builder, db, typ, decl_id);
8092
}
8193
LuaSemanticDeclId::Member(member_id) => {
82-
let effective_typ = match typ {
83-
Some(t) => t,
84-
None => {
85-
let member = db.get_member_index().get_member(&member_id)?;
86-
member.get_decl_type().clone()
87-
}
88-
};
89-
build_member_hover(&mut builder, db, effective_typ, member_id);
94+
let typ = typ?;
95+
build_member_hover(&mut builder, db, typ, member_id);
9096
}
9197
LuaSemanticDeclId::TypeDecl(type_decl_id) => {
9298
build_type_decl_hover(&mut builder, db, type_decl_id);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ mod hover_humanize;
44
mod keyword_hover;
55
mod std_hover;
66

7-
pub use build_hover::build_hover_content;
7+
pub use build_hover::build_hover_content_for_completion;
88
use build_hover::build_semantic_info_hover;
99
use emmylua_parser::LuaAstNode;
1010
pub use hover_builder::HoverBuilder;

0 commit comments

Comments
 (0)