Class: SyntaxSuggest::ScanHistory
Relationships & Source Files | |
Inherits: | Object |
Defined in: | lib/syntax_suggest/scan_history.rb |
Overview
Scans up/down from the given block
You can try out a change, stash it, or commit it to save for later
Example:
scanner = ScanHistory.new(code_lines: code_lines, block: block)
scanner.scan(
up: ->(_, _, _) { true },
down: ->(_, _, _) { true }
)
scanner.changed? # => true
expect(scanner.lines).to eq(code_lines)
scanner.stash_changes
expect(scanner.lines).to_not eq(code_lines)
Class Method Summary
- .new(code_lines:, block:) ⇒ ScanHistory constructor
Instance Attribute Summary
- #after_index readonly
- #before_index readonly
- #changed? ⇒ Boolean readonly
Instance Method Summary
- #commit_if_changed
- #lines
- #next_down
- #next_up
-
#revert_last_commit
Discard changes that have not been committed and revert the last commit.
-
#scan(up:, down:)
Iterates up and down.
-
#stash_changes
Discards any changes that have not been committed.
-
#after_lines
private
Returns an array of all the CodeLines that exist after the currently scanned block.
- #before_lines private
- #current private
- #refresh_index private
Constructor Details
.new(code_lines:, block:) ⇒ ScanHistory
# File 'lib/syntax_suggest/scan_history.rb', line 24
def initialize(code_lines:, block:) @code_lines = code_lines @history = [block] refresh_index end
Instance Attribute Details
#after_index (readonly)
[ GitHub ]# File 'lib/syntax_suggest/scan_history.rb', line 22
attr_reader :before_index, :after_index
#before_index (readonly)
[ GitHub ]# File 'lib/syntax_suggest/scan_history.rb', line 22
attr_reader :before_index, :after_index
#changed? ⇒ Boolean
(readonly)
[ GitHub ]
Instance Method Details
#after_lines (private)
Returns an array of all the CodeLines that exist after the currently scanned block
# File 'lib/syntax_suggest/scan_history.rb', line 120
private def after_lines @code_lines[@after_index.next..] || [] end
#before_lines (private)
[ GitHub ]# File 'lib/syntax_suggest/scan_history.rb', line 114
private def before_lines @code_lines[0...@before_index] || [] end
#commit_if_changed
[ GitHub ]# File 'lib/syntax_suggest/scan_history.rb', line 30
def commit_if_changed if changed? @history << CodeBlock.new(lines: @code_lines[before_index..after_index]) end self end
#current (private)
[ GitHub ]# File 'lib/syntax_suggest/scan_history.rb', line 124
private def current @history.last end
#lines
[ GitHub ]# File 'lib/syntax_suggest/scan_history.rb', line 110
def lines @code_lines[@before_index..@after_index] end
#next_down
[ GitHub ]# File 'lib/syntax_suggest/scan_history.rb', line 104
def next_down return nil if @after_index >= @code_lines.length @code_lines[@after_index + 1] end
#next_up
[ GitHub ]# File 'lib/syntax_suggest/scan_history.rb', line 98
def next_up return nil if @before_index <= 0 @code_lines[@before_index - 1] end
#refresh_index (private)
[ GitHub ]#revert_last_commit
Discard changes that have not been committed and revert the last commit
Cannot revert the first commit
# File 'lib/syntax_suggest/scan_history.rb', line 47
def revert_last_commit if @history.length > 1 @history.pop refresh_index end self end
#scan(up:, down:)
Iterates up and down
Returns line, kw_count, end_count for each iteration
# File 'lib/syntax_suggest/scan_history.rb', line 64
def scan(up:, down:) kw_count = 0 end_count = 0 up_index = before_lines.reverse_each.take_while do |line| kw_count += 1 if line.is_kw? end_count += 1 if line.is_end? up.call(line, kw_count, end_count) end.last&.index kw_count = 0 end_count = 0 down_index = after_lines.each.take_while do |line| kw_count += 1 if line.is_kw? end_count += 1 if line.is_end? down.call(line, kw_count, end_count) end.last&.index @before_index = if up_index && up_index < @before_index up_index else @before_index end @after_index = if down_index && down_index > @after_index down_index else @after_index end self end
#stash_changes
Discards any changes that have not been committed
# File 'lib/syntax_suggest/scan_history.rb', line 39
def stash_changes refresh_index self end