lib/ruby_lsp/ruby-lsp-cell/addon.rb



# typed: true
# frozen_string_literal: true

require "ruby_lsp/addon"
require "ruby_lsp/internal"

require_relative "code_lens"
require_relative "../cell/version"

RubyLsp::Addon.depend_on_ruby_lsp!("~> 0.26.0")

module RubyLsp
  module Cell
    # Addon for Ruby LSP Cell Context
    #
    class Addon < ::RubyLsp::Addon
      #: -> void
      def initialize
        super
        @global_state = nil #: RubyLsp::GlobalState?
        @message_queue = nil #: Thread::Queue?
        @settings = nil #: Hash[Symbol, untyped]?
        @enabled = nil #: bool?
        @default_view_filename = nil #: String?
      end

      # @override
      #: (RubyLsp::GlobalState global_state, Thread::Queue message_queue) -> void
      def activate(global_state, message_queue)
        return unless are_required_libraries_installed?

        @message_queue = message_queue
        @global_state = global_state
        @settings = @global_state.settings_for_addon(name) || {}
        @enabled = @settings.fetch(:enabled, true)
        @default_view_filename = @settings.fetch(:defaultViewFileName, "show.erb")
      end

      # @override
      #: -> void
      def deactivate; end

      # @override
      #: -> String
      def name
        "Ruby LSP Cell"
      end

      # @override
      #: (RubyLsp::ResponseBuilders::CollectionResponseBuilder[untyped] response_builder, URI::Generic uri, Prism::Dispatcher dispatcher) -> void
      def create_code_lens_listener(response_builder, uri, dispatcher)
        CodeLens.new(
          response_builder,
          uri,
          dispatcher,
          @global_state, #: as !nil
          enabled: @enabled, #: as !nil
          default_view_filename: @default_view_filename, #: as !nil
        )
      end

      # @override
      #: -> String
      def version
        RubyLsp::Cell::VERSION
      end

      def are_required_libraries_installed?
        Bundler.definition.specs.any? do |spec|
          spec.name == "cells"
        end
      rescue Bundler::GemNotFound
        false
      end
    end
  end
end