@@ -152,8 +152,10 @@ fn build_decl_hover(
152152 } ;
153153 builder. set_type_description ( format ! ( "{}{}: {}" , prefix, decl. get_name( ) , const_value) ) ;
154154 } else {
155+ let decl_hover_type =
156+ get_hover_type ( builder, builder. semantic_model ) . unwrap_or ( typ. clone ( ) ) ;
155157 let type_humanize_text =
156- hover_type ( builder, & typ , Some ( RenderLevel :: Detailed ) ) . unwrap_or_default ( ) ;
158+ hover_type ( builder, & decl_hover_type , Some ( RenderLevel :: Detailed ) ) . unwrap_or_default ( ) ;
157159 let prefix = if decl. is_local ( ) {
158160 "local "
159161 } else {
@@ -251,8 +253,10 @@ fn build_member_hover(
251253 builder. set_type_description ( format ! ( "(field) {}: {}" , member_name, const_value) ) ;
252254 builder. set_location_path ( Some ( & member) ) ;
253255 } else {
256+ let member_hover_type =
257+ get_hover_type ( builder, builder. semantic_model ) . unwrap_or ( typ. clone ( ) ) ;
254258 let type_humanize_text =
255- hover_type ( builder, & typ , Some ( RenderLevel :: Simple ) ) . unwrap_or_default ( ) ;
259+ hover_type ( builder, & member_hover_type , Some ( RenderLevel :: Simple ) ) . unwrap_or_default ( ) ;
256260 builder. set_type_description ( format ! ( "(field) {}: {}" , member_name, type_humanize_text) ) ;
257261 builder. set_location_path ( Some ( & member) ) ;
258262 }
@@ -445,3 +449,36 @@ fn get_member_owner(
445449 }
446450 resolved_property_owner
447451}
452+
453+ pub fn get_hover_type ( builder : & HoverBuilder , semantic_model : & SemanticModel ) -> Option < LuaType > {
454+ let assign_stat = LuaAssignStat :: cast ( builder. get_trigger_token ( ) ?. parent ( ) ?. parent ( ) ?) ?;
455+ let ( vars, exprs) = assign_stat. get_var_and_expr_list ( ) ;
456+ for ( i, var) in vars. iter ( ) . enumerate ( ) {
457+ if var
458+ . syntax ( )
459+ . text_range ( )
460+ . contains ( builder. get_trigger_token ( ) ?. text_range ( ) . start ( ) )
461+ {
462+ let mut expr: Option < & emmylua_parser:: LuaExpr > = exprs. get ( i) ;
463+ let multi_return_index = if expr. is_none ( ) {
464+ expr = Some ( & exprs. last ( ) . unwrap ( ) ) ;
465+ i + 1 - exprs. len ( )
466+ } else {
467+ 0
468+ } ;
469+
470+ let expr_type = semantic_model. infer_expr ( expr. unwrap ( ) . clone ( ) ) ;
471+ match expr_type {
472+ Ok ( expr_type) => match expr_type {
473+ LuaType :: MuliReturn ( muli_return) => {
474+ return muli_return. get_type ( multi_return_index) . map ( |t| t. clone ( ) ) ;
475+ }
476+ _ => return Some ( expr_type) ,
477+ } ,
478+ Err ( _) => return None ,
479+ }
480+ }
481+ }
482+
483+ None
484+ }
0 commit comments