From e6514b377d46bc66b7003346838333434db2a7b9 Mon Sep 17 00:00:00 2001 From: He1pa <18012015693@163.com> Date: Fri, 8 Sep 2023 14:11:51 +0800 Subject: [PATCH 1/3] feat: lsp hover for system pkg and builtin(str) func information. Show func pkg, function signature and doc when request hover on a function name --- kclvm/sema/src/builtin/decorator.rs | 2 + kclvm/sema/src/builtin/mod.rs | 27 +++++ kclvm/sema/src/builtin/string.rs | 29 +++++ kclvm/sema/src/builtin/system_module.rs | 71 +++++++++++ kclvm/sema/src/resolver/attr.rs | 1 + kclvm/sema/src/resolver/global.rs | 3 + kclvm/sema/src/resolver/node.rs | 18 ++- kclvm/sema/src/resolver/scope.rs | 1 + kclvm/sema/src/ty/constructor.rs | 2 + kclvm/sema/src/ty/mod.rs | 2 + kclvm/tools/src/LSP/src/document_symbol.rs | 1 + kclvm/tools/src/LSP/src/goto_def.rs | 45 +++++-- kclvm/tools/src/LSP/src/hover.rs | 110 +++++++++++++++++- .../src/test_data/goto_def_test/goto_def.k | 2 +- .../src/LSP/src/test_data/hover_test/hover.k | 6 +- 15 files changed, 307 insertions(+), 13 deletions(-) diff --git a/kclvm/sema/src/builtin/decorator.rs b/kclvm/sema/src/builtin/decorator.rs index 446c36e4e..69da41cf1 100644 --- a/kclvm/sema/src/builtin/decorator.rs +++ b/kclvm/sema/src/builtin/decorator.rs @@ -21,6 +21,7 @@ macro_rules! register_decorator { register_decorator! { deprecated => Type::function( + Some("Decorator".to_string()), None, Rc::new(Type::ANY), &[ @@ -53,6 +54,7 @@ register_decorator! { None, ) info => Type::function( + Some("Decorator".to_string()), None, Rc::new(Type::ANY), &[], diff --git a/kclvm/sema/src/builtin/mod.rs b/kclvm/sema/src/builtin/mod.rs index 4d955bc0c..468b04fd8 100644 --- a/kclvm/sema/src/builtin/mod.rs +++ b/kclvm/sema/src/builtin/mod.rs @@ -34,6 +34,7 @@ macro_rules! register_builtin { register_builtin! { option => Type::function( + Some("Builtin".to_string()), None, Rc::new(Type::ANY), &[ @@ -78,6 +79,7 @@ register_builtin! { Some(1), ) print => Type::function( + Some("Builtin".to_string()), None, Rc::new(Type::ANY), &[], @@ -90,6 +92,7 @@ register_builtin! { Some(0), ) multiplyof => Type::function( + Some("Builtin".to_string()), None, Rc::new(Type::BOOL), &[ @@ -109,6 +112,7 @@ register_builtin! { Some(0), ) isunique => Type::function( + Some("Builtin".to_string()), None, Rc::new(Type::BOOL), &[ @@ -123,6 +127,7 @@ register_builtin! { None, ) len => Type::function( + Some("Builtin".to_string()), None, Rc::new(Type::INT), &[ @@ -137,6 +142,7 @@ register_builtin! { None, ) abs => Type::function( + Some("Builtin".to_string()), None, Rc::new(Type::ANY), &[ @@ -151,6 +157,7 @@ register_builtin! { None, ) all_true => Type::function( + Some("Builtin".to_string()), None, Rc::new(Type::BOOL), &[ @@ -167,6 +174,7 @@ register_builtin! { None, ) any_true => Type::function( + Some("Builtin".to_string()), None, Rc::new(Type::BOOL), &[ @@ -183,6 +191,7 @@ register_builtin! { None, ) hex => Type::function( + Some("Builtin".to_string()), None, Rc::new(Type::STR), &[ @@ -197,6 +206,7 @@ register_builtin! { None, ) bin => Type::function( + Some("Builtin".to_string()), None, Rc::new(Type::STR), &[ @@ -211,6 +221,7 @@ register_builtin! { None, ) oct => Type::function( + Some("Builtin".to_string()), None, Rc::new(Type::STR), &[ @@ -225,6 +236,7 @@ register_builtin! { None, ) ord => Type::function( + Some("Builtin".to_string()), None, Rc::new(Type::INT), &[ @@ -239,6 +251,7 @@ register_builtin! { None, ) sorted => Type::function( + Some("Builtin".to_string()), None, Type::list_ref(Rc::new(Type::ANY)), &[ @@ -261,6 +274,7 @@ register_builtin! { Some(1), ) range => Type::function( + Some("Builtin".to_string()), None, Type::list_ref(Rc::new(Type::INT)), &[ @@ -285,6 +299,7 @@ register_builtin! { None, ) max => Type::function( + Some("Builtin".to_string()), None, Rc::new(Type::ANY), &[], @@ -296,6 +311,7 @@ register_builtin! { None, ) min => Type::function( + Some("Builtin".to_string()), None, Rc::new(Type::ANY), &[], @@ -307,6 +323,7 @@ register_builtin! { None, ) sum => Type::function( + Some("Builtin".to_string()), None, Rc::new(Type::ANY), &[ @@ -328,6 +345,7 @@ register_builtin! { None, ) pow => Type::function( + Some("Builtin".to_string()), None, Type::number(), &[ @@ -355,6 +373,7 @@ register_builtin! { None, ) round => Type::function( + Some("Builtin".to_string()), None, Type::number(), &[ @@ -378,6 +397,7 @@ register_builtin! { None, ) zip => Type::function( + Some("Builtin".to_string()), None, Type::list_ref(Rc::new(Type::ANY)), &[], @@ -388,6 +408,7 @@ register_builtin! { None, ) int => Type::function( + Some("Builtin".to_string()), None, Rc::new(Type::INT), &[ @@ -408,6 +429,7 @@ register_builtin! { None, ) float => Type::function( + Some("Builtin".to_string()), None, Rc::new(Type::FLOAT), &[ @@ -422,6 +444,7 @@ register_builtin! { None, ) bool => Type::function( + Some("Builtin".to_string()), None, Rc::new(Type::BOOL), &[ @@ -438,6 +461,7 @@ register_builtin! { None, ) str => Type::function( + Some("Builtin".to_string()), None, Rc::new(Type::STR), &[ @@ -455,6 +479,7 @@ register_builtin! { None, ) list => Type::function( + Some("Builtin".to_string()), None, Type::list_ref(Rc::new(Type::ANY)), &[ @@ -472,6 +497,7 @@ register_builtin! { None, ) dict => Type::function( + Some("Builtin".to_string()), None, Type::dict_ref(Rc::new(Type::ANY), Rc::new(Type::ANY)), &[ @@ -486,6 +512,7 @@ register_builtin! { None, ) typeof => Type::function( + Some("Builtin".to_string()), None, Rc::new(Type::STR), &[ diff --git a/kclvm/sema/src/builtin/string.rs b/kclvm/sema/src/builtin/string.rs index 2e636abeb..6e5b6b10c 100644 --- a/kclvm/sema/src/builtin/string.rs +++ b/kclvm/sema/src/builtin/string.rs @@ -17,6 +17,7 @@ macro_rules! register_string_member { register_string_member! { capitalize => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::STR), &[], @@ -25,6 +26,7 @@ register_string_member! { None, ) count => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::INT), &[ @@ -49,6 +51,7 @@ register_string_member! { None, ) endswith => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::BOOL), &[ @@ -73,6 +76,7 @@ register_string_member! { None, ) find => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::INT), &[ @@ -97,6 +101,7 @@ register_string_member! { None, ) format => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::STR), &[], @@ -105,6 +110,7 @@ register_string_member! { None, ) index => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::INT), &[ @@ -129,6 +135,7 @@ register_string_member! { None, ) isalpha => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::BOOL), &[], @@ -137,6 +144,7 @@ register_string_member! { None, ) isalnum => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::BOOL), &[], @@ -145,6 +153,7 @@ register_string_member! { None, ) isdigit => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::BOOL), &[], @@ -153,6 +162,7 @@ register_string_member! { None, ) islower => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::BOOL), &[], @@ -161,6 +171,7 @@ register_string_member! { None, ) isspace => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::BOOL), &[], @@ -169,6 +180,7 @@ register_string_member! { None, ) istitle => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::BOOL), &[], @@ -177,6 +189,7 @@ register_string_member! { None, ) isupper => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::BOOL), &[], @@ -185,6 +198,7 @@ register_string_member! { None, ) join => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::STR), &[ @@ -199,6 +213,7 @@ register_string_member! { None, ) lower => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::STR), &[], @@ -207,6 +222,7 @@ register_string_member! { None, ) upper => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::STR), &[], @@ -215,6 +231,7 @@ register_string_member! { None, ) lstrip => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::STR), &[ @@ -229,6 +246,7 @@ register_string_member! { None, ) rstrip => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::STR), &[ @@ -243,6 +261,7 @@ register_string_member! { None, ) replace => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::STR), &[ @@ -267,6 +286,7 @@ register_string_member! { None, ) removeprefix => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::STR), &[ @@ -281,6 +301,7 @@ register_string_member! { None, ) removesuffix => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::STR), &[ @@ -295,6 +316,7 @@ register_string_member! { None, ) rfind => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::INT), &[ @@ -319,6 +341,7 @@ register_string_member! { None, ) rindex => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::INT), &[ @@ -343,6 +366,7 @@ register_string_member! { None, ) rsplit => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Type::list_ref(Rc::new(Type::STR)), &[ @@ -362,6 +386,7 @@ register_string_member! { None, ) split => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Type::list_ref(Rc::new(Type::STR)), &[ @@ -381,6 +406,7 @@ register_string_member! { None, ) splitlines => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Type::list_ref(Rc::new(Type::STR)), &[ @@ -395,6 +421,7 @@ register_string_member! { None, ) startswith => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::BOOL), &[ @@ -419,6 +446,7 @@ register_string_member! { None, ) strip => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::STR), &[ @@ -433,6 +461,7 @@ register_string_member! { None, ) title => Type::function( + Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::STR), &[], diff --git a/kclvm/sema/src/builtin/system_module.rs b/kclvm/sema/src/builtin/system_module.rs index da8f59513..8b1d42d9d 100644 --- a/kclvm/sema/src/builtin/system_module.rs +++ b/kclvm/sema/src/builtin/system_module.rs @@ -23,6 +23,7 @@ macro_rules! register_base64_member { } register_base64_member! { encode => Type::function( + Some("Base64".to_string()), None, Type::str_ref(), &[ @@ -42,6 +43,7 @@ register_base64_member! { None, ) decode => Type::function( + Some("Base64".to_string()), None, Type::str_ref(), &[ @@ -96,6 +98,7 @@ macro_rules! register_net_member { } register_net_member! { split_host_port => Type::function( + Some("Net".to_string()), None, Type::list_ref(Type::str_ref()), &[ @@ -110,6 +113,7 @@ register_net_member! { None, ) join_host_port => Type::function( + Some("Net".to_string()), None, Type::str_ref(), &[ @@ -129,6 +133,7 @@ register_net_member! { None, ) fqdn => Type::function( + Some("Net".to_string()), None, Type::str_ref(), &[ @@ -143,6 +148,7 @@ register_net_member! { None, ) parse_IP => Type::function( + Some("Net".to_string()), None, Type::str_ref(), &[ @@ -157,6 +163,7 @@ register_net_member! { None, ) IP_string => Type::function( + Some("Net".to_string()), None, Type::str_ref(), &[ @@ -171,6 +178,7 @@ register_net_member! { None, ) to_IP4 => Type::function( + Some("Net".to_string()), None, Type::str_ref(), &[ @@ -185,6 +193,7 @@ register_net_member! { None, ) to_IP16 => Type::function( + Some("Net".to_string()), None, Type::str_ref(), &[ @@ -199,6 +208,7 @@ register_net_member! { None, ) is_IPv4 => Type::function( + Some("Net".to_string()), None, Type::bool_ref(), &[ @@ -213,6 +223,7 @@ register_net_member! { None, ) is_IP =>Type::function( + Some("Net".to_string()), None, Type::bool_ref(), &[ @@ -227,6 +238,7 @@ register_net_member! { None, ) is_loopback_IP =>Type::function( + Some("Net".to_string()), None, Type::bool_ref(), &[ @@ -241,6 +253,7 @@ register_net_member! { None, ) is_multicast_IP =>Type::function( + Some("Net".to_string()), None, Type::bool_ref(), &[ @@ -255,6 +268,7 @@ register_net_member! { None, ) is_interface_local_multicast_IP => Type::function( + Some("Net".to_string()), None, Type::bool_ref(), &[ @@ -269,6 +283,7 @@ register_net_member! { None, ) is_link_local_multicast_IP =>Type::function( + Some("Net".to_string()), None, Type::bool_ref(), &[ @@ -283,6 +298,7 @@ register_net_member! { None, ) is_link_local_unicast_IP =>Type::function( + Some("Net".to_string()), None, Type::bool_ref(), &[ @@ -297,6 +313,7 @@ register_net_member! { None, ) is_global_unicast_IP =>Type::function( + Some("Net".to_string()), None, Type::bool_ref(), &[ @@ -311,6 +328,7 @@ register_net_member! { None, ) is_unspecified_IP => Type::function( + Some("Net".to_string()), None, Type::bool_ref(), &[ @@ -343,6 +361,7 @@ macro_rules! register_manifests_member { } register_manifests_member! { yaml_stream => Type::function( + Some("Yaml Stream".to_string()), None, Type::any_ref(), &[ @@ -404,6 +423,7 @@ macro_rules! register_math_member { } register_math_member! { ceil => Type::function( + Some("Math".to_string()), None, Type::int_ref(), &[ @@ -418,6 +438,7 @@ register_math_member! { None, ) factorial => Type::function( + Some("Math".to_string()), None, Type::int_ref(), &[ @@ -432,6 +453,7 @@ register_math_member! { None, ) floor => Type::function( + Some("Math".to_string()), None, Type::int_ref(), &[ @@ -446,6 +468,7 @@ register_math_member! { None, ) gcd => Type::function( + Some("Math".to_string()), None, Type::int_ref(), &[ @@ -465,6 +488,7 @@ register_math_member! { None, ) isfinite => Type::function( + Some("Math".to_string()), None, Type::bool_ref(), &[ @@ -479,6 +503,7 @@ register_math_member! { None, ) isinf => Type::function( + Some("Math".to_string()), None, Type::bool_ref(), &[ @@ -493,6 +518,7 @@ register_math_member! { None, ) isnan => Type::function( + Some("Math".to_string()), None, Type::bool_ref(), &[ @@ -507,6 +533,7 @@ register_math_member! { None, ) modf => Type::function( + Some("Math".to_string()), None, Type::list_ref(Type::float_ref()), &[ @@ -521,6 +548,7 @@ register_math_member! { None, ) exp => Type::function( + Some("Math".to_string()), None, Type::float_ref(), &[ @@ -535,6 +563,7 @@ register_math_member! { None, ) expm1 => Type::function( + Some("Math".to_string()), None, Type::float_ref(), &[ @@ -549,6 +578,7 @@ register_math_member! { None, ) log => Type::function( + Some("Math".to_string()), None, Type::float_ref(), &[ @@ -568,6 +598,7 @@ register_math_member! { None, ) log1p => Type::function( + Some("Math".to_string()), None, Type::float_ref(), &[ @@ -582,6 +613,7 @@ register_math_member! { None, ) log2 => Type::function( + Some("Math".to_string()), None, Type::float_ref(), &[ @@ -596,6 +628,7 @@ register_math_member! { None, ) log10 => Type::function( + Some("Math".to_string()), None, Type::float_ref(), &[ @@ -610,6 +643,7 @@ register_math_member! { None, ) pow => Type::function( + Some("Math".to_string()), None, Type::float_ref(), &[ @@ -629,6 +663,7 @@ register_math_member! { None, ) sqrt => Type::function( + Some("Math".to_string()), None, Type::float_ref(), &[ @@ -661,6 +696,7 @@ macro_rules! register_datetime_member { } register_datetime_member! { ticks => Type::function( + Some("Datatime".to_string()), None, Type::float_ref(), &[], @@ -669,6 +705,7 @@ register_datetime_member! { None, ) date => Type::function( + Some("Datatime".to_string()), None, Type::str_ref(), &[], @@ -677,6 +714,7 @@ register_datetime_member! { None, ) now => Type::function( + Some("Datatime".to_string()), None, Type::str_ref(), &[], @@ -685,6 +723,7 @@ register_datetime_member! { None, ) today => Type::function( + Some("Datatime".to_string()), None, Type::str_ref(), &[], @@ -712,6 +751,7 @@ macro_rules! register_regex_member { } register_regex_member! { replace => Type::function( + Some("Regex".to_string()), None, Type::str_ref(), &[ @@ -741,6 +781,7 @@ register_regex_member! { None, ) match => Type::function( + Some("Regex".to_string()), None, Type::bool_ref(), &[ @@ -760,6 +801,7 @@ register_regex_member! { None, ) compile => Type::function( + Some("Regex".to_string()), None, Type::bool_ref(), &[ @@ -774,6 +816,7 @@ register_regex_member! { None, ) findall => Type::function( + Some("Regex".to_string()), None, Type::list_ref(Type::str_ref()), &[ @@ -793,6 +836,7 @@ register_regex_member! { None, ) search => Type::function( + Some("Regex".to_string()), None, Type::bool_ref(), &[ @@ -812,6 +856,7 @@ register_regex_member! { None, ) split => Type::function( + Some("Regex".to_string()), None, Type::list_ref(Type::str_ref()), &[ @@ -854,6 +899,7 @@ macro_rules! register_yaml_member { } register_yaml_member! { encode => Type::function( + Some("Yaml".to_string()), None, Type::str_ref(), &[ @@ -883,6 +929,7 @@ register_yaml_member! { Some(1), ) decode => Type::function( + Some("Yaml".to_string()), None, Type::any_ref(), &[ @@ -897,6 +944,7 @@ register_yaml_member! { None, ) dump_to_file => Type::function( + Some("Yaml".to_string()), None, Type::str_ref(), &[ @@ -949,6 +997,7 @@ macro_rules! register_json_member { } register_json_member! { encode => Type::function( + Some("Json".to_string()), None, Type::str_ref(), &[ @@ -983,6 +1032,7 @@ register_json_member! { Some(1), ) decode => Type::function( + Some("Json".to_string()), None, Type::any_ref(), &[ @@ -997,6 +1047,7 @@ register_json_member! { None, ) dump_to_file => Type::function( + Some("Json".to_string()), None, Type::str_ref(), &[ @@ -1054,6 +1105,7 @@ macro_rules! register_crypto_member { } register_crypto_member! { md5 => Type::function( + Some("Crypto".to_string()), None, Type::str_ref(), &[ @@ -1073,6 +1125,7 @@ register_crypto_member! { None, ) sha1 => Type::function( + Some("Crypto".to_string()), None, Type::str_ref(), &[ @@ -1092,6 +1145,7 @@ register_crypto_member! { None, ) sha224 => Type::function( + Some("Crypto".to_string()), None, Type::str_ref(), &[ @@ -1111,6 +1165,7 @@ register_crypto_member! { None, ) sha256 => Type::function( + Some("Crypto".to_string()), None, Type::str_ref(), &[ @@ -1130,6 +1185,7 @@ register_crypto_member! { None, ) sha384 => Type::function( + Some("Crypto".to_string()), None, Type::str_ref(), &[ @@ -1149,6 +1205,7 @@ register_crypto_member! { None, ) sha512 => Type::function( + Some("Crypto".to_string()), None, Type::str_ref(), &[ @@ -1221,6 +1278,7 @@ register_units_member! { Ti => Type::INT Pi => Type::INT to_n => Type::function( + Some("Units".to_string()), None, Type::str_ref(), &[ @@ -1235,6 +1293,7 @@ register_units_member! { None, ) to_u => Type::function( + Some("Units".to_string()), None, Type::str_ref(), &[ @@ -1249,6 +1308,7 @@ register_units_member! { None, ) to_m => Type::function( + Some("Units".to_string()), None, Type::str_ref(), &[ @@ -1263,6 +1323,7 @@ register_units_member! { None, ) to_K => Type::function( + Some("Units".to_string()), None, Type::str_ref(), &[ @@ -1277,6 +1338,7 @@ register_units_member! { None, ) to_M => Type::function( + Some("Units".to_string()), None, Type::str_ref(), &[ @@ -1291,6 +1353,7 @@ register_units_member! { None, ) to_G => Type::function( + Some("Units".to_string()), None, Type::str_ref(), &[ @@ -1305,6 +1368,7 @@ register_units_member! { None, ) to_T => Type::function( + Some("Units".to_string()), None, Type::str_ref(), &[ @@ -1319,6 +1383,7 @@ register_units_member! { None, ) to_P => Type::function( + Some("Units".to_string()), None, Type::str_ref(), &[ @@ -1333,6 +1398,7 @@ register_units_member! { None, ) to_Ki => Type::function( + Some("Units".to_string()), None, Type::str_ref(), &[ @@ -1347,6 +1413,7 @@ register_units_member! { None, ) to_Mi => Type::function( + Some("Units".to_string()), None, Type::str_ref(), &[ @@ -1361,6 +1428,7 @@ register_units_member! { None, ) to_Gi => Type::function( + Some("Units".to_string()), None, Type::str_ref(), &[ @@ -1375,6 +1443,7 @@ register_units_member! { None, ) to_Ti => Type::function( + Some("Units".to_string()), None, Type::str_ref(), &[ @@ -1389,6 +1458,7 @@ register_units_member! { None, ) to_Pi => Type::function( + Some("Units".to_string()), None, Type::str_ref(), &[ @@ -1421,6 +1491,7 @@ macro_rules! register_collection_member { } register_collection_member! { union_all => Type::function( + Some("Collection".to_string()), None, Type::any_ref(), &[ diff --git a/kclvm/sema/src/resolver/attr.rs b/kclvm/sema/src/resolver/attr.rs index 3e22f4d3c..bd570a739 100644 --- a/kclvm/sema/src/resolver/attr.rs +++ b/kclvm/sema/src/resolver/attr.rs @@ -68,6 +68,7 @@ impl<'ctx> Resolver<'ctx> { ( true, Rc::new(Type::function( + Some("Schema".to_string()), Some(obj.clone()), Type::list_ref(self.any_ty()), &[], diff --git a/kclvm/sema/src/resolver/global.rs b/kclvm/sema/src/resolver/global.rs index 34527a564..779e74cc8 100644 --- a/kclvm/sema/src/resolver/global.rs +++ b/kclvm/sema/src/resolver/global.rs @@ -77,6 +77,7 @@ impl<'ctx> Resolver<'ctx> { mixins: vec![], attrs: IndexMap::default(), func: Box::new(FunctionType { + pkg: None, doc: parsed_doc.summary.clone(), params: vec![], self_ty: None, @@ -823,6 +824,7 @@ impl<'ctx> Resolver<'ctx> { mixins: mixin_types, attrs: attr_obj_map, func: Box::new(FunctionType { + pkg: None, doc: parsed_doc.summary.clone(), params, self_ty: None, @@ -932,6 +934,7 @@ impl<'ctx> Resolver<'ctx> { mixins: parent_types, attrs: IndexMap::default(), func: Box::new(FunctionType { + pkg: None, doc: rule_stmt.doc.clone(), params, self_ty: None, diff --git a/kclvm/sema/src/resolver/node.rs b/kclvm/sema/src/resolver/node.rs index 1f989138d..8d27ab688 100644 --- a/kclvm/sema/src/resolver/node.rs +++ b/kclvm/sema/src/resolver/node.rs @@ -506,6 +506,22 @@ impl<'ctx> MutSelfTypedResultWalker<'ctx> for Resolver<'ctx> { selector_expr.attr.get_span_pos(), ); } + + if let TypeKind::Function(func) = &value_ty.kind { + self.insert_object( + &selector_expr.attr.node.get_name(), + ScopeObject { + name: selector_expr.attr.node.get_name(), + start: selector_expr.attr.get_pos(), + end: selector_expr.attr.get_end_pos(), + ty: value_ty.clone(), + kind: ScopeObjectKind::FunctionCall, + used: false, + doc: Some(func.doc.clone()), + }, + ) + } + value_ty } @@ -974,7 +990,7 @@ impl<'ctx> MutSelfTypedResultWalker<'ctx> for Resolver<'ctx> { if !real_ret_ty.is_any() && ret_ty.is_any() && lambda_expr.return_type_str.is_none() { ret_ty = real_ret_ty; } - Rc::new(Type::function(None, ret_ty, ¶ms, "", false, None)) + Rc::new(Type::function(None, None, ret_ty, ¶ms, "", false, None)) } fn walk_keyword(&mut self, keyword: &'ctx ast::Keyword) -> Self::Result { diff --git a/kclvm/sema/src/resolver/scope.rs b/kclvm/sema/src/resolver/scope.rs index 38a9df93e..d0c98426e 100644 --- a/kclvm/sema/src/resolver/scope.rs +++ b/kclvm/sema/src/resolver/scope.rs @@ -70,6 +70,7 @@ pub enum ScopeObjectKind { Definition, Parameter, TypeAlias, + FunctionCall, Module(Module), } diff --git a/kclvm/sema/src/ty/constructor.rs b/kclvm/sema/src/ty/constructor.rs index b6c37e97b..eb59fbd44 100644 --- a/kclvm/sema/src/ty/constructor.rs +++ b/kclvm/sema/src/ty/constructor.rs @@ -173,6 +173,7 @@ impl Type { /// Construct a function type. #[inline] pub fn function( + pkg: Option, self_ty: Option>, return_ty: Rc, params: &[Parameter], @@ -182,6 +183,7 @@ impl Type { ) -> Type { Type { kind: TypeKind::Function(FunctionType { + pkg, doc: doc.to_string(), params: params.to_owned(), self_ty, diff --git a/kclvm/sema/src/ty/mod.rs b/kclvm/sema/src/ty/mod.rs index b193e387a..048dccd44 100644 --- a/kclvm/sema/src/ty/mod.rs +++ b/kclvm/sema/src/ty/mod.rs @@ -375,6 +375,7 @@ impl NumberMultiplierType { /// The function type. #[derive(Debug, Clone, PartialEq)] pub struct FunctionType { + pub pkg: Option, pub doc: String, pub params: Vec, pub self_ty: Option, @@ -387,6 +388,7 @@ impl FunctionType { #[inline] pub fn variadic_func() -> Self { Self { + pkg: None, doc: "".to_string(), params: vec![], self_ty: None, diff --git a/kclvm/tools/src/LSP/src/document_symbol.rs b/kclvm/tools/src/LSP/src/document_symbol.rs index 428c5cc7e..9f59725e2 100644 --- a/kclvm/tools/src/LSP/src/document_symbol.rs +++ b/kclvm/tools/src/LSP/src/document_symbol.rs @@ -101,6 +101,7 @@ fn scope_obj_kind_to_document_symbol_kind(kind: ScopeObjectKind) -> SymbolKind { ScopeObjectKind::Parameter => SymbolKind::VARIABLE, ScopeObjectKind::TypeAlias => SymbolKind::TYPE_PARAMETER, ScopeObjectKind::Module(_) => SymbolKind::MODULE, + ScopeObjectKind::FunctionCall => SymbolKind::FUNCTION, } } diff --git a/kclvm/tools/src/LSP/src/goto_def.rs b/kclvm/tools/src/LSP/src/goto_def.rs index 0199e9059..8f7c36c05 100644 --- a/kclvm/tools/src/LSP/src/goto_def.rs +++ b/kclvm/tools/src/LSP/src/goto_def.rs @@ -14,7 +14,8 @@ use kclvm_ast::ast::{Expr, Identifier, ImportStmt, Node, Program, Stmt}; use kclvm_compiler::pkgpath_without_prefix; use kclvm_error::Position as KCLPos; -use kclvm_sema::resolver::scope::{ProgramScope, Scope, ScopeObject}; +use kclvm_sema::builtin::get_system_member_function_ty; +use kclvm_sema::resolver::scope::{ProgramScope, Scope, ScopeObject, ScopeObjectKind}; use kclvm_sema::ty::{DictType, SchemaType}; use lsp_types::{GotoDefinitionResponse, Url}; use lsp_types::{Location, Range}; @@ -124,7 +125,6 @@ pub(crate) fn find_def( } let (inner_expr, parent) = inner_most_expr_in_stmt(&node.node, kcl_pos, None); - if let Some(expr) = inner_expr { if let Expr::Identifier(id) = expr.node { let id_node = Node::node_with_pos( @@ -202,14 +202,43 @@ pub(crate) fn resolve_var( kclvm_sema::ty::TypeKind::Schema(schema_type) => { find_attr_in_schema(schema_type, &node_names[1..], scope_map) } - kclvm_sema::ty::TypeKind::Module(module_ty) => { - match scope_map.get(&pkgpath_without_prefix!(module_ty.pkgpath)) { - Some(scope) => { - return resolve_var(&node_names[1..], &scope.borrow(), scope_map); + kclvm_sema::ty::TypeKind::Module(module_ty) => match module_ty.kind { + kclvm_sema::ty::ModuleKind::User => { + match scope_map.get(&pkgpath_without_prefix!(module_ty.pkgpath)) { + Some(scope) => { + return resolve_var( + &node_names[1..], + &scope.borrow(), + scope_map, + ); + } + None => None, } - None => None, } - } + kclvm_sema::ty::ModuleKind::System => { + if node_names.len() == 2 { + let func_name_node = node_names[1].clone(); + let func_name = func_name_node.node.clone(); + let ty = get_system_member_function_ty(&name, &func_name); + match &ty.kind { + kclvm_sema::ty::TypeKind::Function(func_ty) => { + return Some(Definition::Object(ScopeObject { + name: func_name, + start: func_name_node.get_pos(), + end: func_name_node.get_end_pos(), + ty: ty.clone(), + kind: ScopeObjectKind::FunctionCall, + used: false, + doc: Some(func_ty.doc.clone()), + })) + } + _ => return None, + } + } + None + } + kclvm_sema::ty::ModuleKind::Plugin => None, + }, kclvm_sema::ty::TypeKind::Dict(DictType { attrs, .. }) => { let key_name = names[1].clone(); match attrs.get(&key_name) { diff --git a/kclvm/tools/src/LSP/src/hover.rs b/kclvm/tools/src/LSP/src/hover.rs index 91a34e68e..a18d5e212 100644 --- a/kclvm/tools/src/LSP/src/hover.rs +++ b/kclvm/tools/src/LSP/src/hover.rs @@ -1,7 +1,10 @@ use indexmap::IndexSet; use kclvm_ast::ast::Program; use kclvm_error::Position as KCLPos; -use kclvm_sema::resolver::scope::{ProgramScope, ScopeObjectKind}; +use kclvm_sema::{ + resolver::scope::{ProgramScope, ScopeObjectKind}, + ty::FunctionType, +}; use lsp_types::{Hover, HoverContents, MarkedString}; use crate::goto_def::find_def; @@ -55,7 +58,37 @@ pub(crate) fn hover( } docs.insert(attrs.join("\n\n")); } - // todo: hover ScopeObjectKind::Attribute optional, default value + ScopeObjectKind::FunctionCall => { + let ty = obj.ty.clone(); + match &ty.kind { + kclvm_sema::ty::TypeKind::Function(func_ty) => { + // system package function + // ``` + // pkg + // function func_name(arg1: type, arg2: type, ..) -> type + // ----------------- + // doc + // ``` + // if let Some(pkg) = &func_ty.pkg{ + // docs.insert(pkg.clone()); + // } + let pkg = if let Some(pkg) = &func_ty.pkg { + format!("{}\n\n", pkg) + } else { + "".to_string() + }; + let func_sig = build_func_sig_str(func_ty, obj.name); + + docs.insert(pkg); + docs.insert(func_sig); + + if !func_ty.doc.is_empty() { + docs.insert(func_ty.doc.clone()); + } + } + _ => {} + } + } _ => { // Variable // ``` @@ -95,6 +128,24 @@ fn docs_to_hover(docs: IndexSet) -> Option { } } +fn build_func_sig_str(func_ty: &FunctionType, name: String) -> String { + let mut result = format!("fn {}(", name); + if func_ty.params.is_empty() { + result.push_str(")"); + } else { + for (i, p) in func_ty.params.iter().enumerate() { + result.push_str(&format!("{}: {}", p.name, p.ty.ty_str())); + + if i != func_ty.params.len() - 1 { + result.push_str(", "); + } + } + result.push_str(")"); + } + result.push_str(&format!(" -> {}", func_ty.return_ty.ty_str())); + result +} + #[cfg(test)] mod tests { use std::path::PathBuf; @@ -232,4 +283,59 @@ mod tests { _ => unreachable!("test error"), } } + + #[test] + #[bench_test] + fn func_def_hover() { + let (file, program, prog_scope, _) = compile_test_file("src/test_data/hover_test/hover.k"); + + let pos = KCLPos { + filename: file.clone(), + line: 22, + column: Some(18), + }; + let got = hover(&program, &pos, &prog_scope).unwrap(); + + match got.contents { + lsp_types::HoverContents::Array(vec) => { + assert_eq!(vec.len(), 3); + if let MarkedString::String(s) = vec[0].clone() { + assert_eq!(s, "Base64\n\n"); + } + if let MarkedString::String(s) = vec[1].clone() { + assert_eq!(s, "fn encode(value: str, encoding: str) -> str"); + } + if let MarkedString::String(s) = vec[2].clone() { + assert_eq!( + s, + "Encode the string `value` using the codec registered for encoding." + ); + } + } + _ => unreachable!("test error"), + } + + let pos = KCLPos { + filename: file.clone(), + line: 23, + column: Some(14), + }; + let got = hover(&program, &pos, &prog_scope).unwrap(); + + match got.contents { + lsp_types::HoverContents::Array(vec) => { + assert_eq!(vec.len(), 3); + if let MarkedString::String(s) = vec[0].clone() { + assert_eq!(s, "Str\n\n"); + } + if let MarkedString::String(s) = vec[1].clone() { + assert_eq!(s, "fn count(sub: str, start: int, end: int) -> int"); + } + if let MarkedString::String(s) = vec[2].clone() { + assert_eq!(s, "Return the number of non-overlapping occurrences of substring sub in the range [start, end]. Optional arguments start and end are interpreted as in slice notation."); + } + } + _ => unreachable!("test error"), + } + } } diff --git a/kclvm/tools/src/LSP/src/test_data/goto_def_test/goto_def.k b/kclvm/tools/src/LSP/src/test_data/goto_def_test/goto_def.k index 431c39fb8..4509975b3 100644 --- a/kclvm/tools/src/LSP/src/test_data/goto_def_test/goto_def.k +++ b/kclvm/tools/src/LSP/src/test_data/goto_def_test/goto_def.k @@ -76,4 +76,4 @@ items1 = [item | { spec.containers: [{ "securityContext": {"capabilities": {"add" += [cc] if cc not in (container?.securityContext?.capabilities?.drop or []) else [] for cc in capabilities}} } for container in item.spec.containers] -} for item in option("items")] \ No newline at end of file +} for item in option("items")] diff --git a/kclvm/tools/src/LSP/src/test_data/hover_test/hover.k b/kclvm/tools/src/LSP/src/test_data/hover_test/hover.k index ac7c53159..dbf79fd84 100644 --- a/kclvm/tools/src/LSP/src/test_data/hover_test/hover.k +++ b/kclvm/tools/src/LSP/src/test_data/hover_test/hover.k @@ -16,4 +16,8 @@ schema Person: p = Person{ name: "Alice" age: 1 -} \ No newline at end of file +} + +import base64 +abdc = base64.encode("1") +abcd = "a".count() From b878ac4f3d2958fbe7dd2c91f7f304ddc284bc1b Mon Sep 17 00:00:00 2001 From: He1pa <18012015693@163.com> Date: Fri, 8 Sep 2023 17:58:13 +0800 Subject: [PATCH 2/3] remove func pkg and show self_ty --- kclvm/sema/src/builtin/decorator.rs | 2 - kclvm/sema/src/builtin/mod.rs | 27 ----- kclvm/sema/src/builtin/string.rs | 30 +----- kclvm/sema/src/builtin/system_module.rs | 138 ++++++++++++------------ kclvm/sema/src/resolver/attr.rs | 1 - kclvm/sema/src/resolver/global.rs | 3 - kclvm/sema/src/resolver/node.rs | 2 +- kclvm/sema/src/ty/constructor.rs | 2 - kclvm/sema/src/ty/mod.rs | 2 - kclvm/tools/src/LSP/src/hover.rs | 20 ++-- 10 files changed, 76 insertions(+), 151 deletions(-) diff --git a/kclvm/sema/src/builtin/decorator.rs b/kclvm/sema/src/builtin/decorator.rs index 69da41cf1..446c36e4e 100644 --- a/kclvm/sema/src/builtin/decorator.rs +++ b/kclvm/sema/src/builtin/decorator.rs @@ -21,7 +21,6 @@ macro_rules! register_decorator { register_decorator! { deprecated => Type::function( - Some("Decorator".to_string()), None, Rc::new(Type::ANY), &[ @@ -54,7 +53,6 @@ register_decorator! { None, ) info => Type::function( - Some("Decorator".to_string()), None, Rc::new(Type::ANY), &[], diff --git a/kclvm/sema/src/builtin/mod.rs b/kclvm/sema/src/builtin/mod.rs index 468b04fd8..4d955bc0c 100644 --- a/kclvm/sema/src/builtin/mod.rs +++ b/kclvm/sema/src/builtin/mod.rs @@ -34,7 +34,6 @@ macro_rules! register_builtin { register_builtin! { option => Type::function( - Some("Builtin".to_string()), None, Rc::new(Type::ANY), &[ @@ -79,7 +78,6 @@ register_builtin! { Some(1), ) print => Type::function( - Some("Builtin".to_string()), None, Rc::new(Type::ANY), &[], @@ -92,7 +90,6 @@ register_builtin! { Some(0), ) multiplyof => Type::function( - Some("Builtin".to_string()), None, Rc::new(Type::BOOL), &[ @@ -112,7 +109,6 @@ register_builtin! { Some(0), ) isunique => Type::function( - Some("Builtin".to_string()), None, Rc::new(Type::BOOL), &[ @@ -127,7 +123,6 @@ register_builtin! { None, ) len => Type::function( - Some("Builtin".to_string()), None, Rc::new(Type::INT), &[ @@ -142,7 +137,6 @@ register_builtin! { None, ) abs => Type::function( - Some("Builtin".to_string()), None, Rc::new(Type::ANY), &[ @@ -157,7 +151,6 @@ register_builtin! { None, ) all_true => Type::function( - Some("Builtin".to_string()), None, Rc::new(Type::BOOL), &[ @@ -174,7 +167,6 @@ register_builtin! { None, ) any_true => Type::function( - Some("Builtin".to_string()), None, Rc::new(Type::BOOL), &[ @@ -191,7 +183,6 @@ register_builtin! { None, ) hex => Type::function( - Some("Builtin".to_string()), None, Rc::new(Type::STR), &[ @@ -206,7 +197,6 @@ register_builtin! { None, ) bin => Type::function( - Some("Builtin".to_string()), None, Rc::new(Type::STR), &[ @@ -221,7 +211,6 @@ register_builtin! { None, ) oct => Type::function( - Some("Builtin".to_string()), None, Rc::new(Type::STR), &[ @@ -236,7 +225,6 @@ register_builtin! { None, ) ord => Type::function( - Some("Builtin".to_string()), None, Rc::new(Type::INT), &[ @@ -251,7 +239,6 @@ register_builtin! { None, ) sorted => Type::function( - Some("Builtin".to_string()), None, Type::list_ref(Rc::new(Type::ANY)), &[ @@ -274,7 +261,6 @@ register_builtin! { Some(1), ) range => Type::function( - Some("Builtin".to_string()), None, Type::list_ref(Rc::new(Type::INT)), &[ @@ -299,7 +285,6 @@ register_builtin! { None, ) max => Type::function( - Some("Builtin".to_string()), None, Rc::new(Type::ANY), &[], @@ -311,7 +296,6 @@ register_builtin! { None, ) min => Type::function( - Some("Builtin".to_string()), None, Rc::new(Type::ANY), &[], @@ -323,7 +307,6 @@ register_builtin! { None, ) sum => Type::function( - Some("Builtin".to_string()), None, Rc::new(Type::ANY), &[ @@ -345,7 +328,6 @@ register_builtin! { None, ) pow => Type::function( - Some("Builtin".to_string()), None, Type::number(), &[ @@ -373,7 +355,6 @@ register_builtin! { None, ) round => Type::function( - Some("Builtin".to_string()), None, Type::number(), &[ @@ -397,7 +378,6 @@ register_builtin! { None, ) zip => Type::function( - Some("Builtin".to_string()), None, Type::list_ref(Rc::new(Type::ANY)), &[], @@ -408,7 +388,6 @@ register_builtin! { None, ) int => Type::function( - Some("Builtin".to_string()), None, Rc::new(Type::INT), &[ @@ -429,7 +408,6 @@ register_builtin! { None, ) float => Type::function( - Some("Builtin".to_string()), None, Rc::new(Type::FLOAT), &[ @@ -444,7 +422,6 @@ register_builtin! { None, ) bool => Type::function( - Some("Builtin".to_string()), None, Rc::new(Type::BOOL), &[ @@ -461,7 +438,6 @@ register_builtin! { None, ) str => Type::function( - Some("Builtin".to_string()), None, Rc::new(Type::STR), &[ @@ -479,7 +455,6 @@ register_builtin! { None, ) list => Type::function( - Some("Builtin".to_string()), None, Type::list_ref(Rc::new(Type::ANY)), &[ @@ -497,7 +472,6 @@ register_builtin! { None, ) dict => Type::function( - Some("Builtin".to_string()), None, Type::dict_ref(Rc::new(Type::ANY), Rc::new(Type::ANY)), &[ @@ -512,7 +486,6 @@ register_builtin! { None, ) typeof => Type::function( - Some("Builtin".to_string()), None, Rc::new(Type::STR), &[ diff --git a/kclvm/sema/src/builtin/string.rs b/kclvm/sema/src/builtin/string.rs index 6e5b6b10c..b551c4799 100644 --- a/kclvm/sema/src/builtin/string.rs +++ b/kclvm/sema/src/builtin/string.rs @@ -17,7 +17,6 @@ macro_rules! register_string_member { register_string_member! { capitalize => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::STR), &[], @@ -26,7 +25,6 @@ register_string_member! { None, ) count => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::INT), &[ @@ -51,7 +49,6 @@ register_string_member! { None, ) endswith => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::BOOL), &[ @@ -76,7 +73,6 @@ register_string_member! { None, ) find => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::INT), &[ @@ -101,7 +97,6 @@ register_string_member! { None, ) format => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::STR), &[], @@ -110,7 +105,6 @@ register_string_member! { None, ) index => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::INT), &[ @@ -135,7 +129,6 @@ register_string_member! { None, ) isalpha => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::BOOL), &[], @@ -144,7 +137,6 @@ register_string_member! { None, ) isalnum => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::BOOL), &[], @@ -153,7 +145,6 @@ register_string_member! { None, ) isdigit => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::BOOL), &[], @@ -162,7 +153,6 @@ register_string_member! { None, ) islower => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::BOOL), &[], @@ -171,7 +161,6 @@ register_string_member! { None, ) isspace => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::BOOL), &[], @@ -180,7 +169,6 @@ register_string_member! { None, ) istitle => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::BOOL), &[], @@ -189,7 +177,6 @@ register_string_member! { None, ) isupper => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::BOOL), &[], @@ -198,7 +185,6 @@ register_string_member! { None, ) join => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::STR), &[ @@ -213,7 +199,6 @@ register_string_member! { None, ) lower => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::STR), &[], @@ -222,7 +207,6 @@ register_string_member! { None, ) upper => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::STR), &[], @@ -231,7 +215,6 @@ register_string_member! { None, ) lstrip => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::STR), &[ @@ -246,7 +229,6 @@ register_string_member! { None, ) rstrip => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::STR), &[ @@ -261,7 +243,6 @@ register_string_member! { None, ) replace => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::STR), &[ @@ -286,7 +267,6 @@ register_string_member! { None, ) removeprefix => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::STR), &[ @@ -301,7 +281,6 @@ register_string_member! { None, ) removesuffix => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::STR), &[ @@ -316,7 +295,6 @@ register_string_member! { None, ) rfind => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::INT), &[ @@ -341,7 +319,6 @@ register_string_member! { None, ) rindex => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::INT), &[ @@ -366,7 +343,6 @@ register_string_member! { None, ) rsplit => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Type::list_ref(Rc::new(Type::STR)), &[ @@ -386,7 +362,6 @@ register_string_member! { None, ) split => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Type::list_ref(Rc::new(Type::STR)), &[ @@ -406,7 +381,6 @@ register_string_member! { None, ) splitlines => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Type::list_ref(Rc::new(Type::STR)), &[ @@ -421,7 +395,6 @@ register_string_member! { None, ) startswith => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::BOOL), &[ @@ -446,7 +419,7 @@ register_string_member! { None, ) strip => Type::function( - Some("Str".to_string()), + Some(Rc::new(Type::STR)), Rc::new(Type::STR), &[ @@ -461,7 +434,6 @@ register_string_member! { None, ) title => Type::function( - Some("Str".to_string()), Some(Rc::new(Type::STR)), Rc::new(Type::STR), &[], diff --git a/kclvm/sema/src/builtin/system_module.rs b/kclvm/sema/src/builtin/system_module.rs index 8b1d42d9d..c95ed30bd 100644 --- a/kclvm/sema/src/builtin/system_module.rs +++ b/kclvm/sema/src/builtin/system_module.rs @@ -23,7 +23,6 @@ macro_rules! register_base64_member { } register_base64_member! { encode => Type::function( - Some("Base64".to_string()), None, Type::str_ref(), &[ @@ -43,7 +42,6 @@ register_base64_member! { None, ) decode => Type::function( - Some("Base64".to_string()), None, Type::str_ref(), &[ @@ -98,7 +96,6 @@ macro_rules! register_net_member { } register_net_member! { split_host_port => Type::function( - Some("Net".to_string()), None, Type::list_ref(Type::str_ref()), &[ @@ -113,7 +110,6 @@ register_net_member! { None, ) join_host_port => Type::function( - Some("Net".to_string()), None, Type::str_ref(), &[ @@ -133,7 +129,7 @@ register_net_member! { None, ) fqdn => Type::function( - Some("Net".to_string()), + None, Type::str_ref(), &[ @@ -148,7 +144,7 @@ register_net_member! { None, ) parse_IP => Type::function( - Some("Net".to_string()), + None, Type::str_ref(), &[ @@ -163,7 +159,7 @@ register_net_member! { None, ) IP_string => Type::function( - Some("Net".to_string()), + None, Type::str_ref(), &[ @@ -178,7 +174,7 @@ register_net_member! { None, ) to_IP4 => Type::function( - Some("Net".to_string()), + None, Type::str_ref(), &[ @@ -193,7 +189,7 @@ register_net_member! { None, ) to_IP16 => Type::function( - Some("Net".to_string()), + None, Type::str_ref(), &[ @@ -208,7 +204,7 @@ register_net_member! { None, ) is_IPv4 => Type::function( - Some("Net".to_string()), + None, Type::bool_ref(), &[ @@ -223,7 +219,7 @@ register_net_member! { None, ) is_IP =>Type::function( - Some("Net".to_string()), + None, Type::bool_ref(), &[ @@ -238,7 +234,7 @@ register_net_member! { None, ) is_loopback_IP =>Type::function( - Some("Net".to_string()), + None, Type::bool_ref(), &[ @@ -253,7 +249,7 @@ register_net_member! { None, ) is_multicast_IP =>Type::function( - Some("Net".to_string()), + None, Type::bool_ref(), &[ @@ -268,7 +264,7 @@ register_net_member! { None, ) is_interface_local_multicast_IP => Type::function( - Some("Net".to_string()), + None, Type::bool_ref(), &[ @@ -283,7 +279,7 @@ register_net_member! { None, ) is_link_local_multicast_IP =>Type::function( - Some("Net".to_string()), + None, Type::bool_ref(), &[ @@ -298,7 +294,7 @@ register_net_member! { None, ) is_link_local_unicast_IP =>Type::function( - Some("Net".to_string()), + None, Type::bool_ref(), &[ @@ -313,7 +309,7 @@ register_net_member! { None, ) is_global_unicast_IP =>Type::function( - Some("Net".to_string()), + None, Type::bool_ref(), &[ @@ -328,7 +324,7 @@ register_net_member! { None, ) is_unspecified_IP => Type::function( - Some("Net".to_string()), + None, Type::bool_ref(), &[ @@ -361,7 +357,7 @@ macro_rules! register_manifests_member { } register_manifests_member! { yaml_stream => Type::function( - Some("Yaml Stream".to_string()), + None, Type::any_ref(), &[ @@ -423,7 +419,7 @@ macro_rules! register_math_member { } register_math_member! { ceil => Type::function( - Some("Math".to_string()), + None, Type::int_ref(), &[ @@ -438,7 +434,7 @@ register_math_member! { None, ) factorial => Type::function( - Some("Math".to_string()), + None, Type::int_ref(), &[ @@ -453,7 +449,7 @@ register_math_member! { None, ) floor => Type::function( - Some("Math".to_string()), + None, Type::int_ref(), &[ @@ -468,7 +464,7 @@ register_math_member! { None, ) gcd => Type::function( - Some("Math".to_string()), + None, Type::int_ref(), &[ @@ -488,7 +484,7 @@ register_math_member! { None, ) isfinite => Type::function( - Some("Math".to_string()), + None, Type::bool_ref(), &[ @@ -503,7 +499,7 @@ register_math_member! { None, ) isinf => Type::function( - Some("Math".to_string()), + None, Type::bool_ref(), &[ @@ -518,7 +514,7 @@ register_math_member! { None, ) isnan => Type::function( - Some("Math".to_string()), + None, Type::bool_ref(), &[ @@ -533,7 +529,7 @@ register_math_member! { None, ) modf => Type::function( - Some("Math".to_string()), + None, Type::list_ref(Type::float_ref()), &[ @@ -548,7 +544,7 @@ register_math_member! { None, ) exp => Type::function( - Some("Math".to_string()), + None, Type::float_ref(), &[ @@ -563,7 +559,7 @@ register_math_member! { None, ) expm1 => Type::function( - Some("Math".to_string()), + None, Type::float_ref(), &[ @@ -578,7 +574,7 @@ register_math_member! { None, ) log => Type::function( - Some("Math".to_string()), + None, Type::float_ref(), &[ @@ -598,7 +594,7 @@ register_math_member! { None, ) log1p => Type::function( - Some("Math".to_string()), + None, Type::float_ref(), &[ @@ -613,7 +609,7 @@ register_math_member! { None, ) log2 => Type::function( - Some("Math".to_string()), + None, Type::float_ref(), &[ @@ -628,7 +624,7 @@ register_math_member! { None, ) log10 => Type::function( - Some("Math".to_string()), + None, Type::float_ref(), &[ @@ -643,7 +639,7 @@ register_math_member! { None, ) pow => Type::function( - Some("Math".to_string()), + None, Type::float_ref(), &[ @@ -663,7 +659,7 @@ register_math_member! { None, ) sqrt => Type::function( - Some("Math".to_string()), + None, Type::float_ref(), &[ @@ -696,7 +692,7 @@ macro_rules! register_datetime_member { } register_datetime_member! { ticks => Type::function( - Some("Datatime".to_string()), + None, Type::float_ref(), &[], @@ -705,7 +701,7 @@ register_datetime_member! { None, ) date => Type::function( - Some("Datatime".to_string()), + None, Type::str_ref(), &[], @@ -714,7 +710,7 @@ register_datetime_member! { None, ) now => Type::function( - Some("Datatime".to_string()), + None, Type::str_ref(), &[], @@ -723,7 +719,7 @@ register_datetime_member! { None, ) today => Type::function( - Some("Datatime".to_string()), + None, Type::str_ref(), &[], @@ -751,7 +747,7 @@ macro_rules! register_regex_member { } register_regex_member! { replace => Type::function( - Some("Regex".to_string()), + None, Type::str_ref(), &[ @@ -781,7 +777,7 @@ register_regex_member! { None, ) match => Type::function( - Some("Regex".to_string()), + None, Type::bool_ref(), &[ @@ -801,7 +797,7 @@ register_regex_member! { None, ) compile => Type::function( - Some("Regex".to_string()), + None, Type::bool_ref(), &[ @@ -816,7 +812,7 @@ register_regex_member! { None, ) findall => Type::function( - Some("Regex".to_string()), + None, Type::list_ref(Type::str_ref()), &[ @@ -836,7 +832,7 @@ register_regex_member! { None, ) search => Type::function( - Some("Regex".to_string()), + None, Type::bool_ref(), &[ @@ -856,7 +852,7 @@ register_regex_member! { None, ) split => Type::function( - Some("Regex".to_string()), + None, Type::list_ref(Type::str_ref()), &[ @@ -899,7 +895,7 @@ macro_rules! register_yaml_member { } register_yaml_member! { encode => Type::function( - Some("Yaml".to_string()), + None, Type::str_ref(), &[ @@ -929,7 +925,7 @@ register_yaml_member! { Some(1), ) decode => Type::function( - Some("Yaml".to_string()), + None, Type::any_ref(), &[ @@ -944,7 +940,7 @@ register_yaml_member! { None, ) dump_to_file => Type::function( - Some("Yaml".to_string()), + None, Type::str_ref(), &[ @@ -997,7 +993,7 @@ macro_rules! register_json_member { } register_json_member! { encode => Type::function( - Some("Json".to_string()), + None, Type::str_ref(), &[ @@ -1032,7 +1028,7 @@ register_json_member! { Some(1), ) decode => Type::function( - Some("Json".to_string()), + None, Type::any_ref(), &[ @@ -1047,7 +1043,7 @@ register_json_member! { None, ) dump_to_file => Type::function( - Some("Json".to_string()), + None, Type::str_ref(), &[ @@ -1105,7 +1101,7 @@ macro_rules! register_crypto_member { } register_crypto_member! { md5 => Type::function( - Some("Crypto".to_string()), + None, Type::str_ref(), &[ @@ -1125,7 +1121,7 @@ register_crypto_member! { None, ) sha1 => Type::function( - Some("Crypto".to_string()), + None, Type::str_ref(), &[ @@ -1145,7 +1141,7 @@ register_crypto_member! { None, ) sha224 => Type::function( - Some("Crypto".to_string()), + None, Type::str_ref(), &[ @@ -1165,7 +1161,7 @@ register_crypto_member! { None, ) sha256 => Type::function( - Some("Crypto".to_string()), + None, Type::str_ref(), &[ @@ -1185,7 +1181,7 @@ register_crypto_member! { None, ) sha384 => Type::function( - Some("Crypto".to_string()), + None, Type::str_ref(), &[ @@ -1205,7 +1201,7 @@ register_crypto_member! { None, ) sha512 => Type::function( - Some("Crypto".to_string()), + None, Type::str_ref(), &[ @@ -1278,7 +1274,7 @@ register_units_member! { Ti => Type::INT Pi => Type::INT to_n => Type::function( - Some("Units".to_string()), + None, Type::str_ref(), &[ @@ -1293,7 +1289,7 @@ register_units_member! { None, ) to_u => Type::function( - Some("Units".to_string()), + None, Type::str_ref(), &[ @@ -1308,7 +1304,7 @@ register_units_member! { None, ) to_m => Type::function( - Some("Units".to_string()), + None, Type::str_ref(), &[ @@ -1323,7 +1319,7 @@ register_units_member! { None, ) to_K => Type::function( - Some("Units".to_string()), + None, Type::str_ref(), &[ @@ -1338,7 +1334,7 @@ register_units_member! { None, ) to_M => Type::function( - Some("Units".to_string()), + None, Type::str_ref(), &[ @@ -1353,7 +1349,7 @@ register_units_member! { None, ) to_G => Type::function( - Some("Units".to_string()), + None, Type::str_ref(), &[ @@ -1368,7 +1364,7 @@ register_units_member! { None, ) to_T => Type::function( - Some("Units".to_string()), + None, Type::str_ref(), &[ @@ -1383,7 +1379,7 @@ register_units_member! { None, ) to_P => Type::function( - Some("Units".to_string()), + None, Type::str_ref(), &[ @@ -1398,7 +1394,7 @@ register_units_member! { None, ) to_Ki => Type::function( - Some("Units".to_string()), + None, Type::str_ref(), &[ @@ -1413,7 +1409,7 @@ register_units_member! { None, ) to_Mi => Type::function( - Some("Units".to_string()), + None, Type::str_ref(), &[ @@ -1428,7 +1424,7 @@ register_units_member! { None, ) to_Gi => Type::function( - Some("Units".to_string()), + None, Type::str_ref(), &[ @@ -1443,7 +1439,7 @@ register_units_member! { None, ) to_Ti => Type::function( - Some("Units".to_string()), + None, Type::str_ref(), &[ @@ -1458,7 +1454,7 @@ register_units_member! { None, ) to_Pi => Type::function( - Some("Units".to_string()), + None, Type::str_ref(), &[ @@ -1491,7 +1487,7 @@ macro_rules! register_collection_member { } register_collection_member! { union_all => Type::function( - Some("Collection".to_string()), + None, Type::any_ref(), &[ diff --git a/kclvm/sema/src/resolver/attr.rs b/kclvm/sema/src/resolver/attr.rs index bd570a739..3e22f4d3c 100644 --- a/kclvm/sema/src/resolver/attr.rs +++ b/kclvm/sema/src/resolver/attr.rs @@ -68,7 +68,6 @@ impl<'ctx> Resolver<'ctx> { ( true, Rc::new(Type::function( - Some("Schema".to_string()), Some(obj.clone()), Type::list_ref(self.any_ty()), &[], diff --git a/kclvm/sema/src/resolver/global.rs b/kclvm/sema/src/resolver/global.rs index 779e74cc8..34527a564 100644 --- a/kclvm/sema/src/resolver/global.rs +++ b/kclvm/sema/src/resolver/global.rs @@ -77,7 +77,6 @@ impl<'ctx> Resolver<'ctx> { mixins: vec![], attrs: IndexMap::default(), func: Box::new(FunctionType { - pkg: None, doc: parsed_doc.summary.clone(), params: vec![], self_ty: None, @@ -824,7 +823,6 @@ impl<'ctx> Resolver<'ctx> { mixins: mixin_types, attrs: attr_obj_map, func: Box::new(FunctionType { - pkg: None, doc: parsed_doc.summary.clone(), params, self_ty: None, @@ -934,7 +932,6 @@ impl<'ctx> Resolver<'ctx> { mixins: parent_types, attrs: IndexMap::default(), func: Box::new(FunctionType { - pkg: None, doc: rule_stmt.doc.clone(), params, self_ty: None, diff --git a/kclvm/sema/src/resolver/node.rs b/kclvm/sema/src/resolver/node.rs index 8d27ab688..7c2d7565f 100644 --- a/kclvm/sema/src/resolver/node.rs +++ b/kclvm/sema/src/resolver/node.rs @@ -990,7 +990,7 @@ impl<'ctx> MutSelfTypedResultWalker<'ctx> for Resolver<'ctx> { if !real_ret_ty.is_any() && ret_ty.is_any() && lambda_expr.return_type_str.is_none() { ret_ty = real_ret_ty; } - Rc::new(Type::function(None, None, ret_ty, ¶ms, "", false, None)) + Rc::new(Type::function(None, ret_ty, ¶ms, "", false, None)) } fn walk_keyword(&mut self, keyword: &'ctx ast::Keyword) -> Self::Result { diff --git a/kclvm/sema/src/ty/constructor.rs b/kclvm/sema/src/ty/constructor.rs index eb59fbd44..b6c37e97b 100644 --- a/kclvm/sema/src/ty/constructor.rs +++ b/kclvm/sema/src/ty/constructor.rs @@ -173,7 +173,6 @@ impl Type { /// Construct a function type. #[inline] pub fn function( - pkg: Option, self_ty: Option>, return_ty: Rc, params: &[Parameter], @@ -183,7 +182,6 @@ impl Type { ) -> Type { Type { kind: TypeKind::Function(FunctionType { - pkg, doc: doc.to_string(), params: params.to_owned(), self_ty, diff --git a/kclvm/sema/src/ty/mod.rs b/kclvm/sema/src/ty/mod.rs index 048dccd44..b193e387a 100644 --- a/kclvm/sema/src/ty/mod.rs +++ b/kclvm/sema/src/ty/mod.rs @@ -375,7 +375,6 @@ impl NumberMultiplierType { /// The function type. #[derive(Debug, Clone, PartialEq)] pub struct FunctionType { - pub pkg: Option, pub doc: String, pub params: Vec, pub self_ty: Option, @@ -388,7 +387,6 @@ impl FunctionType { #[inline] pub fn variadic_func() -> Self { Self { - pkg: None, doc: "".to_string(), params: vec![], self_ty: None, diff --git a/kclvm/tools/src/LSP/src/hover.rs b/kclvm/tools/src/LSP/src/hover.rs index a18d5e212..ac1832c6c 100644 --- a/kclvm/tools/src/LSP/src/hover.rs +++ b/kclvm/tools/src/LSP/src/hover.rs @@ -72,14 +72,11 @@ pub(crate) fn hover( // if let Some(pkg) = &func_ty.pkg{ // docs.insert(pkg.clone()); // } - let pkg = if let Some(pkg) = &func_ty.pkg { - format!("{}\n\n", pkg) - } else { - "".to_string() - }; + if let Some(ty) = &func_ty.self_ty { + let self_ty = format!("{}\n\n", ty.ty_str()); + docs.insert(self_ty); + } let func_sig = build_func_sig_str(func_ty, obj.name); - - docs.insert(pkg); docs.insert(func_sig); if !func_ty.doc.is_empty() { @@ -298,14 +295,11 @@ mod tests { match got.contents { lsp_types::HoverContents::Array(vec) => { - assert_eq!(vec.len(), 3); + assert_eq!(vec.len(), 2); if let MarkedString::String(s) = vec[0].clone() { - assert_eq!(s, "Base64\n\n"); - } - if let MarkedString::String(s) = vec[1].clone() { assert_eq!(s, "fn encode(value: str, encoding: str) -> str"); } - if let MarkedString::String(s) = vec[2].clone() { + if let MarkedString::String(s) = vec[1].clone() { assert_eq!( s, "Encode the string `value` using the codec registered for encoding." @@ -326,7 +320,7 @@ mod tests { lsp_types::HoverContents::Array(vec) => { assert_eq!(vec.len(), 3); if let MarkedString::String(s) = vec[0].clone() { - assert_eq!(s, "Str\n\n"); + assert_eq!(s, "str\n\n"); } if let MarkedString::String(s) = vec[1].clone() { assert_eq!(s, "fn count(sub: str, start: int, end: int) -> int"); From f382baa5dc89b7076b5614f46e0ad85c7c0ffa50 Mon Sep 17 00:00:00 2001 From: He1pa <18012015693@163.com> Date: Mon, 11 Sep 2023 12:01:54 +0800 Subject: [PATCH 3/3] use a function to encapsulate the display style of function signatures and schema definition --- kclvm/sema/src/builtin/string.rs | 1 - kclvm/sema/src/builtin/system_module.rs | 67 ----------- kclvm/tools/src/LSP/src/hover.rs | 141 ++++++++++++------------ 3 files changed, 73 insertions(+), 136 deletions(-) diff --git a/kclvm/sema/src/builtin/string.rs b/kclvm/sema/src/builtin/string.rs index b551c4799..2e636abeb 100644 --- a/kclvm/sema/src/builtin/string.rs +++ b/kclvm/sema/src/builtin/string.rs @@ -419,7 +419,6 @@ register_string_member! { None, ) strip => Type::function( - Some(Rc::new(Type::STR)), Rc::new(Type::STR), &[ diff --git a/kclvm/sema/src/builtin/system_module.rs b/kclvm/sema/src/builtin/system_module.rs index c95ed30bd..da8f59513 100644 --- a/kclvm/sema/src/builtin/system_module.rs +++ b/kclvm/sema/src/builtin/system_module.rs @@ -129,7 +129,6 @@ register_net_member! { None, ) fqdn => Type::function( - None, Type::str_ref(), &[ @@ -144,7 +143,6 @@ register_net_member! { None, ) parse_IP => Type::function( - None, Type::str_ref(), &[ @@ -159,7 +157,6 @@ register_net_member! { None, ) IP_string => Type::function( - None, Type::str_ref(), &[ @@ -174,7 +171,6 @@ register_net_member! { None, ) to_IP4 => Type::function( - None, Type::str_ref(), &[ @@ -189,7 +185,6 @@ register_net_member! { None, ) to_IP16 => Type::function( - None, Type::str_ref(), &[ @@ -204,7 +199,6 @@ register_net_member! { None, ) is_IPv4 => Type::function( - None, Type::bool_ref(), &[ @@ -219,7 +213,6 @@ register_net_member! { None, ) is_IP =>Type::function( - None, Type::bool_ref(), &[ @@ -234,7 +227,6 @@ register_net_member! { None, ) is_loopback_IP =>Type::function( - None, Type::bool_ref(), &[ @@ -249,7 +241,6 @@ register_net_member! { None, ) is_multicast_IP =>Type::function( - None, Type::bool_ref(), &[ @@ -264,7 +255,6 @@ register_net_member! { None, ) is_interface_local_multicast_IP => Type::function( - None, Type::bool_ref(), &[ @@ -279,7 +269,6 @@ register_net_member! { None, ) is_link_local_multicast_IP =>Type::function( - None, Type::bool_ref(), &[ @@ -294,7 +283,6 @@ register_net_member! { None, ) is_link_local_unicast_IP =>Type::function( - None, Type::bool_ref(), &[ @@ -309,7 +297,6 @@ register_net_member! { None, ) is_global_unicast_IP =>Type::function( - None, Type::bool_ref(), &[ @@ -324,7 +311,6 @@ register_net_member! { None, ) is_unspecified_IP => Type::function( - None, Type::bool_ref(), &[ @@ -357,7 +343,6 @@ macro_rules! register_manifests_member { } register_manifests_member! { yaml_stream => Type::function( - None, Type::any_ref(), &[ @@ -419,7 +404,6 @@ macro_rules! register_math_member { } register_math_member! { ceil => Type::function( - None, Type::int_ref(), &[ @@ -434,7 +418,6 @@ register_math_member! { None, ) factorial => Type::function( - None, Type::int_ref(), &[ @@ -449,7 +432,6 @@ register_math_member! { None, ) floor => Type::function( - None, Type::int_ref(), &[ @@ -464,7 +446,6 @@ register_math_member! { None, ) gcd => Type::function( - None, Type::int_ref(), &[ @@ -484,7 +465,6 @@ register_math_member! { None, ) isfinite => Type::function( - None, Type::bool_ref(), &[ @@ -499,7 +479,6 @@ register_math_member! { None, ) isinf => Type::function( - None, Type::bool_ref(), &[ @@ -514,7 +493,6 @@ register_math_member! { None, ) isnan => Type::function( - None, Type::bool_ref(), &[ @@ -529,7 +507,6 @@ register_math_member! { None, ) modf => Type::function( - None, Type::list_ref(Type::float_ref()), &[ @@ -544,7 +521,6 @@ register_math_member! { None, ) exp => Type::function( - None, Type::float_ref(), &[ @@ -559,7 +535,6 @@ register_math_member! { None, ) expm1 => Type::function( - None, Type::float_ref(), &[ @@ -574,7 +549,6 @@ register_math_member! { None, ) log => Type::function( - None, Type::float_ref(), &[ @@ -594,7 +568,6 @@ register_math_member! { None, ) log1p => Type::function( - None, Type::float_ref(), &[ @@ -609,7 +582,6 @@ register_math_member! { None, ) log2 => Type::function( - None, Type::float_ref(), &[ @@ -624,7 +596,6 @@ register_math_member! { None, ) log10 => Type::function( - None, Type::float_ref(), &[ @@ -639,7 +610,6 @@ register_math_member! { None, ) pow => Type::function( - None, Type::float_ref(), &[ @@ -659,7 +629,6 @@ register_math_member! { None, ) sqrt => Type::function( - None, Type::float_ref(), &[ @@ -692,7 +661,6 @@ macro_rules! register_datetime_member { } register_datetime_member! { ticks => Type::function( - None, Type::float_ref(), &[], @@ -701,7 +669,6 @@ register_datetime_member! { None, ) date => Type::function( - None, Type::str_ref(), &[], @@ -710,7 +677,6 @@ register_datetime_member! { None, ) now => Type::function( - None, Type::str_ref(), &[], @@ -719,7 +685,6 @@ register_datetime_member! { None, ) today => Type::function( - None, Type::str_ref(), &[], @@ -747,7 +712,6 @@ macro_rules! register_regex_member { } register_regex_member! { replace => Type::function( - None, Type::str_ref(), &[ @@ -777,7 +741,6 @@ register_regex_member! { None, ) match => Type::function( - None, Type::bool_ref(), &[ @@ -797,7 +760,6 @@ register_regex_member! { None, ) compile => Type::function( - None, Type::bool_ref(), &[ @@ -812,7 +774,6 @@ register_regex_member! { None, ) findall => Type::function( - None, Type::list_ref(Type::str_ref()), &[ @@ -832,7 +793,6 @@ register_regex_member! { None, ) search => Type::function( - None, Type::bool_ref(), &[ @@ -852,7 +812,6 @@ register_regex_member! { None, ) split => Type::function( - None, Type::list_ref(Type::str_ref()), &[ @@ -895,7 +854,6 @@ macro_rules! register_yaml_member { } register_yaml_member! { encode => Type::function( - None, Type::str_ref(), &[ @@ -925,7 +883,6 @@ register_yaml_member! { Some(1), ) decode => Type::function( - None, Type::any_ref(), &[ @@ -940,7 +897,6 @@ register_yaml_member! { None, ) dump_to_file => Type::function( - None, Type::str_ref(), &[ @@ -993,7 +949,6 @@ macro_rules! register_json_member { } register_json_member! { encode => Type::function( - None, Type::str_ref(), &[ @@ -1028,7 +983,6 @@ register_json_member! { Some(1), ) decode => Type::function( - None, Type::any_ref(), &[ @@ -1043,7 +997,6 @@ register_json_member! { None, ) dump_to_file => Type::function( - None, Type::str_ref(), &[ @@ -1101,7 +1054,6 @@ macro_rules! register_crypto_member { } register_crypto_member! { md5 => Type::function( - None, Type::str_ref(), &[ @@ -1121,7 +1073,6 @@ register_crypto_member! { None, ) sha1 => Type::function( - None, Type::str_ref(), &[ @@ -1141,7 +1092,6 @@ register_crypto_member! { None, ) sha224 => Type::function( - None, Type::str_ref(), &[ @@ -1161,7 +1111,6 @@ register_crypto_member! { None, ) sha256 => Type::function( - None, Type::str_ref(), &[ @@ -1181,7 +1130,6 @@ register_crypto_member! { None, ) sha384 => Type::function( - None, Type::str_ref(), &[ @@ -1201,7 +1149,6 @@ register_crypto_member! { None, ) sha512 => Type::function( - None, Type::str_ref(), &[ @@ -1274,7 +1221,6 @@ register_units_member! { Ti => Type::INT Pi => Type::INT to_n => Type::function( - None, Type::str_ref(), &[ @@ -1289,7 +1235,6 @@ register_units_member! { None, ) to_u => Type::function( - None, Type::str_ref(), &[ @@ -1304,7 +1249,6 @@ register_units_member! { None, ) to_m => Type::function( - None, Type::str_ref(), &[ @@ -1319,7 +1263,6 @@ register_units_member! { None, ) to_K => Type::function( - None, Type::str_ref(), &[ @@ -1334,7 +1277,6 @@ register_units_member! { None, ) to_M => Type::function( - None, Type::str_ref(), &[ @@ -1349,7 +1291,6 @@ register_units_member! { None, ) to_G => Type::function( - None, Type::str_ref(), &[ @@ -1364,7 +1305,6 @@ register_units_member! { None, ) to_T => Type::function( - None, Type::str_ref(), &[ @@ -1379,7 +1319,6 @@ register_units_member! { None, ) to_P => Type::function( - None, Type::str_ref(), &[ @@ -1394,7 +1333,6 @@ register_units_member! { None, ) to_Ki => Type::function( - None, Type::str_ref(), &[ @@ -1409,7 +1347,6 @@ register_units_member! { None, ) to_Mi => Type::function( - None, Type::str_ref(), &[ @@ -1424,7 +1361,6 @@ register_units_member! { None, ) to_Gi => Type::function( - None, Type::str_ref(), &[ @@ -1439,7 +1375,6 @@ register_units_member! { None, ) to_Ti => Type::function( - None, Type::str_ref(), &[ @@ -1454,7 +1389,6 @@ register_units_member! { None, ) to_Pi => Type::function( - None, Type::str_ref(), &[ @@ -1487,7 +1421,6 @@ macro_rules! register_collection_member { } register_collection_member! { union_all => Type::function( - None, Type::any_ref(), &[ diff --git a/kclvm/tools/src/LSP/src/hover.rs b/kclvm/tools/src/LSP/src/hover.rs index ac1832c6c..ac8554d5b 100644 --- a/kclvm/tools/src/LSP/src/hover.rs +++ b/kclvm/tools/src/LSP/src/hover.rs @@ -1,9 +1,8 @@ -use indexmap::IndexSet; use kclvm_ast::ast::Program; use kclvm_error::Position as KCLPos; use kclvm_sema::{ resolver::scope::{ProgramScope, ScopeObjectKind}, - ty::FunctionType, + ty::{FunctionType, SchemaType}, }; use lsp_types::{Hover, HoverContents, MarkedString}; @@ -18,70 +17,18 @@ pub(crate) fn hover( ) -> Option { match program.pos_to_stmt(kcl_pos) { Some(node) => { - let mut docs: IndexSet = IndexSet::new(); + let mut docs: Vec = vec![]; if let Some(def) = find_def(node, kcl_pos, prog_scope) { if let crate::goto_def::Definition::Object(obj) = def { match obj.kind { ScopeObjectKind::Definition => { - // Schema Definition hover - // ``` - // pkg - // schema Foo(Base) - // ----------------- - // doc - // ----------------- - // Attributes: - // attr1: type - // attr2? type - // ``` - let schema_ty = obj.ty.into_schema_type(); - let base: String = if let Some(base) = schema_ty.base { - format!("({})", base.name) - } else { - "".to_string() - }; - docs.insert(format!( - "{}\n\nschema {}{}", - schema_ty.pkgpath, schema_ty.name, base - )); - if !schema_ty.doc.is_empty() { - docs.insert(schema_ty.doc.clone()); - } - let mut attrs = vec!["Attributes:".to_string()]; - for (name, attr) in schema_ty.attrs { - attrs.push(format!( - "{}{}:{}", - name, - if attr.is_optional { "?" } else { "" }, - format!(" {}", attr.ty.ty_str()), - )); - } - docs.insert(attrs.join("\n\n")); + docs.extend(build_schema_hover_content(&obj.ty.into_schema_type())) } ScopeObjectKind::FunctionCall => { let ty = obj.ty.clone(); match &ty.kind { kclvm_sema::ty::TypeKind::Function(func_ty) => { - // system package function - // ``` - // pkg - // function func_name(arg1: type, arg2: type, ..) -> type - // ----------------- - // doc - // ``` - // if let Some(pkg) = &func_ty.pkg{ - // docs.insert(pkg.clone()); - // } - if let Some(ty) = &func_ty.self_ty { - let self_ty = format!("{}\n\n", ty.ty_str()); - docs.insert(self_ty); - } - let func_sig = build_func_sig_str(func_ty, obj.name); - docs.insert(func_sig); - - if !func_ty.doc.is_empty() { - docs.insert(func_ty.doc.clone()); - } + docs.extend(build_func_hover_content(func_ty, obj.name)) } _ => {} } @@ -91,9 +38,9 @@ pub(crate) fn hover( // ``` // name: type //``` - docs.insert(format!("{}: {}", obj.name, obj.ty.ty_str())); + docs.push(format!("{}: {}", obj.name, obj.ty.ty_str())); if let Some(doc) = obj.doc { - docs.insert(doc); + docs.push(doc); } } } @@ -107,7 +54,7 @@ pub(crate) fn hover( // Convert docs to Hover. This function will convert to // None, Scalar or Array according to the number of positions -fn docs_to_hover(docs: IndexSet) -> Option { +fn docs_to_hover(docs: Vec) -> Option { match docs.len() { 0 => None, 1 => Some(Hover { @@ -125,22 +72,80 @@ fn docs_to_hover(docs: IndexSet) -> Option { } } -fn build_func_sig_str(func_ty: &FunctionType, name: String) -> String { - let mut result = format!("fn {}(", name); +// Build hover content for schema definition +// Schema Definition hover +// ``` +// pkg +// schema Foo(Base) +// ----------------- +// doc +// ----------------- +// Attributes: +// attr1: type +// attr2? type +// ``` +fn build_schema_hover_content(schema_ty: &SchemaType) -> Vec { + let mut docs = vec![]; + let base: String = if let Some(base) = &schema_ty.base { + format!("({})", base.name) + } else { + "".to_string() + }; + docs.push(format!( + "{}\n\nschema {}{}", + schema_ty.pkgpath, schema_ty.name, base + )); + if !schema_ty.doc.is_empty() { + docs.push(schema_ty.doc.clone()); + } + let mut attrs = vec!["Attributes:".to_string()]; + for (name, attr) in &schema_ty.attrs { + attrs.push(format!( + "{}{}:{}", + name, + if attr.is_optional { "?" } else { "" }, + format!(" {}", attr.ty.ty_str()), + )); + } + docs.push(attrs.join("\n\n")); + docs +} + +// Build hover content for function call +// ``` +// pkg +// ----------------- +// function func_name(arg1: type, arg2: type, ..) -> type +// ----------------- +// doc +// ``` +fn build_func_hover_content(func_ty: &FunctionType, name: String) -> Vec { + let mut docs = vec![]; + if let Some(ty) = &func_ty.self_ty { + let self_ty = format!("{}\n\n", ty.ty_str()); + docs.push(self_ty); + } + + let mut sig = format!("fn {}(", name); if func_ty.params.is_empty() { - result.push_str(")"); + sig.push_str(")"); } else { for (i, p) in func_ty.params.iter().enumerate() { - result.push_str(&format!("{}: {}", p.name, p.ty.ty_str())); + sig.push_str(&format!("{}: {}", p.name, p.ty.ty_str())); if i != func_ty.params.len() - 1 { - result.push_str(", "); + sig.push_str(", "); } } - result.push_str(")"); + sig.push_str(")"); + } + sig.push_str(&format!(" -> {}", func_ty.return_ty.ty_str())); + docs.push(sig); + + if !func_ty.doc.is_empty() { + docs.push(func_ty.doc.clone()); } - result.push_str(&format!(" -> {}", func_ty.return_ty.ty_str())); - result + docs } #[cfg(test)]