Module: RDoc::RbsHelper

Defined in:
lib/rdoc/rbs_helper.rb

Class Method Summary collapse

Class Method Details

.load_signatures(*dirs) ⇒ Object

Loads RBS signatures from the given directories. Returns a Hash mapping “ClassName#method_name” => [“type sig string”, …].



41
42
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
# File 'lib/rdoc/rbs_helper.rb', line 41

def load_signatures(*dirs)
  loader = RBS::EnvironmentLoader.new
  dirs.each { |dir| loader.add(path: Pathname(dir)) }

  env = RBS::Environment.new
  loader.load(env: env)

  signatures = {}

  env.class_decls.each do |type_name, entry|
    class_name = type_name.to_s.delete_prefix('::')

    entry.each_decl do |decl|
      decl.members.each do |member|
        case member
        when RBS::AST::Members::MethodDefinition
          sigs = member.overloads.map { |o| o.method_type.to_s }
          method_keys_for(class_name, member).each do |key|
            signatures[key] ||= sigs
          end
        when RBS::AST::Members::AttrReader, RBS::AST::Members::AttrWriter, RBS::AST::Members::AttrAccessor
          key = member.kind == :singleton ? "#{class_name}.#{member.name}" : "#{class_name}##{member.name}"
          signatures[key] ||= [member.type.to_s]
        end
      end
    end
  end

  signatures
end

.signature_to_html(lines, lookup:, from_path:) ⇒ Object

Converts type signature lines to HTML with type names linked to their documentation pages. Uses the RBS parser to extract type name locations precisely.

lines is an Array of signature line strings. lookup is a Hash mapping type names to their doc paths. from_path is the current page path for generating relative URLs.

Returns escaped HTML with -> replaced by .



83
84
85
86
87
# File 'lib/rdoc/rbs_helper.rb', line 83

def signature_to_html(lines, lookup:, from_path:)
  lines.map { |line|
    link_type_names_in_line(line, lookup, from_path).gsub('->', '→')
  }.join("\n")
end

.valid_method_type?(sig) ⇒ Boolean

Returns true if sig is a valid RBS method type signature.

Returns:

  • (Boolean)


20
21
22
23
24
25
# File 'lib/rdoc/rbs_helper.rb', line 20

def valid_method_type?(sig)
  RBS::Parser.parse_method_type(sig, require_eof: true)
  true
rescue RBS::ParsingError
  false
end

.valid_type?(sig) ⇒ Boolean

Returns true if sig is a valid RBS type signature.

Returns:

  • (Boolean)


30
31
32
33
34
35
# File 'lib/rdoc/rbs_helper.rb', line 30

def valid_type?(sig)
  RBS::Parser.parse_type(sig, require_eof: true)
  true
rescue RBS::ParsingError
  false
end