@@ -15,6 +15,7 @@ use rowan::NodeOrToken;
1515
1616use rowan:: TokenAtOffset ;
1717
18+ use crate :: handlers:: completion:: extract_index_member_alias;
1819use crate :: handlers:: definition:: compare_function_types;
1920use crate :: handlers:: inlay_hint:: build_function_hint:: { build_closure_hint, build_label_parts} ;
2021
@@ -37,6 +38,9 @@ pub fn build_inlay_hints(semantic_model: &SemanticModel) -> Option<Vec<InlayHint
3738 LuaAst :: LuaFuncStat ( func_stat) => {
3839 build_func_stat_override_hint ( semantic_model, & mut result, func_stat) ;
3940 }
41+ LuaAst :: LuaIndexExpr ( index_expr) => {
42+ build_index_expr_hint ( semantic_model, & mut result, index_expr) ;
43+ }
4044 _ => { }
4145 }
4246 }
@@ -612,3 +616,57 @@ fn find_match_meta_call_operator_id(
612616 }
613617 operator_ids. first ( ) . cloned ( ) . map ( |id| ( id, call_func) )
614618}
619+
620+ fn build_index_expr_hint (
621+ semantic_model : & SemanticModel ,
622+ result : & mut Vec < InlayHint > ,
623+ index_expr : LuaIndexExpr ,
624+ ) -> Option < ( ) > {
625+ if !semantic_model. get_emmyrc ( ) . hint . index_hint {
626+ return Some ( ( ) ) ;
627+ }
628+
629+ // 只处理整数索引
630+ let index_key = index_expr. get_index_key ( ) ?;
631+
632+ // 获取前缀表达式的类型信息
633+ let prefix_expr = index_expr. get_prefix_expr ( ) ?;
634+ let prefix_type = semantic_model. infer_expr ( prefix_expr. into ( ) ) . ok ( ) ?;
635+ let member_key = semantic_model. get_member_key ( & index_key) ?;
636+ let member_infos = semantic_model. get_member_infos ( & prefix_type) ?;
637+ let member_info = member_infos. iter ( ) . find ( |m| m. key == member_key) ?;
638+ // 尝试提取别名
639+ let alias = extract_index_member_alias ( semantic_model. get_db ( ) , member_info) ?;
640+ // 创建 hint
641+ let document = semantic_model. get_document ( ) ;
642+ let position = {
643+ let index_token = index_expr. get_index_name_token ( ) ?;
644+ let range = index_token. text_range ( ) ;
645+ let lsp_range = document. to_lsp_range ( range) ?;
646+ lsp_range. end
647+ } ;
648+
649+ let label_location = {
650+ let range = index_expr. get_index_key ( ) ?. get_range ( ) ?;
651+ let lsp_range = document. to_lsp_range ( range) ?;
652+ Location :: new ( document. get_uri ( ) , lsp_range)
653+ } ;
654+
655+ let hint = InlayHint {
656+ kind : Some ( InlayHintKind :: TYPE ) ,
657+ label : InlayHintLabel :: LabelParts ( vec ! [ InlayHintLabelPart {
658+ value: format!( ">{}" , alias) ,
659+ location: Some ( label_location) ,
660+ ..Default :: default ( )
661+ } ] ) ,
662+ position,
663+ text_edits : None ,
664+ tooltip : None ,
665+ padding_left : Some ( true ) ,
666+ padding_right : None ,
667+ data : None ,
668+ } ;
669+
670+ result. push ( hint) ;
671+ Some ( ( ) )
672+ }
0 commit comments