Class: RbsActivesupport::Generator

Inherits:
Object
  • Object
show all
Includes:
AST
Defined in:
lib/rbs_activesupport/generator.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from AST

#eval_args_with_options, #eval_include_args, #eval_node

Constructor Details

#initialize(pathname, rbs_builder) ⇒ Generator

Returns a new instance of Generator.



20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/rbs_activesupport/generator.rb', line 20

def initialize(pathname, rbs_builder) #: void
  @pathname = pathname

  method_searcher = MethodSearcher.new(rbs_builder)
  resolver = if Gem::Version.new("3.10.0") <= Gem::Version.new(RBS::VERSION)
               RBS::Resolver::TypeNameResolver.build(rbs_builder.env)
             else
               # TypeNameResolver.new was deprecated in RBS 3.10.0
               RBS::Resolver::TypeNameResolver.new(rbs_builder.env) # steep:ignore
             end
  @declaration_builder = DeclarationBuilder.new(resolver, method_searcher)
end

Instance Attribute Details

#declaration_builderObject (readonly)

: DeclarationBuilder



16
17
18
# File 'lib/rbs_activesupport/generator.rb', line 16

def declaration_builder
  @declaration_builder
end

#pathnameObject (readonly)

: Pathname



15
16
17
# File 'lib/rbs_activesupport/generator.rb', line 15

def pathname
  @pathname
end

Class Method Details

.generate(pathname, rbs_builder) ⇒ Object



7
8
9
10
11
# File 'lib/rbs_activesupport/generator.rb', line 7

def self.generate(pathname, rbs_builder) #: String?
  new(pathname, rbs_builder).generate
rescue StandardError
  warn "Failed to generate RBS for #{pathname}"
end

Instance Method Details

#generateObject

: String?



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/rbs_activesupport/generator.rb', line 33

def generate #: String?
  declarations = parse_source_code
  return if declarations.empty?

  definition = declarations.map do |namespace, method_calls|
    public_decls, private_decls = declaration_builder.build(namespace, method_calls)
    next if public_decls.empty? && private_decls.empty?

    <<~RBS
      # resolve-type-names: false

      #{header(namespace)}
      #{public_decls.join("\n")}

      #{"private" if private_decls.any?}

      #{private_decls.join("\n")}

      #{footer(namespace)}
    RBS
  end.compact.join("\n")

  return if definition.empty?

  format(definition)
end