Skip to content

Commit d113b9d

Browse files
committed
refactor hover function
1 parent b3b55ee commit d113b9d

File tree

18 files changed

+848
-919
lines changed

18 files changed

+848
-919
lines changed

crates/emmylua_code_analysis/src/compilation/analyzer/lua/for_range_stat.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use emmylua_parser::{LuaAstNode, LuaAstToken, LuaExpr, LuaForRangeStat};
1+
use emmylua_parser::{LuaAstToken, LuaExpr, LuaForRangeStat};
22

33
use crate::{
44
DbIndex, InferFailReason, LuaDeclId, LuaInferCache, LuaOperatorMetaMethod, LuaType,
@@ -79,7 +79,6 @@ pub fn infer_for_range_iter_expr_func(
7979
}
8080

8181
let iter_func_expr = iter_exprs[0].clone();
82-
let root = iter_func_expr.get_root();
8382
let first_expr_type = infer_expr(db, cache, iter_func_expr)?;
8483
let doc_function = match first_expr_type {
8584
LuaType::DocFunction(func) => func,
@@ -150,7 +149,6 @@ pub fn infer_for_range_iter_expr_func(
150149
db,
151150
cache,
152151
substitutor: &mut substitutor,
153-
root,
154152
call_expr: None,
155153
};
156154
let params = doc_function

crates/emmylua_code_analysis/src/db_index/signature/signature.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ pub struct LuaDocParamInfo {
185185
pub description: Option<String>,
186186
}
187187

188-
#[derive(Debug)]
188+
#[derive(Debug, Clone)]
189189
pub struct LuaDocReturnInfo {
190190
pub name: Option<String>,
191191
pub type_ref: LuaType,

crates/emmylua_code_analysis/src/db_index/type/types.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -687,7 +687,10 @@ impl LuaFunctionType {
687687
Some(owner_type) => {
688688
// 一些类型不应该被视为 method
689689
if let (LuaType::Ref(_) | LuaType::Def(_), _) = (owner_type, t)
690-
&& (t.is_any() || t.is_table() || t.is_class_tpl())
690+
&& (t.is_any()
691+
|| t.is_table()
692+
|| t.is_class_tpl()
693+
|| t.is_str_tpl_ref())
691694
{
692695
return false;
693696
}

crates/emmylua_code_analysis/src/semantic/generic/instantiate_type/instantiate_func_generic.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::{collections::HashSet, ops::Deref, sync::Arc};
22

3-
use emmylua_parser::{LuaAstNode, LuaCallExpr, LuaExpr};
3+
use emmylua_parser::{LuaCallExpr, LuaExpr};
44
use internment::ArcIntern;
55

66
use crate::{
@@ -63,7 +63,6 @@ pub fn instantiate_func_generic(
6363
db,
6464
cache,
6565
substitutor: &mut substitutor,
66-
root: call_expr.get_root(),
6766
call_expr: Some(call_expr.clone()),
6867
};
6968
if !generic_tpls.is_empty() {
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use emmylua_parser::{LuaCallExpr, LuaSyntaxNode};
1+
use emmylua_parser::LuaCallExpr;
22

33
use crate::{DbIndex, LuaInferCache, TypeSubstitutor};
44

@@ -7,6 +7,5 @@ pub struct TplContext<'a> {
77
pub db: &'a DbIndex,
88
pub cache: &'a mut LuaInferCache,
99
pub substitutor: &'a mut TypeSubstitutor,
10-
pub root: LuaSyntaxNode,
1110
pub call_expr: Option<LuaCallExpr>,
1211
}

crates/emmylua_code_analysis/src/semantic/infer/infer_call/mod.rs

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ use super::{
1313
};
1414
use crate::{
1515
CacheEntry, DbIndex, InFiled, LuaFunctionType, LuaGenericType, LuaInstanceType,
16-
LuaOperatorMetaMethod, LuaOperatorOwner, LuaSignatureId, LuaType, LuaTypeDeclId, LuaUnionType,
16+
LuaOperatorMetaMethod, LuaOperatorOwner, LuaSignature, LuaSignatureId, LuaType, LuaTypeDeclId,
17+
LuaUnionType,
1718
};
1819
use crate::{
1920
InferGuardRef,
@@ -179,6 +180,7 @@ fn infer_signature_doc_function(
179180
if !signature.is_resolve_return() {
180181
return Err(InferFailReason::UnResolveSignatureReturn(signature_id));
181182
}
183+
let is_generic = signature_is_generic(db, cache, &signature, &call_expr).unwrap_or(false);
182184
let overloads = &signature.overloads;
183185
if overloads.is_empty() {
184186
let mut fake_doc_function = LuaFunctionType::new(
@@ -187,7 +189,7 @@ fn infer_signature_doc_function(
187189
signature.get_type_params(),
188190
signature.get_return_type(),
189191
);
190-
if signature.is_generic() {
192+
if is_generic {
191193
fake_doc_function = instantiate_func_generic(db, cache, &fake_doc_function, call_expr)?;
192194
}
193195

@@ -207,7 +209,7 @@ fn infer_signature_doc_function(
207209
cache,
208210
new_overloads,
209211
call_expr.clone(),
210-
signature.is_generic(),
212+
is_generic,
211213
args_count,
212214
)
213215
}
@@ -654,3 +656,23 @@ fn check_can_infer(
654656

655657
Ok(())
656658
}
659+
660+
fn signature_is_generic(
661+
db: &DbIndex,
662+
cache: &mut LuaInferCache,
663+
signature: &LuaSignature,
664+
call_expr: &LuaCallExpr,
665+
) -> Option<bool> {
666+
if signature.is_generic() {
667+
return Some(true);
668+
}
669+
let LuaExpr::IndexExpr(index_expr) = call_expr.get_prefix_expr()? else {
670+
return None;
671+
};
672+
let prefix_type = infer_expr(db, cache, index_expr.get_prefix_expr()?).ok()?;
673+
match prefix_type {
674+
// 对于 Generic 直接认为是泛型
675+
LuaType::Generic(_) => return Some(true),
676+
_ => Some(prefix_type.contain_tpl()),
677+
}
678+
}

crates/emmylua_code_analysis/src/semantic/infer/infer_index.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -738,10 +738,6 @@ fn infer_generic_member(
738738
let generic_params = generic_type.get_params();
739739
let substitutor = TypeSubstitutor::from_type_array(generic_params.clone());
740740

741-
// TODO: this is just a hack to support inheritance from the generic objects
742-
// like `---@class box<T>: T`. Should be rewritten: generic types should
743-
// be passed to the called instantiate_type_generic() in some kind of a
744-
// context.
745741
if let LuaType::Ref(base_type_decl_id) = &base_type {
746742
let result = infer_generic_members_from_super_generics(
747743
db,

crates/emmylua_code_analysis/src/semantic/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,9 @@ use crate::{LuaFunctionType, LuaMemberId, LuaMemberKey, LuaTypeOwner};
5151
pub use generic::*;
5252
pub use guard::{InferGuard, InferGuardRef};
5353
pub use infer::InferFailReason;
54+
pub use infer::infer_call_expr_func;
55+
pub(crate) use infer::infer_expr;
5456
pub use infer::infer_param;
55-
pub(crate) use infer::{infer_call_expr_func, infer_expr};
5657
use overload_resolve::resolve_signature;
5758
pub use semantic_info::SemanticDeclLevel;
5859
pub use type_check::{TypeCheckFailReason, TypeCheckResult};

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ pub fn update_function_signature_info(
6161
}
6262
}
6363
}
64-
if let MarkedString::LanguageString(s) = &mut hover_builder.type_description {
64+
if let MarkedString::LanguageString(s) = &mut hover_builder.primary {
6565
s.value = format!("{} (+{} overloads)", s.value, overload_count);
6666
}
6767
}
@@ -78,7 +78,7 @@ fn build_vscode_completion_item(
7878
.signature_overload
7979
.and_then(|overloads| overloads.get(index).cloned())
8080
})
81-
.unwrap_or_else(|| hover_builder.type_description.clone());
81+
.unwrap_or_else(|| hover_builder.primary.clone());
8282

8383
match type_description {
8484
MarkedString::String(s) => {
@@ -138,7 +138,7 @@ fn build_other_completion_item(
138138
.signature_overload
139139
.and_then(|overloads| overloads.get(index).cloned())
140140
})
141-
.unwrap_or_else(|| hover_builder.type_description.clone());
141+
.unwrap_or_else(|| hover_builder.primary.clone());
142142

143143
match type_description {
144144
MarkedString::String(s) => {

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ use super::RegisterCapabilities;
2525
use crate::context::ServerContextSnapshot;
2626
use crate::handlers::definition::goto_path::goto_path;
2727
use crate::util::find_ref_at;
28-
pub use goto_function::extract_semantic_decl_from_signature;
2928

3029
pub async fn on_goto_definition_handler(
3130
context: ServerContextSnapshot,

0 commit comments

Comments
 (0)