class LanguageServer
Public Class Methods
client_initialize(id,params)
click to toggle source
# File lib/servers/language_server.rb, line 38 def self.client_initialize(id,params) return JSON.generate({ jsonrpc: '2.0', result: { capabilities: { textDocumentSync:1, implementationProvider: "true" } }, id: id }) end
client_textDocument_didChange(id,params)
click to toggle source
# File lib/servers/language_server.rb, line 59 def self.client_textDocument_didChange(id,params) uri = params["textDocument"]["uri"] version = params["textDocument"]["version"] code = params['contentChanges'][0]['text'] return self.generate_diagnostics(uri,version,code) return end
client_textDocument_didOpen(id,params)
click to toggle source
# File lib/servers/language_server.rb, line 51 def self.client_textDocument_didOpen(id,params) uri = params["textDocument"]["uri"] version = params["textDocument"]["version"] code = params['textDocument']['text'] return self.generate_diagnostics(uri,version,code) return end
generate_diagnostics(uri,version,code)
click to toggle source
# File lib/servers/language_server.rb, line 67 def self.generate_diagnostics(uri,version,code) result = RuleEngine.analyzeDocument(code) #convert to json diagnostics = [] result.each do |sin| diagnostics.append({ range:{ start: { line: sin.begin_line-1, character: sin.begin_char }, end: { line: sin.end_line-1, character: sin.end_char } }, severity: 2, code: { value:sin.type[:name], target:sin.type[:solution] }, source:'Puppet-sec-lint', message: sin.type[:message] }) end return JSON.generate({ jsonrpc: '2.0', method: 'textDocument/publishDiagnostics', params: { uri: uri, version: version, diagnostics: diagnostics } }) end
start(port)
click to toggle source
# File lib/servers/language_server.rb, line 11 def self.start(port) port ||= 5007 server = TCPServer.open(port) loop { Thread.fork(server.accept) do |client| while line=client.gets length=Integer(line.scan(/\d/).join('')) line=client.read(length+2) request = JSON.parse(line) $logger.debug(line) method_name = request['method'].sub('/', '_') response = if self.respond_to? "client_"+method_name then self.send("client_"+method_name,request['id'],request['params']) end if not response.nil? client.flush client.print("Content-Length: "+response.length.to_s+"\r\n\r\n") client.print(response) $logger.debug(response) end end client.close end } end