Class: I18n::Tasks::Scanners::PrismScanners::Visitor

Inherits:
Prism::Visitor
  • Object
show all
Defined in:
lib/i18n/tasks/scanners/prism_scanners/visitor.rb

Overview

rubocop:disable Metrics/ClassLength

Constant Summary collapse

MAGIC_COMMENT_PREFIX =
/\A.\s*i18n-tasks-use\s+/

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(rails: false, file_path: nil) ⇒ Visitor

Returns a new instance of Visitor.



19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/i18n/tasks/scanners/prism_scanners/visitor.rb', line 19

def initialize(rails: false, file_path: nil)
  @calls = []

  @current_module = nil
  @current_class = nil
  @current_method = nil
  @root = Root.new(file_path:, rails: rails)

  @rails = rails

  # Needs to have () because the Prism::Visitor has no arguments
  super()
end

Instance Attribute Details

#callsObject (readonly)

Returns the value of attribute calls.



17
18
19
# File 'lib/i18n/tasks/scanners/prism_scanners/visitor.rb', line 17

def calls
  @calls
end

#current_classObject (readonly)

Returns the value of attribute current_class.



17
18
19
# File 'lib/i18n/tasks/scanners/prism_scanners/visitor.rb', line 17

def current_class
  @current_class
end

#current_methodObject (readonly)

Returns the value of attribute current_method.



17
18
19
# File 'lib/i18n/tasks/scanners/prism_scanners/visitor.rb', line 17

def current_method
  @current_method
end

#current_moduleObject (readonly)

Returns the value of attribute current_module.



17
18
19
# File 'lib/i18n/tasks/scanners/prism_scanners/visitor.rb', line 17

def current_module
  @current_module
end

#rootObject (readonly)

Returns the value of attribute root.



17
18
19
# File 'lib/i18n/tasks/scanners/prism_scanners/visitor.rb', line 17

def root
  @root
end

Instance Method Details

#parentObject



33
34
35
# File 'lib/i18n/tasks/scanners/prism_scanners/visitor.rb', line 33

def parent
  @current_before_action || @current_method || @current_class || @current_module || @root
end

#processObject



121
122
123
# File 'lib/i18n/tasks/scanners/prism_scanners/visitor.rb', line 121

def process
  @root.process
end

#visit_call_node(node) ⇒ Object



90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/i18n/tasks/scanners/prism_scanners/visitor.rb', line 90

def visit_call_node(node)
  handle_comments(node)

  case node.name
  when :private
    @current_class&.private_methods!
  when :t, :t!, :translate, :translate!
    args, kwargs = process_arguments(node)
    # Do not process other receivers than I18n, e.g. Service.translate(:key)
    return if node.receiver.present? && !i18n_receiver?(node.receiver)
    parent.add_translation_call(
      TranslationCall.new(
        node: node,
        key: args[0],
        receiver: node.receiver,
        options: kwargs,
        parent: parent
      )
    )
  else
    handled_call = handle_rails_call_node(node) { super } if @rails

    return if handled_call

    parent.add_call(node)

  end

  super
end

#visit_class_node(node) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/i18n/tasks/scanners/prism_scanners/visitor.rb', line 55

def visit_class_node(node)
  previous_class = @current_class

  @current_class = parent.add_child(
    ParsedClass.new(
      node: node,
      parent: parent,
      rails: @rails
    )
  )

  handle_comments(node)

  super
ensure
  @current_class = previous_class
end

#visit_def_node(node) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/i18n/tasks/scanners/prism_scanners/visitor.rb', line 73

def visit_def_node(node)
  handle_comments(node)
  previous_method = @current_method
  parent = @current_class || @current_module || @root
  @current_method = parent.add_child(
    ParsedMethod.new(
      node: node,
      parent: parent,
      private_method: parent.private_method
    )
  )

  super
ensure
  @current_method = previous_method
end

#visit_module_node(node) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/i18n/tasks/scanners/prism_scanners/visitor.rb', line 37

def visit_module_node(node)
  previous_module = @current_module
  @current_module = parent.add_child(
    ParsedModule.new(node: node, parent: parent)
  )

  handle_comments(node)

  super
ensure
  @current_module = previous_module
end

#visit_program_node(node) ⇒ Object



50
51
52
53
# File 'lib/i18n/tasks/scanners/prism_scanners/visitor.rb', line 50

def visit_program_node(node)
  handle_comments(node)
  super
end