@@ -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 :: ThreadIntent :: Worker , {
401401 let analysis = self . snapshot ( ) . analysis ;
402402 move |sender| {
403403 sender. send ( Task :: PrimeCaches ( PrimeCachesProgress :: Begin ) ) . unwrap ( ) ;
@@ -678,7 +678,32 @@ 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 priority
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+ // Formatting is not caused by the user typing,
699+ // but it does qualify as latency-sensitive
700+ // because a delay before formatting is applied
701+ // can be confusing for the user.
702+ . on_latency_sensitive :: < lsp_types:: request:: Formatting > ( handlers:: handle_formatting)
703+ . on_latency_sensitive :: < lsp_types:: request:: RangeFormatting > (
704+ handlers:: handle_range_formatting,
705+ )
706+ // All other request handlers
682707 . on :: < lsp_ext:: FetchDependencyList > ( handlers:: fetch_dependency_list)
683708 . on :: < lsp_ext:: AnalyzerStatus > ( handlers:: handle_analyzer_status)
684709 . on :: < lsp_ext:: SyntaxTree > ( handlers:: handle_syntax_tree)
@@ -706,17 +731,13 @@ impl GlobalState {
706731 . on :: < lsp_types:: request:: GotoTypeDefinition > ( handlers:: handle_goto_type_definition)
707732 . on_no_retry :: < lsp_types:: request:: InlayHintRequest > ( handlers:: handle_inlay_hints)
708733 . 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)
711734 . on :: < lsp_types:: request:: CodeLensRequest > ( handlers:: handle_code_lens)
712735 . on :: < lsp_types:: request:: CodeLensResolve > ( handlers:: handle_code_lens_resolve)
713736 . on :: < lsp_types:: request:: FoldingRangeRequest > ( handlers:: handle_folding_range)
714737 . on :: < lsp_types:: request:: SignatureHelpRequest > ( handlers:: handle_signature_help)
715738 . on :: < lsp_types:: request:: PrepareRenameRequest > ( handlers:: handle_prepare_rename)
716739 . on :: < lsp_types:: request:: Rename > ( handlers:: handle_rename)
717740 . on :: < lsp_types:: request:: References > ( handlers:: handle_references)
718- . on :: < lsp_types:: request:: Formatting > ( handlers:: handle_formatting)
719- . on :: < lsp_types:: request:: RangeFormatting > ( handlers:: handle_range_formatting)
720741 . on :: < lsp_types:: request:: DocumentHighlightRequest > ( handlers:: handle_document_highlight)
721742 . on :: < lsp_types:: request:: CallHierarchyPrepare > ( handlers:: handle_call_hierarchy_prepare)
722743 . on :: < lsp_types:: request:: CallHierarchyIncomingCalls > (
@@ -725,15 +746,6 @@ impl GlobalState {
725746 . on :: < lsp_types:: request:: CallHierarchyOutgoingCalls > (
726747 handlers:: handle_call_hierarchy_outgoing,
727748 )
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- )
737749 . on :: < lsp_types:: request:: WillRenameFiles > ( handlers:: handle_will_rename_files)
738750 . on :: < lsp_ext:: Ssr > ( handlers:: handle_ssr)
739751 . finish ( ) ;
@@ -781,7 +793,10 @@ impl GlobalState {
781793 tracing:: trace!( "updating notifications for {:?}" , subscriptions) ;
782794
783795 let snapshot = self . snapshot ( ) ;
784- self . task_pool . handle . spawn ( move || {
796+
797+ // Diagnostics are triggered by the user typing
798+ // so we run them on a latency sensitive thread.
799+ self . task_pool . handle . spawn ( stdx:: thread:: ThreadIntent :: LatencySensitive , move || {
785800 let _p = profile:: span ( "publish_diagnostics" ) ;
786801 let diagnostics = subscriptions
787802 . into_iter ( )
0 commit comments