Class: RubyModKit::Generation

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby_mod_kit/generation.rb

Overview

The class of transpiler generation.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(script, missions: [], memo_pad: nil, generation_num: 0, config: nil, filename: nil, corrector_manager: nil, features: nil) ⇒ void

Parameters:

  • script (String)
  • missions (Array<Mission>) (defaults to: [])
  • memo_pad (MemoPad, nil) (defaults to: nil)
  • generation_num (Integer) (defaults to: 0)
  • config (Config, nil) (defaults to: nil)
  • filename (String, nil) (defaults to: nil)
  • corrector_manager (CorrectorManager, nil) (defaults to: nil)
  • features (Array<Feature>, nil) (defaults to: nil)

rbs:

  • script: String

  • missions: Array

  • memo_pad: MemoPad | nil

  • generation_num: Integer

  • config: Config | nil

  • filename: String | nil

  • corrector_manager: CorrectorManager | nil

  • features: Array | nil

  • return: void



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/ruby_mod_kit/generation.rb', line 48

def initialize(script, missions: [], memo_pad: nil, generation_num: 0, config: nil,
               filename: nil, corrector_manager: nil, features: nil)
  @script = script
  @missions = missions
  @generation_num = generation_num
  @filename = filename
  @config = config || Config.new
  @features = features || @config.features

  @memo_pad = memo_pad || MemoPad.new
  @corrector_manager = corrector_manager || CorrectorManager.new(@features)
  @offset_diff = OffsetDiff.new
  parse_result = Prism.parse(@script)
  @errors = parse_result.errors
  @lines = parse_result.source.lines
  @offsets = parse_result.source.offsets
  @source = @script.dup
  @root_node = Node::ProgramNode.new(parse_result.value)
  init_missions
end

Instance Attribute Details

#errorsObject (readonly)

: Array



26
27
28
# File 'lib/ruby_mod_kit/generation.rb', line 26

def errors
  @errors
end

#linesObject (readonly)

: Array



27
28
29
# File 'lib/ruby_mod_kit/generation.rb', line 27

def lines
  @lines
end

#memo_padObject (readonly)

: MemoPad



24
25
26
# File 'lib/ruby_mod_kit/generation.rb', line 24

def memo_pad
  @memo_pad
end

#offsetsObject (readonly)

: Array



28
29
30
# File 'lib/ruby_mod_kit/generation.rb', line 28

def offsets
  @offsets
end

#root_nodeObject (readonly)

: Node::ProgramNode



25
26
27
# File 'lib/ruby_mod_kit/generation.rb', line 25

def root_node
  @root_node
end

#scriptObject (readonly)

rbs:

  • @script: String

  • @missions: Array

  • @memo_pad: MemoPad

  • @root_node: Node::ProgramNode

  • @offset_diff: OffsetDiff

  • @generation_num: Integer

  • @filename: String | nil

  • @corrector_manager: CorrectorManager

  • @features: Array

  • @config: Config

  • @errors: Array

  • @lines: Array

  • @offsets: Array

  • @source: String



23
24
25
# File 'lib/ruby_mod_kit/generation.rb', line 23

def script
  @script
end

Class Method Details

.resolve(src, filename: nil, config: nil) ⇒ Generation

Parameters:

  • src (String)
  • filename (String, nil) (defaults to: nil)
  • config (Config, nil) (defaults to: nil)

Returns:

rbs:

  • src: String

  • filename: String | nil

  • config: Config | nil

  • return: Generation



228
229
230
231
232
# File 'lib/ruby_mod_kit/generation.rb', line 228

def resolve(src, filename: nil, config: nil)
  generation = Generation.new(src.dup, filename: filename, config: config)
  generation = generation.succ until generation.completed?
  generation
end

Instance Method Details

#[](src_range) ⇒ String

Parameters:

  • src_range (Range<Integer, nil>)

Returns:

  • (String)

rbs:

  • src_range: Range[Integer | nil]

  • return: String



139
140
141
# File 'lib/ruby_mod_kit/generation.rb', line 139

def [](src_range)
  @source[src_range] || raise(RubyModKit::Error, "Invalid range")
end

#[]=(src_offset, length, str) ⇒ String

Parameters:

  • src_offset (Integer)
  • length (Integer)
  • str (String)

Returns:

  • (String)

rbs:

  • src_offset: Integer

  • length: Integer

  • str: String

  • return: String



129
130
131
132
133
# File 'lib/ruby_mod_kit/generation.rb', line 129

def []=(src_offset, length, str)
  diff = str.length - length
  @script[@offset_diff[src_offset], length] = str
  @offset_diff.insert(src_offset, diff)
end

#add_mission(mission) ⇒ void

This method returns an undefined value.

Parameters:

rbs:

  • mission: Mission

  • return: void



215
216
217
# File 'lib/ruby_mod_kit/generation.rb', line 215

def add_mission(mission)
  @missions << mission
end

#completed?Boolean

Returns:

  • (Boolean)

rbs:

  • return: bool



117
118
119
# File 'lib/ruby_mod_kit/generation.rb', line 117

def completed?
  @errors.empty? && @missions.empty?
end

#end_line_offset(node) ⇒ Integer?

Parameters:

Returns:

  • (Integer, nil)

rbs:

  • node: Node::BaseNode

  • return: Integer | nil



182
183
184
# File 'lib/ruby_mod_kit/generation.rb', line 182

def end_line_offset(node)
  line_offset(node.location.end_line - 1)
end

#first_generation?Boolean

Returns:

  • (Boolean)

rbs:

  • return: bool



83
84
85
# File 'lib/ruby_mod_kit/generation.rb', line 83

def first_generation?
  @generation_num == 0
end

#init_missionsvoid

This method returns an undefined value.

rbs:

  • return: void



71
72
73
74
75
76
77
78
79
# File 'lib/ruby_mod_kit/generation.rb', line 71

def init_missions
  return unless first_generation?

  @features.each do |feature|
    feature.create_missions.each do |mission|
      add_mission(mission)
    end
  end
end

#line(*args) ⇒ Object

rbs:

  • (Integer) -> String | (Node::BaseNode) -> String | (Prism::ParseError) -> String



146
147
148
149
150
151
152
153
154
155
156
157
158
159
# File 'lib/ruby_mod_kit/generation.rb', line 146

def line(*args)
  case args
  in [Integer => line_num]
    @lines[line_num] || raise(RubyModKit::Error)
  in [Node::BaseNode => node]
    line(node.location.start_line - 1)
  in [Prism::ParseError => parse_error]
    begin
      line(parse_error.location.start_line - 1)
    rescue RubyModKit::Error
      ""
    end
  end
end

#line_indent(*args) ⇒ Object

rbs:

  • (Integer) -> String | (Node::BaseNode) -> String



188
189
190
191
192
193
194
195
# File 'lib/ruby_mod_kit/generation.rb', line 188

def line_indent(*args)
  case args
  in [Integer => line_num]
    line(line_num)[/\A[ \t]*/] || ""
  in [Node::BaseNode => node]
    line_indent(node.location.start_line - 1)
  end
end

#line_offset(*args) ⇒ Object

rbs:

  • (Integer) -> (Integer | nil) | (Node::BaseNode) -> (Integer | nil) | (Node::BaseNode, Integer) -> (Integer | nil) | (Prism::ParseError) -> (Integer | nil)



165
166
167
168
169
170
171
172
173
174
175
176
# File 'lib/ruby_mod_kit/generation.rb', line 165

def line_offset(*args)
  case args
  in [Integer => line_num]
    @offsets[line_num]
  in [Node::BaseNode => node]
    line_offset(node, 0)
  in [Node::BaseNode => node, Integer => line_offset]
    line_offset(node.location.start_line - 1 + line_offset)
  in [Prism::ParseError => parse_error]
    line_offset(parse_error.location.start_line - 1)
  end
end

#nameString

Returns:

  • (String)

rbs:

  • return: String



111
112
113
# File 'lib/ruby_mod_kit/generation.rb', line 111

def name
  "#{@filename || "(eval)"}[gen #{@generation_num}]"
end

#perform_correctorvoid

This method returns an undefined value.

rbs:

  • return: void



199
200
201
# File 'lib/ruby_mod_kit/generation.rb', line 199

def perform_corrector
  @corrector_manager.perform(self)
end

#perform_missionsvoid

This method returns an undefined value.

rbs:

  • return: void



205
206
207
208
209
# File 'lib/ruby_mod_kit/generation.rb', line 205

def perform_missions
  @missions.delete_if do |mission|
    mission.perform(self) || break
  end
end

#succGeneration

Returns:

rbs:

  • return: Generation



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/ruby_mod_kit/generation.rb', line 89

def succ
  if @errors.empty?
    perform_missions
  else
    perform_corrector
  end
  @memo_pad.succ(@offset_diff)

  Generation.new(
    @script,
    missions: @missions,
    memo_pad: @memo_pad,
    generation_num: @generation_num + 1,
    filename: @filename,
    corrector_manager: @corrector_manager,
    features: @features,
    config: @config,
  )
end