Class: RDoc::Generator::Markdown::RbsSignatureIndex

Inherits:
Object
  • Object
show all
Defined in:
lib/rdoc/generator/markdown/rbs_signature_index.rb

Overview

Optional lookup of method signatures parsed from RBS files.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(signatures) ⇒ RbsSignatureIndex

Returns a new instance of RbsSignatureIndex.

Parameters:

  • signatures (Hash{Array => String})

    Signature lookup.



59
60
61
# File 'lib/rdoc/generator/markdown/rbs_signature_index.rb', line 59

def initialize(signatures)
  @signatures = signatures
end

Class Method Details

.add_method_signature(signatures, klass:, method:) ⇒ void

This method returns an undefined value.

Adds one RBS-parsed method signature to the lookup.

Parameters:

  • signatures (Hash{Array => String})

    Signature lookup being populated.

  • klass (RDoc::Context)

    Method owner.

  • method (RDoc::AnyMethod)

    Method parsed by the RBS plugin.



50
51
52
53
54
55
56
# File 'lib/rdoc/generator/markdown/rbs_signature_index.rb', line 50

def self.add_method_signature(signatures, klass:, method:)
  signatures[[klass.full_name, method.singleton, method.name]] = method.param_seq

  return unless method.name == "initialize" && !method.singleton

  signatures[[klass.full_name, true, "new"]] = method.param_seq
end

.build(files) ⇒ RDoc::Generator::Markdown::RbsSignatureIndex

Builds a signature index from RBS files included in an RDoc run.

Parameters:

  • files (Array<String>)

    Input files passed to RDoc.

Returns:



10
11
12
13
# File 'lib/rdoc/generator/markdown/rbs_signature_index.rb', line 10

def self.build(files)
  rbs_files = files.select { |file| File.extname(file) == ".rbs" }
  new(signatures_from(rbs_files))
end

.parsed_classes(file) ⇒ Array<RDoc::Context>

Parses one RBS file into RDoc class/module objects.

Parameters:

  • file (String)

    RBS file path.

Returns:

  • (Array<RDoc::Context>)

    Classes and modules parsed from RBS.



35
36
37
38
39
40
41
# File 'lib/rdoc/generator/markdown/rbs_signature_index.rb', line 35

def self.parsed_classes(file)
  store = RDoc::Store.new(RDoc::Options.new)
  top_level = store.add_file(file)
  parser = RDoc::Parser.for(top_level, File.read(file), store.options, nil)
  parser.scan
  store.all_classes_and_modules
end

.signatures_from(files) ⇒ Hash{Array => String}

Builds signatures by reusing RBS’s own RDoc parser.

Parameters:

  • files (Array<String>)

    RBS files to parse.

Returns:

  • (Hash{Array => String})

    Signature lookup keyed by class and method.



20
21
22
23
24
25
26
27
28
# File 'lib/rdoc/generator/markdown/rbs_signature_index.rb', line 20

def self.signatures_from(files)
  files.each_with_object({}) do |file, signatures|
    parsed_classes(file).each do |klass|
      klass.method_list.each do |method|
        add_method_signature(signatures, klass: klass, method: method)
      end
    end
  end
end

Instance Method Details

#any?Boolean

Checks whether any RBS signatures were parsed.

Returns:

  • (Boolean)

    True when type signatures are available.



75
76
77
# File 'lib/rdoc/generator/markdown/rbs_signature_index.rb', line 75

def any?
  @signatures.any?
end

#signature_for(method) ⇒ String?

Looks up the RBS signature for an RDoc method.

Parameters:

  • method (RDoc::AnyMethod)

    Method object to render.

Returns:

  • (String, nil)

    RBS method type string when available.



68
69
70
# File 'lib/rdoc/generator/markdown/rbs_signature_index.rb', line 68

def signature_for(method)
  @signatures[[method.parent.full_name, method.singleton, method.name]]
end