Class: RubyModKit::Generation
- Inherits:
-
Object
- Object
- RubyModKit::Generation
- Defined in:
- lib/ruby_mod_kit/generation.rb
Overview
The class of transpiler generation.
Instance Attribute Summary collapse
-
#errors ⇒ Object
readonly
: Array.
-
#lines ⇒ Object
readonly
: Array.
-
#memo_pad ⇒ Object
readonly
: MemoPad.
-
#offsets ⇒ Object
readonly
: Array.
-
#root_node ⇒ Object
readonly
: Node::ProgramNode.
- #script ⇒ Object readonly
Class Method Summary collapse
Instance Method Summary collapse
- #[](src_range) ⇒ String
- #[]=(src_offset, length, str) ⇒ String
- #add_mission(mission) ⇒ void
- #completed? ⇒ Boolean
- #end_line_offset(node) ⇒ Integer?
- #first_generation? ⇒ Boolean
- #init_missions ⇒ void
- #initialize(script, missions: [], memo_pad: nil, generation_num: 0, config: nil, filename: nil, corrector_manager: nil, features: nil) ⇒ void constructor
- #line(*args) ⇒ Object
- #line_indent(*args) ⇒ Object
- #line_offset(*args) ⇒ Object
- #name ⇒ String
- #perform_corrector ⇒ void
- #perform_missions ⇒ void
- #succ ⇒ Generation
Constructor Details
#initialize(script, missions: [], memo_pad: nil, generation_num: 0, config: nil, filename: nil, corrector_manager: nil, features: nil) ⇒ 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
#errors ⇒ Object (readonly)
: Array
26 27 28 |
# File 'lib/ruby_mod_kit/generation.rb', line 26 def errors @errors end |
#lines ⇒ Object (readonly)
: Array
27 28 29 |
# File 'lib/ruby_mod_kit/generation.rb', line 27 def lines @lines end |
#memo_pad ⇒ Object (readonly)
: MemoPad
24 25 26 |
# File 'lib/ruby_mod_kit/generation.rb', line 24 def memo_pad @memo_pad end |
#offsets ⇒ Object (readonly)
: Array
28 29 30 |
# File 'lib/ruby_mod_kit/generation.rb', line 28 def offsets @offsets end |
#root_node ⇒ Object (readonly)
: Node::ProgramNode
25 26 27 |
# File 'lib/ruby_mod_kit/generation.rb', line 25 def root_node @root_node end |
#script ⇒ Object (readonly)
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
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
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
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.
215 216 217 |
# File 'lib/ruby_mod_kit/generation.rb', line 215 def add_mission(mission) @missions << mission end |
#completed? ⇒ Boolean
117 118 119 |
# File 'lib/ruby_mod_kit/generation.rb', line 117 def completed? @errors.empty? && @missions.empty? end |
#end_line_offset(node) ⇒ Integer?
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
83 84 85 |
# File 'lib/ruby_mod_kit/generation.rb', line 83 def first_generation? @generation_num == 0 end |
#init_missions ⇒ void
This method returns an undefined value.
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
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
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
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 |
#name ⇒ String
111 112 113 |
# File 'lib/ruby_mod_kit/generation.rb', line 111 def name "#{@filename || "(eval)"}[gen #{@generation_num}]" end |
#perform_corrector ⇒ void
This method returns an undefined value.
199 200 201 |
# File 'lib/ruby_mod_kit/generation.rb', line 199 def perform_corrector @corrector_manager.perform(self) end |
#perform_missions ⇒ void
This method returns an undefined value.
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 |
#succ ⇒ 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 |