lib/solargraph/language_server/message/initialize.rb
# frozen_string_literal: true require 'benchmark' module Solargraph module LanguageServer module Message class Initialize < Base def process bm = Benchmark.measure { host.configure params['initializationOptions'] host.client_capabilities = params['capabilities'] if support_workspace_folders? host.prepare_folders params['workspaceFolders'] elsif params['rootUri'] host.prepare UriHelpers.uri_to_file(params['rootUri']) else host.prepare params['rootPath'] end result = { capabilities: { textDocumentSync: 2, # @todo What should this be? workspace: { workspaceFolders: { supported: true, changeNotifications: true } } } } result[:capabilities].merge! static_completion unless dynamic_registration_for?('textDocument', 'completion') result[:capabilities].merge! static_signature_help unless dynamic_registration_for?('textDocument', 'signatureHelp') # result[:capabilities].merge! static_on_type_formatting unless dynamic_registration_for?('textDocument', 'onTypeFormatting') result[:capabilities].merge! static_hover unless dynamic_registration_for?('textDocument', 'hover') result[:capabilities].merge! static_document_formatting unless dynamic_registration_for?('textDocument', 'formatting') result[:capabilities].merge! static_document_symbols unless dynamic_registration_for?('textDocument', 'documentSymbol') result[:capabilities].merge! static_definitions unless dynamic_registration_for?('textDocument', 'definition') result[:capabilities].merge! static_rename unless dynamic_registration_for?('textDocument', 'rename') result[:capabilities].merge! static_references unless dynamic_registration_for?('textDocument', 'references') result[:capabilities].merge! static_workspace_symbols unless dynamic_registration_for?('workspace', 'symbol') result[:capabilities].merge! static_folding_range unless dynamic_registration_for?('textDocument', 'foldingRange') # @todo Temporarily disabled # result[:capabilities].merge! static_code_action unless dynamic_registration_for?('textDocument', 'codeAction') set_result result } Solargraph.logger.unknown "Solargraph initialized (#{bm.real} seconds)" end private def support_workspace_folders? params['capabilities'] && params['capabilities']['workspace'] && params['capabilities']['workspace']['workspaceFolders'] && params['workspaceFolders'] end def static_completion { completionProvider: { resolveProvider: true, triggerCharacters: ['.', ':', '@'] } } end def static_code_action { codeActionProvider: true, codeActionKinds: ["quickfix"] } end def static_signature_help { signatureHelpProvider: { triggerCharacters: ['(', ','] } } end def static_on_type_formatting { documentOnTypeFormattingProvider: { firstTriggerCharacter: '{', moreTriggerCharacter: ['('] } } end def static_hover { hoverProvider: true } end def static_document_formatting { documentFormattingProvider: true } end def static_document_symbols { documentSymbolProvider: true } end def static_workspace_symbols { workspaceSymbolProvider: true } end def static_definitions { definitionProvider: true } end def static_rename { renameProvider: {prepareProvider: true} } end def static_references { referencesProvider: true } end def static_folding_range { foldingRangeProvider: true } end # @param section [String] # @param capability [String] # @return [Boolean] def dynamic_registration_for? section, capability result = (params['capabilities'] && params['capabilities'][section] && params['capabilities'][section][capability] && params['capabilities'][section][capability]['dynamicRegistration']) host.allow_registration("#{section}/#{capability}") if result result end end end end end