Skip to content

Commit c97bf83

Browse files
extend const table type humanization
This patch extends the humanized variant of the const table. Previously, every constant table has been displayed as `table`. This patch makes short constant tables (having full type name no more than 36 symbols length) humanize into preciser types. See the following examples. ```lua -- a is humanized like `{ [1] = "test", [3] = 4 }` local a = { [1] = 'test', [3] = 4 } -- b is humanized like `{ name = "Pete", age = 36 }` local b = { name = 'pete', age = 36 } -- c is humanized like `{ a = table }` local c = { a = { very_very_very_very_very_long = 10000 } } -- d is humanized like `table` local d = { very_very_very_very_very_long = 10000 } ```
1 parent d7e1dec commit c97bf83

File tree

1 file changed

+42
-2
lines changed

1 file changed

+42
-2
lines changed

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

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::{
22
DbIndex, GenericTpl, LuaExistFieldType, LuaExtendedType, LuaFunctionType, LuaGenericType,
3-
LuaInstanceType, LuaIntersectionType, LuaMemberKey, LuaMultiReturn, LuaObjectType,
3+
LuaInstanceType, LuaIntersectionType, LuaMemberKey, LuaMemberOwner, LuaMultiReturn, LuaObjectType,
44
LuaSignatureId, LuaStringTplType, LuaTupleType, LuaType, LuaTypeDeclId, LuaUnionType,
55
};
66

@@ -18,7 +18,10 @@ pub fn humanize_type(db: &DbIndex, ty: &LuaType) -> String {
1818
LuaType::Userdata => "userdata".to_string(),
1919
LuaType::IntegerConst(i) => i.to_string(),
2020
LuaType::FloatConst(f) => f.to_string(),
21-
LuaType::TableConst(_) => "table".to_string(),
21+
LuaType::TableConst(v) => {
22+
let member_owner = LuaMemberOwner::Element(v.clone());
23+
humanize_table_const_type(db, member_owner)
24+
},
2225
LuaType::Global => "global".to_string(),
2326
LuaType::Def(id) => humanize_def_type(db, id),
2427
LuaType::Union(union) => humanize_union_type(db, union),
@@ -245,6 +248,43 @@ fn humanize_generic_type(db: &DbIndex, generic: &LuaGenericType) -> String {
245248
format!("{}<{}>", simple_name, generic_params)
246249
}
247250

251+
fn humanize_table_const_type_extended(db: &DbIndex, member_owned: LuaMemberOwner) -> Option<String> {
252+
let member_index = db.get_member_index();
253+
let member_map = member_index.get_member_map(member_owned)?;
254+
255+
let members_string = member_map.into_iter().fold(Some("".to_string()), |acc, member| {
256+
let prev_member_string = acc?;
257+
let (member_key, member_id) = member;
258+
let member_value = member_index.get_member(member_id)?;
259+
let member_value_string = humanize_type(db, member_value.get_decl_type());
260+
261+
let member_string = if let Some(name) = member_key.get_name() {
262+
format!("{} = {}", name, member_value_string)
263+
} else if let Some(i) = member_key.get_integer() {
264+
format!("[{}] = {}", i, member_value_string)
265+
} else {
266+
format!("{}", member_value_string)
267+
};
268+
269+
// Maximum typename length is 36 symbols.
270+
if prev_member_string.len() + member_string.len() <= 32 {
271+
if prev_member_string.len() > 0 {
272+
Some(format!("{}, {}", prev_member_string, member_string))
273+
} else {
274+
Some(format!("{}", member_string))
275+
}
276+
} else {
277+
None
278+
}
279+
})?;
280+
281+
Some(format!("{{ {} }}", members_string))
282+
}
283+
284+
fn humanize_table_const_type(db: &DbIndex, member_owned: LuaMemberOwner) -> String {
285+
humanize_table_const_type_extended(db, member_owned).unwrap_or("table".to_string())
286+
}
287+
248288
fn humanize_table_generic_type(db: &DbIndex, table_generic_params: &Vec<LuaType>) -> String {
249289
let generic_params = table_generic_params
250290
.iter()

0 commit comments

Comments
 (0)