lib/solargraph/pin/namespace.rb



# frozen_string_literal: true


module Solargraph
  module Pin
    class Namespace < Closure
      # @return [::Symbol] :public or :private

      attr_reader :visibility

      # @return [::Symbol] :class or :module

      attr_reader :type

      # @param type [Symbol] :class or :module

      # @param visibility [Symbol] :public or :private

      # @param gates [Array<String>]

      def initialize type: :class, visibility: :public, gates: [''], **splat
        # super(location, namespace, name, comments)

        super(splat)
        @type = type
        @visibility = visibility
        if name.start_with?('::')
          @name = name[2..-1]
          @closure = Solargraph::Pin::ROOT_PIN
        end
        @open_gates = gates
        if @open_gates.one? && @open_gates.first.empty? && @name.include?('::')
          # In this case, a chained namespace was opened (e.g., Foo::Bar)

          # but Foo does not exist.

          parts = @name.split('::')
          @name = parts.pop
          @closure = Pin::Namespace.new(name: parts.join('::'), gates: [parts.join('::')])
          @context = nil
        end
      end

      def namespace
        context.namespace
      end

      def full_context
        @full_context ||= ComplexType.try_parse("#{type.to_s.capitalize}<#{path}>")
      end

      def binder
        full_context
      end

      def scope
        context.scope
      end

      def completion_item_kind
        (type == :class ? LanguageServer::CompletionItemKinds::CLASS : LanguageServer::CompletionItemKinds::MODULE)
      end

      # @return [Integer]

      def symbol_kind
        (type == :class ? LanguageServer::SymbolKinds::CLASS : LanguageServer::SymbolKinds::MODULE)
      end

      def path
        @path ||= (namespace.empty? ? '' : "#{namespace}::") + name
      end

      def return_type
        @return_type ||= ComplexType.try_parse( (type == :class ? 'Class' : 'Module') + "<#{path}>" )
      end

      def domains
        @domains ||= []
      end

      def typify api_map
        return_type
      end

      def gates
        @gates ||= if path.empty?
          @open_gates
        else
          [path] + @open_gates
        end
      end
    end
  end
end