all repos

clerk @ 5e2eeb4093e425330484d67f8afb6e365e4fb723

missing tooling for ledger/hledger
1 files changed, 15 insertions(+), 4 deletions(-)
lsp: tokenize semantic tokens outside the document lock
Author: Oleksandr Smirnov olexsmir@gmail.com
Committed at: 2026-08-13 13:40:52 +0300
Authored at: 2026-08-13 13:24:18 +0300
Change ID: ntqluuuwxroponptouuknllqvuwtssyv
Parent: 8063300
M internal/lsp/textdocument_semantic.go
ยทยทยท
        48
        48
         

      
        49
        49
         func (s *server) tokensForDoc(doc uri.URI) ([]semanticToken, bool) {

      
        50
        50
         	s.mu.Lock()

      
        51
        
        -	defer s.mu.Unlock()

      
        52
        51
         	st, ok := s.openDocs[doc]

      
        
        52
        +	s.mu.Unlock()

      
        53
        53
         	if !ok {

      
        54
        54
         		return nil, false

      
        55
        55
         	}

      
        56
        56
         	if st.semTokens != nil {

      
        57
        57
         		return st.semTokens, true

      
        58
        58
         	}

      
        59
        
        -	st.semTokens = tokenizeForSemantics(st.text, parseJournalStr(st.text))

      
        60
        
        -	s.openDocs[doc] = st

      
        61
        
        -	return st.semTokens, true

      
        
        59
        +	// Tokenize outside the lock: a full tokenization of a large journal is

      
        
        60
        +	// milliseconds, during which didChange/didOpen would otherwise stall.

      
        
        61
        +	tokens := tokenizeForSemantics(st.text, parseJournalStr(st.text))

      
        
        62
        +	s.mu.Lock()

      
        
        63
        +	defer s.mu.Unlock()

      
        
        64
        +	cur, ok := s.openDocs[doc]

      
        
        65
        +	if !ok {

      
        
        66
        +		return nil, false

      
        
        67
        +	}

      
        
        68
        +	if cur.text == st.text { // unchanged during tokenization

      
        
        69
        +		cur.semTokens = tokens

      
        
        70
        +		s.openDocs[doc] = cur

      
        
        71
        +	}

      
        
        72
        +	return tokens, true

      
        62
        73
         }

      
        63
        74
         

      
        64
        75
         // Implementation