Class: Lowkey::ProxyFactory

Inherits:
Object
  • Object
show all
Defined in:
lib/factories/proxy_factory.rb

Class Method Summary collapse

Class Method Details

.class_proxy(node:, namespace:, file_path:, lines:) ⇒ Object



27
28
29
30
# File 'lib/factories/proxy_factory.rb', line 27

def class_proxy(node:, namespace:, file_path:, lines:)
  source = SourceFactory.class_source(node:, file_path:, lines:)
  ClassProxy.new(node:, name: node.name, namespace:, source:)
end

.file_proxy(root_node:, file_path:) ⇒ Object



16
17
18
19
# File 'lib/factories/proxy_factory.rb', line 16

def file_proxy(root_node:, file_path:)
  source = SourceFactory.file_source(root_node:, file_path:)
  FileProxy.new(root_node:, source:)
end

.method_proxy(method_node:, file_proxy:) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/factories/proxy_factory.rb', line 32

def method_proxy(method_node:, file_proxy:)
  name = method_node.name

  method_source = SourceFactory.method_source(method_node:, file_path: file_proxy.file_path, lines: file_proxy.lines)
  body_source = SourceFactory.body_source(method_source:)

  param_proxies = param_proxies(parameters_node: method_node.parameters, file_path: file_proxy.file_path, source: method_source)
  body_proxy = BodyProxy.new(name:, source: body_source)
  return_proxy = return_proxy(name:, method_node:, source: method_source)

  MethodProxy.new(name:, source: method_source, param_proxies:, body_proxy:, return_proxy:)
end

.module_proxy(node:, namespace:, file_path:, lines:) ⇒ Object



21
22
23
24
25
# File 'lib/factories/proxy_factory.rb', line 21

def module_proxy(node:, namespace:, file_path:, lines:)
  source = SourceFactory.module_source(node:, namespace:, file_path:, lines:)
  name = node.respond_to?(:name) ? node.name : 'Object'
  ModuleProxy.new(node:, name:, namespace:, source:)
end

.param_proxies(parameters_node:, source:, file_path:) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/factories/proxy_factory.rb', line 45

def param_proxies(parameters_node:, source:, file_path:)
  return [] if parameters_node.nil?

  param_types = {
    Prism::RequiredParameterNode => :pos_req,
    Prism::OptionalParameterNode => :pos_opt,
    Prism::RequiredKeywordParameterNode => :key_req,
    Prism::OptionalKeywordParameterNode => :key_opt
  }

  params = [*parameters_node.requireds, *parameters_node.optionals, *parameters_node.keywords]
  params.map.with_index do |param, position|
    name = param.name
    source = SourceFactory.param_source(param_node: param, file_path:, lines: source.lines)
    type = param_types[param.class]
    value = param.respond_to?(:value) ? param.value.slice : ':LOWKEY_UNDEFINED'

    ParamProxy.new(name:, source:, type:, position:, value:)
  end
end

.return_proxy(method_node:, name:, source:) ⇒ Object



66
67
68
69
70
71
72
73
# File 'lib/factories/proxy_factory.rb', line 66

def return_proxy(method_node:, name:, source:)
  return_node = find_return_node(method_node:)
  return nil if return_node.nil?

  value = return_node.body.slice

  ReturnProxy.new(name:, source:, value:)
end