Module: PuppetLanguageServer

Defined in:
lib/puppet_languageserver.rb,
lib/puppet-languageserver/crash_dump.rb,
lib/puppet-languageserver/uri_helper.rb,
lib/puppet-languageserver/facter_helper.rb,
lib/puppet-languageserver/global_queues.rb,
lib/puppet-languageserver/puppet_helper.rb,
lib/puppet-languageserver/message_handler.rb,
lib/puppet-languageserver/sidecar_protocol.rb,
lib/puppet-languageserver/server_capabilities.rb,
lib/puppet-languageserver/client_session_state.rb,
lib/puppet-languageserver/puppet_parser_helper.rb,
lib/puppet-languageserver/epp/validation_provider.rb,
lib/puppet-languageserver/manifest/hover_provider.rb,
lib/puppet-languageserver/manifest/folding_provider.rb,
lib/puppet-languageserver/session_state/object_cache.rb,
lib/puppet-languageserver/global_queues/sidecar_queue.rb,
lib/puppet-languageserver/manifest/signature_provider.rb,
lib/puppet-languageserver/manifest/completion_provider.rb,
lib/puppet-languageserver/manifest/definition_provider.rb,
lib/puppet-languageserver/manifest/validation_provider.rb,
lib/puppet-languageserver/session_state/document_store.rb,
lib/puppet-languageserver/session_state/language_client.rb,
lib/puppet-languageserver/global_queues/validation_queue.rb,
lib/puppet-languageserver/puppetfile/validation_provider.rb,
lib/puppet-languageserver/manifest/format_on_type_provider.rb,
lib/puppet-languageserver/manifest/document_symbol_provider.rb,
lib/puppet-languageserver/global_queues/single_instance_queue.rb,
lib/puppet-languageserver/manifest/document_formatting_provider.rb

Defined Under Namespace

Modules: CrashDump, Epp, FacterHelper, GlobalQueues, Manifest, PuppetHelper, PuppetParserHelper, Puppetfile, ServerCapabilites, SessionState, Sidecar, UriHelper Classes: ClientSessionState, CommandLineParser, DisabledMessageHandler, MessageHandler

Class Method Summary collapse

Class Method Details

.active?Bool

Whether the language server is actually in a state that can be used. Typically this is false when a catastrophic error occurs during startup e.g. Puppet is missing.

Returns:

  • (Bool)

    Whether the language server is actually in a state that can be used



25
26
27
# File 'lib/puppet_languageserver.rb', line 25

def self.active?
  @server_is_active
end

.configure_featureflags(flags) ⇒ Object



33
34
35
# File 'lib/puppet_languageserver.rb', line 33

def self.configure_featureflags(flags)
  @flags = flags
end

.featureflag?(flagname) ⇒ Boolean

Returns:

  • (Boolean)


37
38
39
40
41
# File 'lib/puppet_languageserver.rb', line 37

def self.featureflag?(flagname)
  return false if @flags.nil? || @flags.empty?

  @flags.include?(flagname)
end

.init_puppet(options) ⇒ Object



210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
# File 'lib/puppet_languageserver.rb', line 210

def self.init_puppet(options)
  PuppetEditorServices.init_logging(options)
  log_message(:info, "Language Server is v#{PuppetEditorServices.version}")
  log_message(:debug, 'Loading gems...')
  require_gems(options)
  return unless active?

  log_message(:info, "Using OpenVox gem v#{OpenVoxRuntime.gem_version} (Puppet API v#{Puppet.version})")
  log_message(:info, "Using OpenFact gem v#{OpenFactRuntime.gem_version} (Facter API v#{Facter.version})")

  raise("Detected OpenVox #{Puppet.version} however the Language Server requires OpenVox 8.0 and above") if Gem::Version.new(Puppet.version) < Gem::Version.new('8.0.0')

  log_message(:debug, "Detected additional puppet settings #{options[:puppet_settings]}")
  options[:puppet_settings].nil? ? Puppet.initialize_settings : Puppet.initialize_settings(options[:puppet_settings])

  log_message(:info, 'Initializing settings...')

  # Remove all other logging destinations except for ours
  Puppet::Util::Log.destinations.clear
  Puppet::Util::Log.newdestination('null_logger')

  true
end

.log_message(severity, message) ⇒ Object



206
207
208
# File 'lib/puppet_languageserver.rb', line 206

def self.log_message(severity, message)
  PuppetEditorServices.log_message(severity, message)
end

.require_gems(options) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/puppet_languageserver.rb', line 43

def self.require_gems(options)
  original_verbose = $VERBOSE
  $VERBOSE = nil
  @server_is_active = false

  # Use a specific OpenVox Gem version if requested.
  if options[:puppet_version].nil?
    OpenVoxRuntime.activate!
  else
    available_openvox_gems = OpenVoxRuntime.available_versions
    if available_openvox_gems.include?(options[:puppet_version])
      OpenVoxRuntime.activate!(options[:puppet_version])
    else
      log_message(:warn, "Unable to use OpenVox version #{options[:puppet_version]}, as only the following versions are available [#{available_openvox_gems.join(', ')}]")
      OpenVoxRuntime.activate!
    end
  end

  # These libraries do not require the puppet gem and required for the
  # server to respond to clients.
  %w[
    client_session_state
    crash_dump
    message_handler
    server_capabilities
  ].each do |lib|
    require "puppet-languageserver/#{lib}"
  rescue LoadError
    require File.expand_path(File.join(File.dirname(__FILE__), 'puppet-languageserver', lib))
  end

  begin
    require 'lsp/lsp'
    OpenFactRuntime.activate!
  rescue LoadError => e
    log_message(:error, "Error while loading a critical gem: #{e} #{e.backtrace}")
    return
  end

  # These libraries require the puppet and LSP gems.
  %w[
    sidecar_protocol
    global_queues
    puppet_lexer_helper
    puppet_parser_helper
    puppet_helper
    facter_helper
    uri_helper
    puppet_monkey_patches
    providers
  ].each do |lib|
    require "puppet-languageserver/#{lib}"
  rescue LoadError
    require File.expand_path(File.join(File.dirname(__FILE__), 'puppet-languageserver', lib))
  end

  # Validate the feature flags
  unless options[:flags].nil? || options[:flags].empty?
    flags = options[:flags]
    log_message(:debug, "Detected feature flags [#{flags.join(', ')}]")

    configure_featureflags(flags)
  end

  @server_is_active = true
ensure
  $VERBOSE = original_verbose
end

.rpc_server(options) ⇒ Object



234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
# File 'lib/puppet_languageserver.rb', line 234

def self.rpc_server(options)
  log_message(:info, 'Starting RPC Server...')
  options[:servicename] = 'LANGUAGE SERVER'

  require 'puppet_editor_services/protocol/json_rpc'

  server_options = options
  protocol_options = { class: PuppetEditorServices::Protocol::JsonRPC }.merge(options)
  handler_options = { class: PuppetLanguageServer::MessageHandler }.merge(options)

  unless active?
    handler_options[:class] = PuppetLanguageServer::DisabledMessageHandler
    log_message(:info, 'Configured the Language Server to use the Disabled Message Router')
  end

  if options[:stdio]
    log_message(:debug, 'Using STDIO Server')
    require 'puppet_editor_services/server/stdio'
    server = ::PuppetEditorServices::Server::Stdio.new(server_options, protocol_options, handler_options)
    trap('INT') { server.stop }
  else
    log_message(:debug, 'Using TCP Server')
    require 'puppet_editor_services/server/tcp'
    # TODO: Add max threads?
    server = ::PuppetEditorServices::Server::Tcp.new(server_options, protocol_options, handler_options)
    trap('INT') { server.stop_services(true) }
  end
  server.start

  log_message(:info, 'Language Server exited.')
end

.static_data_dirObject



29
30
31
# File 'lib/puppet_languageserver.rb', line 29

def self.static_data_dir
  @static_data_dir ||= File.expand_path(File.join(__dir__, 'puppet-languageserver', 'static_data'))
end

.versionObject



17
18
19
# File 'lib/puppet_languageserver.rb', line 17

def self.version
  PuppetEditorServices.version
end