@@ -397,7 +397,7 @@ impl GlobalState {
397
397
tracing:: debug!( %cause, "will prime caches" ) ;
398
398
let num_worker_threads = self . config . prime_caches_num_threads ( ) ;
399
399
400
- self . task_pool . handle . spawn_with_sender ( {
400
+ self . task_pool . handle . spawn_with_sender ( stdx :: thread :: ThreadIntent :: Worker , {
401
401
let analysis = self . snapshot ( ) . analysis ;
402
402
move |sender| {
403
403
sender. send ( Task :: PrimeCaches ( PrimeCachesProgress :: Begin ) ) . unwrap ( ) ;
@@ -678,7 +678,32 @@ impl GlobalState {
678
678
. on_sync :: < lsp_types:: request:: SelectionRangeRequest > ( handlers:: handle_selection_range)
679
679
. on_sync :: < lsp_ext:: MatchingBrace > ( handlers:: handle_matching_brace)
680
680
. 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
682
707
. on :: < lsp_ext:: FetchDependencyList > ( handlers:: fetch_dependency_list)
683
708
. on :: < lsp_ext:: AnalyzerStatus > ( handlers:: handle_analyzer_status)
684
709
. on :: < lsp_ext:: SyntaxTree > ( handlers:: handle_syntax_tree)
@@ -706,17 +731,13 @@ impl GlobalState {
706
731
. on :: < lsp_types:: request:: GotoTypeDefinition > ( handlers:: handle_goto_type_definition)
707
732
. on_no_retry :: < lsp_types:: request:: InlayHintRequest > ( handlers:: handle_inlay_hints)
708
733
. 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)
711
734
. on :: < lsp_types:: request:: CodeLensRequest > ( handlers:: handle_code_lens)
712
735
. on :: < lsp_types:: request:: CodeLensResolve > ( handlers:: handle_code_lens_resolve)
713
736
. on :: < lsp_types:: request:: FoldingRangeRequest > ( handlers:: handle_folding_range)
714
737
. on :: < lsp_types:: request:: SignatureHelpRequest > ( handlers:: handle_signature_help)
715
738
. on :: < lsp_types:: request:: PrepareRenameRequest > ( handlers:: handle_prepare_rename)
716
739
. on :: < lsp_types:: request:: Rename > ( handlers:: handle_rename)
717
740
. 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)
720
741
. on :: < lsp_types:: request:: DocumentHighlightRequest > ( handlers:: handle_document_highlight)
721
742
. on :: < lsp_types:: request:: CallHierarchyPrepare > ( handlers:: handle_call_hierarchy_prepare)
722
743
. on :: < lsp_types:: request:: CallHierarchyIncomingCalls > (
@@ -725,15 +746,6 @@ impl GlobalState {
725
746
. on :: < lsp_types:: request:: CallHierarchyOutgoingCalls > (
726
747
handlers:: handle_call_hierarchy_outgoing,
727
748
)
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
- )
737
749
. on :: < lsp_types:: request:: WillRenameFiles > ( handlers:: handle_will_rename_files)
738
750
. on :: < lsp_ext:: Ssr > ( handlers:: handle_ssr)
739
751
. finish ( ) ;
@@ -781,7 +793,10 @@ impl GlobalState {
781
793
tracing:: trace!( "updating notifications for {:?}" , subscriptions) ;
782
794
783
795
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 || {
785
800
let _p = profile:: span ( "publish_diagnostics" ) ;
786
801
let diagnostics = subscriptions
787
802
. into_iter ( )
0 commit comments