11use emmylua_code_analysis:: LuaDeclId ;
2- use emmylua_parser:: { LuaAstNode , LuaClosureExpr , LuaIndexKey , LuaSyntaxKind , LuaTableExpr } ;
2+ use emmylua_parser:: {
3+ LuaAstNode , LuaClosureExpr , LuaIndexKey , LuaSyntaxId , LuaSyntaxKind , LuaTableExpr ,
4+ } ;
35use lsp_types:: SymbolKind ;
46
57use super :: builder:: { DocumentSymbolBuilder , LuaSymbol } ;
68
79pub fn build_closure_expr_symbol (
810 builder : & mut DocumentSymbolBuilder ,
911 closure : LuaClosureExpr ,
10- ) -> Option < ( ) > {
11- let parent = closure. syntax ( ) . parent ( ) ?;
12- if !matches ! (
13- parent. kind( ) . into( ) ,
14- LuaSyntaxKind :: LocalFuncStat | LuaSyntaxKind :: FuncStat
15- ) {
12+ parent_id : LuaSyntaxId ,
13+ ) -> Option < LuaSyntaxId > {
14+ let parent_kind = closure. syntax ( ) . parent ( ) . map ( |parent| parent. kind ( ) . into ( ) ) ;
15+ let convert_parent_to_function = matches ! (
16+ parent_kind,
17+ Some ( LuaSyntaxKind :: TableFieldAssign | LuaSyntaxKind :: TableFieldValue )
18+ ) ;
19+ let needs_own_symbol = match parent_kind {
20+ Some ( LuaSyntaxKind :: LocalFuncStat | LuaSyntaxKind :: FuncStat ) => false ,
21+ Some ( _) if convert_parent_to_function => false ,
22+ _ => true ,
23+ } ;
24+
25+ let param_list = closure. get_params_list ( ) ?;
26+ let params: Vec < _ > = param_list. get_params ( ) . collect ( ) ;
27+ let detail_text = format ! (
28+ "({})" ,
29+ params
30+ . iter( )
31+ . map( |param| {
32+ if param. is_dots( ) {
33+ "..." . to_string( )
34+ } else {
35+ param
36+ . get_name_token( )
37+ . map( |token| token. get_name_text( ) . to_string( ) )
38+ . unwrap_or_default( )
39+ }
40+ } )
41+ . filter( |name| !name. is_empty( ) )
42+ . collect:: <Vec <_>>( )
43+ . join( ", " )
44+ ) ;
45+ let detail = Some ( detail_text. clone ( ) ) ;
46+
47+ let mut effective_parent = parent_id;
48+
49+ if needs_own_symbol {
1650 let symbol = LuaSymbol :: new (
1751 "closure" . to_string ( ) ,
18- None ,
52+ detail . clone ( ) ,
1953 SymbolKind :: MODULE ,
2054 closure. get_range ( ) ,
2155 ) ;
2256
23- builder. add_node_symbol ( closure. syntax ( ) . clone ( ) , symbol) ;
57+ effective_parent =
58+ builder. add_node_symbol ( closure. syntax ( ) . clone ( ) , symbol, Some ( parent_id) ) ;
59+ } else if convert_parent_to_function {
60+ let detail_clone = detail. clone ( ) ;
61+ builder. with_symbol_mut ( & parent_id, |symbol| {
62+ symbol. set_kind ( SymbolKind :: FUNCTION ) ;
63+ symbol. set_detail ( detail_clone) ;
64+ } ) ?;
2465 }
2566
2667 let file_id = builder. get_file_id ( ) ;
27- let param_list = closure. get_params_list ( ) ?;
28- for param in param_list. get_params ( ) {
68+ for param in params {
2969 let decl_id = LuaDeclId :: new ( file_id, param. get_position ( ) ) ;
3070 let decl = builder. get_decl ( & decl_id) ?;
3171 let typ = builder. get_type ( decl_id. into ( ) ) ;
@@ -37,21 +77,30 @@ pub fn build_closure_expr_symbol(
3777 decl. get_range ( ) ,
3878 ) ;
3979
40- builder. add_node_symbol ( param. syntax ( ) . clone ( ) , symbol) ;
80+ builder. add_node_symbol ( param. syntax ( ) . clone ( ) , symbol, Some ( effective_parent ) ) ;
4181 }
4282
43- Some ( ( ) )
83+ Some ( effective_parent )
4484}
4585
46- pub fn build_table_symbol ( builder : & mut DocumentSymbolBuilder , table : LuaTableExpr ) -> Option < ( ) > {
47- let symbol = LuaSymbol :: new (
48- "table" . to_string ( ) ,
49- None ,
50- SymbolKind :: STRUCT ,
51- table. get_range ( ) ,
52- ) ;
86+ pub fn build_table_symbol (
87+ builder : & mut DocumentSymbolBuilder ,
88+ table : LuaTableExpr ,
89+ parent_id : LuaSyntaxId ,
90+ inline_to_parent : bool ,
91+ ) -> Option < LuaSyntaxId > {
92+ let table_id = if inline_to_parent {
93+ parent_id
94+ } else {
95+ let symbol = LuaSymbol :: new (
96+ "table" . to_string ( ) ,
97+ None ,
98+ SymbolKind :: STRUCT ,
99+ table. get_range ( ) ,
100+ ) ;
53101
54- builder. add_node_symbol ( table. syntax ( ) . clone ( ) , symbol) ;
102+ builder. add_node_symbol ( table. syntax ( ) . clone ( ) , symbol, Some ( parent_id) )
103+ } ;
55104
56105 if table. is_object ( ) {
57106 for field in table. get_fields ( ) {
@@ -65,9 +114,9 @@ pub fn build_table_symbol(builder: &mut DocumentSymbolBuilder, table: LuaTableEx
65114
66115 let symbol = LuaSymbol :: new ( str_key, None , SymbolKind :: FIELD , field. get_range ( ) ) ;
67116
68- builder. add_node_symbol ( field. syntax ( ) . clone ( ) , symbol) ;
117+ builder. add_node_symbol ( field. syntax ( ) . clone ( ) , symbol, Some ( table_id ) ) ;
69118 }
70119 }
71120
72- Some ( ( ) )
121+ Some ( table_id )
73122}
0 commit comments