1 files changed,
15 insertions(+),
4 deletions(-)
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