module RDoc
  class Parser
    class RBS < Parser
    end
  end
end

module RBS
  module RDocPlugin
    class Parser
      @top_level: RDoc::TopLevel

      @content: String

      type allowed_decls = RBS::AST::Declarations::Class
                         | RBS::AST::Declarations::Module
                         | RBS::AST::Declarations::Constant

      def initialize: (RDoc::TopLevel top_level, String content) -> void

      def scan: () -> RDoc::TopLevel

      def parse_member: (decl: RBS::AST::Declarations::t | RBS::AST::Members::t, context: RDoc::Context, ?outer_name: RBS::TypeName?) -> void

      def parse_class_decl: (decl: RBS::AST::Declarations::Class, context: RDoc::Context, ?outer_name: RBS::TypeName?) -> void

      def parse_module_decl: (decl: RBS::AST::Declarations::Module | RBS::AST::Declarations::Interface, context: RDoc::Context, ?outer_name: RBS::TypeName?) -> void

      def parse_constant_decl: (decl: RBS::AST::Declarations::Constant, context: RDoc::Context, ?outer_name: RBS::TypeName?) -> void

      def parse_method_decl: (decl: RBS::AST::Members::MethodDefinition, context: RDoc::Context, ?outer_name: RBS::TypeName?) -> void

      def parse_method_alias_decl: (decl: RBS::AST::Members::Alias, context: RDoc::Context, ?outer_name: RBS::TypeName?) -> void

      def parse_attr_decl: (decl: RBS::AST::Members::AttrReader | RBS::AST::Members::AttrAccessor | RBS::AST::Members::AttrWriter, context: RDoc::Context, ?outer_name: RBS::TypeName?) -> void

      def parse_include_decl: (decl: RBS::AST::Members::Include, context: RDoc::Context, ?outer_name: RBS::TypeName?) -> void

      def parse_extend_decl: (decl: RBS::AST::Members::Extend, context: RDoc::Context, ?outer_name: RBS::TypeName?) -> void

      private

      def construct_comment: (context: RDoc::Context, comment: String) -> RDoc::Comment

      # _DeclWithComment is a utility interface that has `#comment`
      #
      interface _DeclWithComment
        def comment: () -> ::RBS::AST::Comment?
      end

      # Extract comment string from a declaration with comment
      #
      # * If `#comment" returns a Comment object, it returns its `#string` value
      # * If `#comment` returns `nil`, it raises an error
      #
      # Note that you have to confirm if the `#comment` of given declaration exists.
      #
      # ```ruby
      # comment = construct_comment(context: context, comment: comment_string(decl)) if decl.comment
      # ```
      #
      def comment_string: (_DeclWithComment) -> String

      def fully_qualified_name: (outer_name: RBS::TypeName?, decl: allowed_decls) -> RBS::TypeName
    end
  end
end
