Skip to content

Commit 486cb56

Browse files
committed
(GH-231) Track version of the document in the language server
Previously the Document Store only tracked the content and uri for a document. This commit adds the ability for the Document Store to tack the document version. This commit also makes the Document Store thread safe.
1 parent df8b144 commit 486cb56

File tree

3 files changed

+33
-16
lines changed

3 files changed

+33
-16
lines changed

server/lib/puppet-languageserver/message_router.rb

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,42 @@
11
module PuppetLanguageServer
2-
# TODO: Thread/Atomic safe? probably not
32
module DocumentStore
43
@documents = {}
5-
6-
def self.set_document(uri, content)
7-
@documents[uri] = content
4+
@doc_mutex = Mutex.new
5+
6+
def self.set_document(uri, content, doc_version)
7+
@doc_mutex.synchronize do
8+
@documents[uri] = {
9+
:content => content,
10+
:version => doc_version
11+
}
12+
end
813
end
914

1015
def self.remove_document(uri)
11-
@documents[uri] = nil
16+
@doc_mutex.synchronize { @documents[uri] = nil }
1217
end
1318

1419
def self.clear
15-
@documents.clear
20+
@doc_mutex.synchronize { @documents.clear }
21+
end
22+
23+
def self.document(uri, doc_version = nil)
24+
@doc_mutex.synchronize do
25+
return nil if @documents[uri].nil?
26+
return nil unless doc_version.nil? || @documents[uri][:version] == doc_version
27+
@documents[uri][:content].clone
28+
end
1629
end
1730

18-
def self.document(uri)
19-
return nil if @documents[uri].nil?
20-
@documents[uri].clone
31+
def self.document_version(uri)
32+
@doc_mutex.synchronize do
33+
return nil if @documents[uri].nil?
34+
@documents[uri][:version]
35+
end
2136
end
2237

2338
def self.document_uris
24-
@documents.keys.dup
39+
@doc_mutex.synchronize { @documents.keys.dup }
2540
end
2641
end
2742

@@ -280,7 +295,8 @@ def receive_notification(method, params)
280295
PuppetLanguageServer.log_message(:info, 'Received textDocument/didOpen notification.')
281296
file_uri = params['textDocument']['uri']
282297
content = params['textDocument']['text']
283-
documents.set_document(file_uri, content)
298+
doc_version = params['textDocument']['version']
299+
documents.set_document(file_uri, content, doc_version)
284300
case document_type(file_uri)
285301
when :manifest
286302
reply_diagnostics(file_uri, PuppetLanguageServer::DocumentValidator.validate(content, @workspace))
@@ -299,7 +315,8 @@ def receive_notification(method, params)
299315
PuppetLanguageServer.log_message(:info, 'Received textDocument/didChange notification.')
300316
file_uri = params['textDocument']['uri']
301317
content = params['contentChanges'][0]['text'] # TODO: Bad hardcoding zero
302-
documents.set_document(file_uri, content)
318+
doc_version = params['textDocument']['version']
319+
documents.set_document(file_uri, content, doc_version)
303320
case document_type(file_uri)
304321
when :manifest
305322
reply_diagnostics(file_uri, PuppetLanguageServer::DocumentValidator.validate(content, @workspace))

server/spec/languageserver/integration/puppet-languageserver/message_router_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
# Populate the document cache
2222
PuppetLanguageServer::DocumentStore.clear
23-
documents.each { |uri, content| PuppetLanguageServer::DocumentStore.set_document(uri, content) }
23+
documents.each { |uri, content| PuppetLanguageServer::DocumentStore.set_document(uri, content, 0) }
2424
end
2525

2626
context 'given a request that raises an error' do
@@ -95,7 +95,7 @@
9595

9696
# Populate the document cache
9797
PuppetLanguageServer::DocumentStore.clear
98-
documents.each { |uri, content| PuppetLanguageServer::DocumentStore.set_document(uri, content) }
98+
documents.each { |uri, content| PuppetLanguageServer::DocumentStore.set_document(uri, content, 0) }
9999
end
100100

101101
context 'given a request that raises an error' do

server/spec/languageserver/unit/puppet-languageserver/message_router_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@
213213
before(:each) do
214214
# Create fake document store
215215
subject.documents.clear
216-
subject.documents.set_document(file_uri,file_content)
216+
subject.documents.set_document(file_uri,file_content, 0)
217217
end
218218

219219
context 'and a file which is not a puppet manifest' do
@@ -607,7 +607,7 @@
607607

608608
before(:each) do
609609
subject.documents.clear
610-
subject.documents.set_document(file_uri,file_content)
610+
subject.documents.set_document(file_uri,file_content, 0)
611611
end
612612

613613
it 'should remove the document from the document store' do

0 commit comments

Comments
 (0)