@@ -397,7 +397,7 @@ impl GlobalState {
397397 tracing:: debug!( %cause, "will prime caches" ) ;
398398 let num_worker_threads = self . config . prime_caches_num_threads ( ) ;
399399
400- self . task_pool . handle . spawn_with_sender ( {
400+ self . task_pool . handle . spawn_with_sender ( stdx :: thread :: QoSClass :: Default , {
401401 let analysis = self . snapshot ( ) . analysis ;
402402 move |sender| {
403403 sender. send ( Task :: PrimeCaches ( PrimeCachesProgress :: Begin ) ) . unwrap ( ) ;
@@ -678,7 +678,24 @@ impl GlobalState {
678678 . on_sync :: < lsp_types:: request:: SelectionRangeRequest > ( handlers:: handle_selection_range)
679679 . on_sync :: < lsp_ext:: MatchingBrace > ( handlers:: handle_matching_brace)
680680 . on_sync :: < lsp_ext:: OnTypeFormatting > ( handlers:: handle_on_type_formatting)
681- // All other request handlers:
681+ // We can’t run latency-sensitive request handlers which do semantic
682+ // analysis on the main thread because that would block other
683+ // requests. Instead, we run these request handlers on higher QoS
684+ // threads in the threadpool.
685+ . on_latency_sensitive :: < lsp_types:: request:: Completion > ( handlers:: handle_completion)
686+ . on_latency_sensitive :: < lsp_types:: request:: ResolveCompletionItem > (
687+ handlers:: handle_completion_resolve,
688+ )
689+ . on_latency_sensitive :: < lsp_types:: request:: SemanticTokensFullRequest > (
690+ handlers:: handle_semantic_tokens_full,
691+ )
692+ . on_latency_sensitive :: < lsp_types:: request:: SemanticTokensFullDeltaRequest > (
693+ handlers:: handle_semantic_tokens_full_delta,
694+ )
695+ . on_latency_sensitive :: < lsp_types:: request:: SemanticTokensRangeRequest > (
696+ handlers:: handle_semantic_tokens_range,
697+ )
698+ // All other request handlers
682699 . on :: < lsp_ext:: FetchDependencyList > ( handlers:: fetch_dependency_list)
683700 . on :: < lsp_ext:: AnalyzerStatus > ( handlers:: handle_analyzer_status)
684701 . on :: < lsp_ext:: SyntaxTree > ( handlers:: handle_syntax_tree)
@@ -706,8 +723,6 @@ impl GlobalState {
706723 . on :: < lsp_types:: request:: GotoTypeDefinition > ( handlers:: handle_goto_type_definition)
707724 . on_no_retry :: < lsp_types:: request:: InlayHintRequest > ( handlers:: handle_inlay_hints)
708725 . on :: < lsp_types:: request:: InlayHintResolveRequest > ( handlers:: handle_inlay_hints_resolve)
709- . on :: < lsp_types:: request:: Completion > ( handlers:: handle_completion)
710- . on :: < lsp_types:: request:: ResolveCompletionItem > ( handlers:: handle_completion_resolve)
711726 . on :: < lsp_types:: request:: CodeLensRequest > ( handlers:: handle_code_lens)
712727 . on :: < lsp_types:: request:: CodeLensResolve > ( handlers:: handle_code_lens_resolve)
713728 . on :: < lsp_types:: request:: FoldingRangeRequest > ( handlers:: handle_folding_range)
@@ -725,15 +740,6 @@ impl GlobalState {
725740 . on :: < lsp_types:: request:: CallHierarchyOutgoingCalls > (
726741 handlers:: handle_call_hierarchy_outgoing,
727742 )
728- . on :: < lsp_types:: request:: SemanticTokensFullRequest > (
729- handlers:: handle_semantic_tokens_full,
730- )
731- . on :: < lsp_types:: request:: SemanticTokensFullDeltaRequest > (
732- handlers:: handle_semantic_tokens_full_delta,
733- )
734- . on :: < lsp_types:: request:: SemanticTokensRangeRequest > (
735- handlers:: handle_semantic_tokens_range,
736- )
737743 . on :: < lsp_types:: request:: WillRenameFiles > ( handlers:: handle_will_rename_files)
738744 . on :: < lsp_ext:: Ssr > ( handlers:: handle_ssr)
739745 . finish ( ) ;
@@ -781,7 +787,7 @@ impl GlobalState {
781787 tracing:: trace!( "updating notifications for {:?}" , subscriptions) ;
782788
783789 let snapshot = self . snapshot ( ) ;
784- self . task_pool . handle . spawn ( move || {
790+ self . task_pool . handle . spawn ( stdx :: thread :: QoSClass :: Default , move || {
785791 let _p = profile:: span ( "publish_diagnostics" ) ;
786792 let diagnostics = subscriptions
787793 . into_iter ( )
0 commit comments