@@ -889,7 +889,34 @@ impl Workspace for WorkspaceServer {
889889 let mut formatted_output = String :: new ( ) ;
890890 let path_str = params. path . as_path ( ) . display ( ) . to_string ( ) ;
891891
892- for ( _id, stmt_range, text, ast_result) in doc. iter ( FormatStatementMapper ) {
892+ let format_candidates: Vec < _ > = doc. iter ( FormatStatementMapper ) . collect ( ) ;
893+ let mut formatted_sql_fn_bodies = HashMap :: new ( ) ;
894+
895+ for ( id, _stmt_range, _text, ast_result) in & format_candidates {
896+ if !id. is_child ( ) {
897+ continue ;
898+ }
899+
900+ let Some ( parent_id) = id. parent ( ) else {
901+ continue ;
902+ } ;
903+
904+ let Ok ( ast) = ast_result else {
905+ continue ;
906+ } ;
907+
908+ let Ok ( result) = pgls_pretty_print:: format_statement ( ast, & config) else {
909+ continue ;
910+ } ;
911+
912+ formatted_sql_fn_bodies. insert ( parent_id, result. formatted ) ;
913+ }
914+
915+ for ( id, stmt_range, text, ast_result) in format_candidates {
916+ if id. is_child ( ) {
917+ continue ;
918+ }
919+
893920 if let Some ( filter_range) = params. range
894921 && stmt_range. intersect ( filter_range) . is_none ( )
895922 {
@@ -901,35 +928,42 @@ impl Workspace for WorkspaceServer {
901928 }
902929
903930 match ast_result {
904- Ok ( ast) => match pgls_pretty_print:: format_statement ( & ast, & config) {
905- Ok ( result) => {
906- if text != result. formatted {
907- statements. push ( StatementFormatResult {
908- original : text. clone ( ) ,
909- formatted : result. formatted . clone ( ) ,
910- range : stmt_range,
911- } ) ;
912- }
913- if !formatted_output. is_empty ( ) {
914- formatted_output. push_str ( "\n \n " ) ;
915- }
916- formatted_output. push_str ( & result. formatted ) ;
931+ Ok ( ast) => {
932+ let mut ast = ast;
933+ if let Some ( formatted_sql_fn_body) = formatted_sql_fn_bodies. get ( & id) {
934+ sql_function:: set_sql_fn_body ( & mut ast, formatted_sql_fn_body) ;
917935 }
918- Err ( err) => {
919- diagnostics. push ( SDiagnostic :: new (
920- pgls_diagnostics:: Error :: from ( WorkspaceError :: format_error (
921- err. to_string ( ) ,
922- ) )
923- . with_file_path ( & path_str)
924- . with_file_span ( stmt_range) ,
925- ) ) ;
926-
927- if !formatted_output. is_empty ( ) {
928- formatted_output. push_str ( "\n \n " ) ;
936+
937+ match pgls_pretty_print:: format_statement ( & ast, & config) {
938+ Ok ( result) => {
939+ if text != result. formatted {
940+ statements. push ( StatementFormatResult {
941+ original : text. clone ( ) ,
942+ formatted : result. formatted . clone ( ) ,
943+ range : stmt_range,
944+ } ) ;
945+ }
946+ if !formatted_output. is_empty ( ) {
947+ formatted_output. push_str ( "\n \n " ) ;
948+ }
949+ formatted_output. push_str ( & result. formatted ) ;
950+ }
951+ Err ( err) => {
952+ diagnostics. push ( SDiagnostic :: new (
953+ pgls_diagnostics:: Error :: from ( WorkspaceError :: format_error (
954+ err. to_string ( ) ,
955+ ) )
956+ . with_file_path ( & path_str)
957+ . with_file_span ( stmt_range) ,
958+ ) ) ;
959+
960+ if !formatted_output. is_empty ( ) {
961+ formatted_output. push_str ( "\n \n " ) ;
962+ }
963+ formatted_output. push_str ( & text) ;
929964 }
930- formatted_output. push_str ( & text) ;
931965 }
932- } ,
966+ }
933967 Err ( syntax_err) => {
934968 diagnostics. push ( SDiagnostic :: new (
935969 pgls_diagnostics:: Error :: from ( syntax_err) . with_file_path ( & path_str) ,
0 commit comments