1- use collections:: VecDeque ;
1+ use collections:: { HashMap , HashSet , VecDeque } ;
22use edit_prediction:: EditPredictionStore ;
33use editor:: { Editor , EditorEvent , MultiBufferOffset , actions:: MoveToEnd , scroll:: Autoscroll } ;
44use gpui:: {
@@ -102,6 +102,7 @@ pub struct LspLogView {
102102 log_store : Entity < LogStore > ,
103103 current_server_key : Option < LanguageServerLogKey > ,
104104 active_entry_kind : LogKind ,
105+ enabled_streams : HashMap < LanguageServerLogKey , HashSet < LogKind > > ,
105106 project : Entity < Project > ,
106107 focus_handle : FocusHandle ,
107108 _log_store_subscriptions : Vec < Subscription > ,
@@ -261,18 +262,19 @@ impl LspLogView {
261262 } ) ;
262263
263264 cx. on_release ( |log_view, cx| {
264- let project = log_view. project . downgrade ( ) ;
265- let lsp_store = log_view. project . read ( cx) . lsp_store ( ) . downgrade ( ) ;
266- log_view. log_store . update ( cx, |log_store, cx| {
267- for ( key, state) in & log_store. language_servers {
268- if key. is_for_project ( & project, & lsp_store)
269- && let Some ( log_kind) = state. toggled_log_kind
270- && let Some ( log_type) = log_type ( log_kind)
271- {
272- send_toggle_log_message ( key, false , log_type, cx) ;
273- }
274- }
275- } ) ;
265+ let enabled_streams = log_view
266+ . enabled_streams
267+ . iter ( )
268+ . flat_map ( |( key, log_kinds) | {
269+ log_kinds
270+ . iter ( )
271+ . map ( |log_kind| ( key. clone ( ) , * log_kind) )
272+ . collect :: < Vec < _ > > ( )
273+ } )
274+ . collect :: < Vec < _ > > ( ) ;
275+ for ( key, log_kind) in enabled_streams {
276+ log_view. set_stream_enabled ( & key, log_kind, false , cx) ;
277+ }
276278 } )
277279 . detach ( ) ;
278280
@@ -284,6 +286,7 @@ impl LspLogView {
284286 log_store,
285287 current_server_key : None ,
286288 active_entry_kind : LogKind :: Logs ,
289+ enabled_streams : HashMap :: default ( ) ,
287290 _log_store_subscriptions : vec ! [
288291 model_changes_subscription,
289292 events_subscriptions,
@@ -463,6 +466,62 @@ impl LspLogView {
463466 Some ( rows)
464467 }
465468
469+ fn set_stream_enabled (
470+ & mut self ,
471+ key : & LanguageServerLogKey ,
472+ log_kind : LogKind ,
473+ enabled : bool ,
474+ cx : & mut App ,
475+ ) {
476+ if enabled {
477+ let already_enabled = self
478+ . enabled_streams
479+ . get ( key)
480+ . is_some_and ( |log_kinds| log_kinds. contains ( & log_kind) ) ;
481+ if already_enabled {
482+ return ;
483+ }
484+ let Some ( is_first) = self . log_store . update ( cx, |log_store, _| {
485+ log_store. retain_view_log_stream ( key, log_kind)
486+ } ) else {
487+ return ;
488+ } ;
489+ self . enabled_streams
490+ . entry ( key. clone ( ) )
491+ . or_default ( )
492+ . insert ( log_kind) ;
493+ if is_first && let Some ( log_type) = log_type ( log_kind) {
494+ send_toggle_log_message ( key, true , log_type, cx) ;
495+ }
496+ } else {
497+ let Some ( log_kinds) = self . enabled_streams . get_mut ( key) else {
498+ return ;
499+ } ;
500+ if !log_kinds. remove ( & log_kind) {
501+ return ;
502+ }
503+ if log_kinds. is_empty ( ) {
504+ self . enabled_streams . remove ( key) ;
505+ }
506+ let is_last = self
507+ . log_store
508+ . update ( cx, |log_store, _| {
509+ log_store. release_view_log_stream ( key, log_kind)
510+ } )
511+ . unwrap_or ( true ) ;
512+ if is_last && let Some ( log_type) = log_type ( log_kind) {
513+ send_toggle_log_message ( key, false , log_type, cx) ;
514+ }
515+ }
516+ }
517+
518+ fn disable_streams_for_server ( & mut self , key : & LanguageServerLogKey , cx : & mut App ) {
519+ let log_kinds = self . enabled_streams . get ( key) . cloned ( ) . unwrap_or_default ( ) ;
520+ for log_kind in log_kinds {
521+ self . set_stream_enabled ( key, log_kind, false , cx) ;
522+ }
523+ }
524+
466525 fn show_logs_for_server (
467526 & mut self ,
468527 key : LanguageServerLogKey ,
@@ -490,12 +549,7 @@ impl LspLogView {
490549 cx. notify ( ) ;
491550 }
492551 self . editor . read ( cx) . focus_handle ( cx) . focus ( window, cx) ;
493- self . log_store . update ( cx, |log_store, cx| {
494- let state = log_store. get_language_server_state ( & key) ?;
495- state. toggled_log_kind = Some ( LogKind :: Logs ) ;
496- send_toggle_log_message ( & key, true , LogType :: Log , cx) ;
497- Some ( ( ) )
498- } ) ;
552+ self . set_stream_enabled ( & key, LogKind :: Logs , true , cx) ;
499553 }
500554
501555 fn update_log_level (
@@ -547,12 +601,7 @@ impl LspLogView {
547601 let ( editor, editor_subscriptions) = Self :: editor_for_logs ( log_contents, window, cx) ;
548602 self . editor = editor;
549603 self . editor_subscriptions = editor_subscriptions;
550- self . log_store . update ( cx, |log_store, cx| {
551- let state = log_store. get_language_server_state ( & key) ?;
552- state. toggled_log_kind = Some ( LogKind :: Trace ) ;
553- send_toggle_log_message ( & key, true , LogType :: Trace , cx) ;
554- Some ( ( ) )
555- } ) ;
604+ self . set_stream_enabled ( & key, LogKind :: Trace , true , cx) ;
556605 cx. notify ( ) ;
557606 }
558607 self . editor . read ( cx) . focus_handle ( cx) . focus ( window, cx) ;
@@ -567,7 +616,9 @@ impl LspLogView {
567616 self . toggle_rpc_trace_for_server ( key. clone ( ) , true , window, cx) ;
568617 let rpc_log = self . log_store . update ( cx, |log_store, _| {
569618 log_store
570- . enable_rpc_trace_for_language_server ( & key)
619+ . get_language_server_state ( & key) ?
620+ . rpc_state
621+ . as_ref ( )
571622 . map ( |state| log_contents ( & state. rpc_messages , ( ) ) )
572623 } ) ;
573624 if let Some ( rpc_log) = rpc_log {
@@ -609,17 +660,7 @@ impl LspLogView {
609660 window : & mut Window ,
610661 cx : & mut Context < Self > ,
611662 ) {
612- self . log_store . update ( cx, |log_store, cx| {
613- if enabled {
614- log_store. enable_rpc_trace_for_language_server ( & key) ;
615- } else {
616- log_store. disable_rpc_trace_for_language_server ( & key) ;
617- }
618-
619- if log_store. language_servers . contains_key ( & key) {
620- send_toggle_log_message ( & key, enabled, LogType :: Rpc , cx) ;
621- }
622- } ) ;
663+ self . set_stream_enabled ( & key, LogKind :: Rpc , enabled, cx) ;
623664 if !enabled && self . current_server_key . as_ref ( ) == Some ( & key) {
624665 self . show_logs_for_server ( key, window, cx) ;
625666 cx. notify ( ) ;
@@ -704,15 +745,7 @@ impl LspLogView {
704745 self . editor_subscriptions = editor_subscriptions;
705746 cx. notify ( ) ;
706747 self . editor . read ( cx) . focus_handle ( cx) . focus ( window, cx) ;
707- self . log_store . update ( cx, |log_store, cx| {
708- let state = log_store. get_language_server_state ( & key) ?;
709- if let Some ( log_kind) = state. toggled_log_kind . take ( )
710- && let Some ( log_type) = log_type ( log_kind)
711- {
712- send_toggle_log_message ( & key, false , log_type, cx) ;
713- }
714- Some ( ( ) )
715- } ) ;
748+ self . disable_streams_for_server ( & key, cx) ;
716749 }
717750}
718751
0 commit comments