Skip to content

Commit ae176b2

Browse files
committed
Support Type Language<T: string> as param for highlight token
1 parent f5ef576 commit ae176b2

File tree

15 files changed

+196
-64
lines changed

15 files changed

+196
-64
lines changed

crates/emmylua_code_analysis/resources/std/builtin.lua

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,3 +136,5 @@
136136
---@alias metatable std.metatable
137137

138138
---@alias TypeGuard<T> boolean
139+
140+
---@alias Language<T: string> string

crates/emmylua_code_analysis/resources/std/global.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ function ipairs(t) end
151151
---
152152
--- Lua does not check the consistency of binary chunks. Maliciously crafted
153153
--- binary chunks can crash the interpreter.
154-
---@param chunk (fun(...:any):string) | string
154+
---@param chunk (fun(...:any):string) | Language<"Lua">
155155
---@param chunkname? string
156156
---@param mode? std.loadmode
157157
---@param env? table
@@ -166,7 +166,7 @@ function load(chunk, chunkname, mode, env) end
166166
---
167167
---
168168
---@version 5.1, JIT
169-
---@param text string
169+
---@param text Language<"Lua">
170170
---@param chunkname? string
171171
---@return function? chunk
172172
---@return string? error_message

crates/emmylua_code_analysis/src/compilation/analyzer/doc/infer_type.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,13 @@ fn infer_special_generic_type(
317317
return Some(LuaType::ConstTplRef(tpl));
318318
}
319319
}
320+
"Language" => {
321+
let first_doc_param_type = generic_type.get_generic_types()?.get_types().next()?;
322+
let first_param = infer_type(analyzer, first_doc_param_type);
323+
if let LuaType::DocStringConst(lang_str) = first_param {
324+
return Some(LuaType::Language(lang_str));
325+
}
326+
}
320327
_ => {}
321328
}
322329

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ pub fn humanize_type(db: &DbIndex, ty: &LuaType, level: RenderLevel) -> String {
103103
format!("TypeGuard<{}>", type_str)
104104
}
105105
LuaType::ConstTplRef(const_tpl) => humanize_const_tpl_ref_type(const_tpl),
106+
LuaType::Language(s) => s.to_string(),
106107
_ => "unknown".to_string(),
107108
}
108109
}

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ pub enum LuaType {
6161
MultiLineUnion(Arc<LuaMultiLineUnion>),
6262
TypeGuard(Arc<LuaType>),
6363
ConstTplRef(Arc<GenericTpl>),
64+
Language(ArcIntern<SmolStr>),
6465
}
6566

6667
impl PartialEq for LuaType {
@@ -109,6 +110,7 @@ impl PartialEq for LuaType {
109110
(LuaType::TypeGuard(a), LuaType::TypeGuard(b)) => a == b,
110111
(LuaType::Never, LuaType::Never) => true,
111112
(LuaType::ConstTplRef(a), LuaType::ConstTplRef(b)) => a == b,
113+
(LuaType::Language(a), LuaType::Language(b)) => a == b,
112114
_ => false, // 不同变体之间不相等
113115
}
114116
}
@@ -186,6 +188,7 @@ impl Hash for LuaType {
186188
}
187189
LuaType::Never => 45.hash(state),
188190
LuaType::ConstTplRef(a) => (46, a).hash(state),
191+
LuaType::Language(a) => (47, a).hash(state),
189192
}
190193
}
191194
}
@@ -234,7 +237,10 @@ impl LuaType {
234237
pub fn is_string(&self) -> bool {
235238
matches!(
236239
self,
237-
LuaType::StringConst(_) | LuaType::String | LuaType::DocStringConst(_)
240+
LuaType::StringConst(_)
241+
| LuaType::String
242+
| LuaType::DocStringConst(_)
243+
| LuaType::Language(_)
238244
)
239245
}
240246

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,11 @@ pub fn infer_member_by_member_key(
150150
match &prefix_type {
151151
LuaType::Table | LuaType::Any | LuaType::Unknown => Ok(LuaType::Any),
152152
LuaType::TableConst(id) => infer_table_member(db, cache, id.clone(), index_expr),
153-
LuaType::String | LuaType::Io | LuaType::StringConst(_) | LuaType::DocStringConst(_) => {
153+
LuaType::String
154+
| LuaType::Io
155+
| LuaType::StringConst(_)
156+
| LuaType::DocStringConst(_)
157+
| LuaType::Language(_) => {
154158
let decl_id =
155159
get_buildin_type_map_type_id(&prefix_type).ok_or(InferFailReason::None)?;
156160
infer_custom_type_member(db, cache, decl_id, index_expr, infer_guard)

crates/emmylua_code_analysis/src/semantic/member/find_members.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,11 @@ fn find_members_guard(
6565
find_normal_members(db, member_owner, filter)
6666
}
6767
LuaType::TableGeneric(table_type) => find_table_generic_members(table_type, filter),
68-
LuaType::String | LuaType::Io | LuaType::StringConst(_) => {
68+
LuaType::String
69+
| LuaType::Io
70+
| LuaType::StringConst(_)
71+
| LuaType::DocStringConst(_)
72+
| LuaType::Language(_) => {
6973
let type_decl_id = get_buildin_type_map_type_id(&prefix_type)?;
7074
find_custom_type_members(db, &type_decl_id, infer_guard, filter)
7175
}

crates/emmylua_code_analysis/src/semantic/member/infer_raw_member.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,11 @@ fn infer_raw_member_type_guard(
3030
let owner = LuaMemberOwner::Element(id.clone());
3131
infer_owner_raw_member_type(db, owner, member_key)
3232
}
33-
LuaType::String | LuaType::Io | LuaType::StringConst(_) | LuaType::DocStringConst(_) => {
33+
LuaType::String
34+
| LuaType::Io
35+
| LuaType::StringConst(_)
36+
| LuaType::DocStringConst(_)
37+
| LuaType::Language(_) => {
3438
let decl_id =
3539
get_buildin_type_map_type_id(&prefix_type).ok_or(InferFailReason::None)?;
3640
let owner = LuaMemberOwner::Type(decl_id);

crates/emmylua_code_analysis/src/semantic/type_check/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ fn check_general_type_compact(
6868
| LuaType::StrTplRef(_)
6969
| LuaType::ConstTplRef(_)
7070
| LuaType::Namespace(_)
71-
| LuaType::Variadic(_) => check_simple_type_compact(db, source, compact_type, check_guard),
71+
| LuaType::Variadic(_)
72+
| LuaType::Language(_) => check_simple_type_compact(db, source, compact_type, check_guard),
7273

7374
// type ref
7475
LuaType::Ref(type_decl_id) => {

crates/emmylua_code_analysis/src/semantic/type_check/simple_type.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ pub fn check_simple_type_compact(
7070
LuaType::String
7171
| LuaType::StringConst(_)
7272
| LuaType::DocStringConst(_)
73-
| LuaType::StrTplRef(_) => {
73+
| LuaType::StrTplRef(_)
74+
| LuaType::Language(_) => {
7475
return Ok(());
7576
}
7677
LuaType::Ref(_) => {
@@ -215,6 +216,17 @@ pub fn check_simple_type_compact(
215216
LuaType::Variadic(source_type) => {
216217
return check_variadic_type_compact(db, source_type, compact_type, check_guard);
217218
}
219+
LuaType::Language(lang_str) => match compact_type {
220+
LuaType::Language(compact_lang_str) => {
221+
if lang_str == compact_lang_str {
222+
return Ok(());
223+
}
224+
}
225+
LuaType::DocStringConst(_) | LuaType::String | LuaType::StringConst(_) => {
226+
return Ok(());
227+
}
228+
_ => {}
229+
},
218230
_ => {}
219231
}
220232

0 commit comments

Comments
 (0)