11module 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 ) )
0 commit comments